青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

我住包子山

this->blog.MoveTo("blog.baozishan.in")

VC++編程內幕學習心得(2)--上

第六章 GDI,字體,位圖

第五章的例子就有簡單的CDC類型的應用

這次更加詳細的總結了設備環境類型及其應用
常用類型CClientDCCWindowDC,算做顯示設備
函數 CDC::GetClipBox(LPRECT lpRect)能夠獲取當前操作dc可見的區域矩形吧,我大概這樣子理解.當然,映射模式不同的情況得到的值也不一樣,是邏輯坐標單位

只有改寫視圖類的OnPaint類時才會用CPaintDC

GDI對象有許多

·         CBitmap  A bitmap is an array of bits in which one or more bits correspond to each display pixel. You can use bitmaps to represent images or to create brushes.

·         CBrush  A brush defines a bitmapped pattern of pixels that is used to fill areas with color.

·         CFont  A font is a complete collection of characters of a particular typeface and a particular size. Fonts are generally stored on disk as resources, and some are device-specific.

·         CPalette  A palette is a color-mapping interface that allows an application to take full advantage of the color capability of an output device without interfering with other applications.

·         CPen  A pen is a tool for drawing lines and shape borders. You can specify a pen’s color and thickness and whether it draws solid, dotted, or dashed lines.

·         CRgn  A region is an area whose shape is a polygon, an ellipse, or a combination of polygons and ellipses. You can use regions for filling, clipping, and mouse hit-testing.

這些對象都是派生自CGdiObject.這些對象構造方法有的直接定義就算構造成功,有的需要定義完之后進一步調用創建函數.

void CCDCcreateView::OnDraw(CDC* pDC)

{

    pDC->TextOut(0,0,m_szStr);

    CPen newPen(PS_ALTERNATE,1,RGB(0,255,0));

    CPen* pOldPen = pDC->SelectObject(&newPen);

    for(int i=0;i<=100;i+=10)

    {

        pDC->MoveTo(i,0);pDC->LineTo(i,100);

        pDC->MoveTo(0,i);pDC->LineTo(100,i);

    }//畫格子100*100,一個格子為9*9

    CCDCcreateDoc* pDoc = GetDocument();

    pDC->SelectObject(pOldPen);

    ASSERT_VALID(pDoc);

    if (!pDoc)

        return;

}

出了自建GDI對象還有庫存GDI對象(StockObject)

使用CDC::SelectStockObject方法選取

比如: pDC->SelectStockObject(BLACK_PEN);

其他的庫存對象都可以去查MSDN
關于GDI對象有效期,書中提到打印機和內存緩沖區等設備環境,如果只是在類中用一個成員變量指針保存GDI對象指針是不穩妥的,如果需要讓一個GDI對象保持有效性,需要保存一個GetSafeHandle()返回的一個句柄..書中的例子:

void CCDCcreateView::SwitchToCourier(CDC* pDC)

{

    m_pPrintFont->CreateFont(30,10,0,0,400,FALSE,FALSE,

        0,ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,

        DEFAULT_QUALITY,DEFAULT_PITCH | FF_MODERN,

        TEXT("Courier New")); //TrueType

    CFont* pOldFont = pDC->SelectObject(m_pPrintFont);

    m_hOldFont = (HFONT) pOldFont->GetSafeHandle();

}

m_hOldFont保存了之前CDC對象選用的字體配置的句柄,恢復的代碼如下

void CCDCcreateView::SwitchToOldFont(CDC* pDC)

{

    if(m_hOldFont)

    {

        pDC->SelectObject(CFont::FromHandle(m_hOldFont));

    }//調用CFont類型的FromHandle靜態成員函數

}

大概你應該會跟我一樣對于CreateFont這樣非常多的參數感到不知所措,那么請繼續往下看,從頭開始講解字體對象

GDI對象中包括字體對象,字體對象跟其他GDI對象在行為上都一樣.

windows中字體有兩種,一種是TrueType字體跟設備無關,另一種和設備相關.System字體還有什么LinePrinter字體啥的.如果要讓字體以磅這個單位顯示或者打印,需要使用MM_TWIPS映射模式,1 = 1/72 英寸 = 20 MM_TWIPS邏輯單位(1/1440英寸)

書上說實現打印和顯示得到精確的匹配很不容易做到,只有MM_TEXT的映射下,顯示和打印才能夠得到精確匹配,具體我不了解,以后實踐再說,現在還用不到打印

關于顯示器邏輯英寸和物理英寸,CDC成員函數GetDeviceCaps可以得到這些顯示參數

參數:HORZSIZE 物理寬度(mm),VERTSIZE物理高度(mm),HORZERES像素寬度,VERTRES像素高度(光柵行數),LOGPIXELSX,LOGPIXELSY,每邏輯英寸水平/垂直像素數

書上介紹了邏輯twips設置,

pDC->SetMapMode(MM_ANISOTROPIC);

pDC->SetWindowExt(1440,1440);//個人認為這個比例可以任意,只是個比例,大小自己愛好吧

pDC->SetViewportExt(pDC->GetDeviceCaps(LOGPIXELSX),-pDC->GetDeviceCaps(LOGPIXELSY));

這三句話就設置成了邏輯twips,這個用來穩定字體比例,邏輯英寸水平/垂直的像素數決定了顯示字體的大小,注意的是默認的system字體固定了尺寸,不能根據邏輯像素值來調整大小TrueType可以調整;

仔細體會一下兩種twips映射,確實有所不同,邏輯的twips隨分辨率增大高越變越小,而標準twips映射大小不變,無論分辨率咋變.

下面就是本章第一個例子

我稍做了點改動

void CfontView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)

{

    pDC->SetMapMode(MM_ANISOTROPIC);

pDC->SetWindowExt(1440,1440);

pDC->SetViewportExt(pDC->GetDeviceCaps(LOGPIXELSX),-pDC->GetDeviceCaps(LOGPIXELSY));

    //pDC->SetMapMode(MM_TWIPS);

    CView::OnPrepareDC(pDC, pInfo);

}

void CfontView::ShowFont(CDC* pDC, int& nPos, int nPoints)

{

    TEXTMETRIC tm;

    CFont fontText;

    CString strText;

    CSize sizeText;

 

    fontText.CreateFont(nPoints * 20, 0, 0, 0, 400,FALSE,FALSE,0,

        ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,TEXT("Arial"));

    CFont *pOldFont = /*(CFont*)*/pDC->SelectObject(&fontText);

    pDC->GetTextMetrics(&tm);

    TRACE("nPoints = %d, tmHeight = %d, tmInternalLeading = %d,"

      " tmExternalLeading = %d\n", nPoints, tm.tmHeight, tm.tmInternalLeading, tm.tmExternalLeading);

    strText.Format(TEXT("http://www.shnenglu.com/ withs %d-point"),nPoints);

    sizeText = pDC->GetTextExtent(strText);

    TRACE("width = %d, string height = %d\n", sizeText.cx, sizeText.cy);

    pDC->TextOut(0, nPos, strText);

    nPos-=tm.tmHeight + tm.tmExternalLeading;

    fontText.DeleteObject();

    fontText.CreateFont(-nPoints * 20, 0, 0, 0, 400,FALSE,FALSE,0,        ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,        DEFAULT_PITCH|FF_SWISS,TEXT("Arial"));

   /* CFont *pOldFont = *//*(CFont*)*/pDC->SelectObject(&fontText);

    pDC->GetTextMetrics(&tm);

TRACE("nPoints = %d, tmHeight = %d, tmInternalLeading = %d,"

" tmExternalLeading = -%d\n", nPoints, tm.tmHeight, tm.tmInternalLeading, tm.tmExternalLeading);

    strText.Format(TEXT("http://www.shnenglu.com/ withs %d-point minus Points"),nPoints);

    sizeText = pDC->GetTextExtent(strText);

    TRACE("width = %d, string height = %d\n", sizeText.cx, sizeText.cy);

    pDC->TextOut(0, nPos, strText);

    pDC->SelectObject(pOldFont);

    nPos-=tm.tmHeight + tm.tmExternalLeading;

}

void CfontView::OnDraw(CDC* pDC)

{

    int nPos = 0;

    for(int i=6; i<=24; i+=2)

    {

        ShowFont(pDC, nPos, i);

    }

    CfontDoc* pDoc = GetDocument();

    ASSERT_VALID(pDoc);

    if (!pDoc)

        return;

    // TODO: 在此處為本機數據添加繪制代碼

}

執行結果有點奇怪,CreateFont的高度用負數比用正數大一些..

其實書上有寫,CreateFont的第一個參數

(tmHeight – tmInternalLeading)(-) = tmHeight(+),如圖

 clip_image001

獲得一個DC的字體高度信息可以傳TEXTMETRIC結構指針到DC函數GetTextMetrics,這時的TEXTMETRIC結構就有圖上的這些信息了~~晚上忙了半天,就寫了這么多..就到這里.

                               gohan made 11.26

posted on 2007-11-26 21:46 Gohan 閱讀(2569) 評論(0)  編輯 收藏 引用 所屬分類: MFC/SDK

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久久网站| 久久久久五月天| 亚洲毛片视频| 欧美日韩在线播放一区| 亚洲午夜视频在线| 一本大道久久a久久综合婷婷 | 久久精品国产综合精品| 欧美伊人久久大香线蕉综合69| 国产欧美一区二区精品婷婷 | 久久激情网站| 久久人人超碰| 一级日韩一区在线观看| 亚洲天堂偷拍| 伊大人香蕉综合8在线视| 亚洲国产欧美久久| 国产精品日韩二区| 蜜臀久久久99精品久久久久久| 欧美精品在线一区二区| 欧美中文字幕在线视频| 免费看的黄色欧美网站| 亚洲欧美日韩综合aⅴ视频| 欧美伊人久久| 这里只有精品视频| 久久久99久久精品女同性 | 国产精品热久久久久夜色精品三区 | 欧美在线视频不卡| 亚洲精品视频一区二区三区| 在线中文字幕日韩| 亚洲黄色成人久久久| 亚洲视频一区| 亚洲国产精品尤物yw在线观看| 亚洲麻豆av| 亚洲国产精品t66y| 亚洲男人的天堂在线观看| 最新国产成人av网站网址麻豆 | 亚洲经典在线看| 韩曰欧美视频免费观看| 日韩亚洲欧美中文三级| 激情亚洲网站| 亚洲自拍偷拍视频| 久久九九国产精品| 午夜精品在线观看| 欧美午夜精品久久久久免费视| 久久午夜国产精品| 国产精品久久久久毛片软件| 久久精品论坛| 香蕉久久a毛片| 国产日韩在线播放| 亚洲性人人天天夜夜摸| 久久久精品免费视频| 亚洲欧美变态国产另类| 欧美成人中文字幕| 欧美91视频| 国产一区二区在线免费观看| 中文在线一区| 亚洲夜间福利| 欧美久色视频| 亚洲精品久久7777| 亚洲精品一区二区三区樱花| 狂野欧美一区| 亚洲国产成人不卡| 亚洲国产精品视频一区| 久久综合五月| 欧美电影免费观看高清| 亚洲福利av| 噜噜噜躁狠狠躁狠狠精品视频 | 国产伪娘ts一区| 亚洲欧美中文日韩v在线观看| 亚洲综合精品自拍| 国产精品乱人伦中文| 亚洲一区二区三区激情| 午夜精品国产更新| 国产亚洲欧洲一区高清在线观看 | 一本色道久久| 欧美一级电影久久| 国产一区二区三区不卡在线观看| 欧美一级午夜免费电影| 久久婷婷丁香| 亚洲国产一区在线观看| 欧美电影免费| 一本色道久久综合狠狠躁篇怎么玩 | 久久久久综合一区二区三区| 韩国成人精品a∨在线观看| 久久久777| 91久久精品国产91久久| 亚洲视频欧洲视频| 国产精品夜夜夜| 久久久久国产一区二区| 91久久久一线二线三线品牌| 亚洲天天影视| 国产视频欧美| 欧美福利电影网| 亚洲一区二区三区在线看| 久久另类ts人妖一区二区| 亚洲欧洲一区二区三区久久| 欧美特黄一区| 久久久亚洲国产天美传媒修理工| 亚洲经典自拍| 久久久久久电影| 亚洲精品在线一区二区| 国产精品日韩一区| 免费看亚洲片| 亚洲欧美日韩一区二区在线 | 欧美一级欧美一级在线播放| 欧美国产日本高清在线| 午夜精品久久久99热福利| 激情成人av在线| 国产精品99免费看 | 国产午夜精品全部视频播放| 免费欧美日韩| 欧美主播一区二区三区美女 久久精品人 | 一本色道久久| 欧美二区在线| 久久久91精品国产一区二区精品| 99re8这里有精品热视频免费| 国产一级精品aaaaa看| 欧美日韩不卡一区| 久久这里有精品视频| 亚洲欧美国产另类| 国产精品久久久久毛片软件| 久久夜色精品国产亚洲aⅴ| 亚洲一区国产一区| 亚洲精品一区二区三| 欧美大色视频| 麻豆精品一区二区综合av| 欧美亚洲一级片| 亚洲一区国产视频| 亚洲人成在线播放| 亚洲大胆人体在线| 好吊日精品视频| 国产一区二区久久久| 国产精品一区久久| 国产精品女主播在线观看| 欧美日韩国产限制| 欧美精品一区在线播放| 欧美成人午夜激情在线| 久久亚洲精品一区二区| 久久嫩草精品久久久精品一| 久久精品国产久精国产爱| 香蕉国产精品偷在线观看不卡| 亚洲视频碰碰| 亚洲在线不卡| 午夜精品久久久久久| 午夜激情综合网| 欧美一区二区视频在线观看2020| 亚洲在线视频| 欧美一区二区三区久久精品 | 欧美成年视频| 欧美激情第三页| 亚洲激情视频网站| 99re视频这里只有精品| 一区二区欧美亚洲| 亚洲一区日韩| 久久国产精品亚洲77777| 久久精品女人| 欧美电影电视剧在线观看| 欧美美女bb生活片| 国产精品福利在线| 国产日韩欧美一区二区三区四区| 国产日韩在线不卡| 亚洲第一在线综合网站| 一本久久综合亚洲鲁鲁五月天| 日韩一区二区精品在线观看| 亚洲午夜久久久久久久久电影院| 亚洲免费在线播放| 久久看片网站| 国产精品久久久999| 国产偷久久久精品专区| 亚洲黄一区二区三区| 亚洲视频一区在线| 久久精品中文字幕免费mv| 欧美aⅴ99久久黑人专区| 亚洲美女淫视频| 欧美一区二区三区播放老司机| 久久伊人亚洲| 国产精品久久久免费| 国内精品国语自产拍在线观看| 亚洲三级视频在线观看| 亚洲欧美日韩系列| 米奇777在线欧美播放| 日韩一级黄色片| 久久日韩粉嫩一区二区三区| 欧美日韩精选| 在线观看亚洲一区| 午夜精品一区二区在线观看| 免费欧美视频| 亚洲欧美日韩系列| 欧美精品一区在线发布| 狠狠久久婷婷| 亚洲综合社区| 亚洲激情在线视频| 久久久亚洲欧洲日产国码αv| 欧美日韩中文字幕日韩欧美| 精品av久久久久电影| 性欧美办公室18xxxxhd| 亚洲精品免费在线播放| 久久蜜桃资源一区二区老牛 | 国产精品永久| 亚洲综合好骚| 亚洲精品免费在线|