• <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>

            我住包子山

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

            VC++編程內(nèi)幕學(xué)習(xí)心得(2)--上

            第六章 GDI,字體,位圖

            第五章的例子就有簡單的CDC類型的應(yīng)用

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

            只有改寫視圖類的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.這些對象構(gòu)造方法有的直接定義就算構(gòu)造成功,有的需要定義完之后進(jìn)一步調(diào)用創(chuàng)建函數(shù).

            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
            關(guān)于GDI對象有效期,書中提到打印機(jī)和內(nèi)存緩沖區(qū)等設(shè)備環(huán)境,如果只是在類中用一個成員變量指針保存GDI對象指針是不穩(wěn)妥的,如果需要讓一個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對象選用的字體配置的句柄,恢復(fù)的代碼如下

            void CCDCcreateView::SwitchToOldFont(CDC* pDC)

            {

                if(m_hOldFont)

                {

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

                }//調(diào)用CFont類型的FromHandle靜態(tài)成員函數(shù)

            }

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

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

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

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

            關(guān)于顯示器邏輯英寸和物理英寸,CDC成員函數(shù)GetDeviceCaps可以得到這些顯示參數(shù)

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

            書上介紹了邏輯twips設(shè)置,

            pDC->SetMapMode(MM_ANISOTROPIC);

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

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

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

            仔細(xì)體會一下兩種twips映射,確實(shí)有所不同,邏輯的twips隨分辨率增大高越變越小,而標(biāo)準(zhǔn)twips映射大小不變,無論分辨率咋變.

            下面就是本章第一個例子

            我稍做了點(diǎn)改動

            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: 在此處為本機(jī)數(shù)據(jù)添加繪制代碼

            }

            執(zhí)行結(jié)果有點(diǎn)奇怪,CreateFont的高度用負(fù)數(shù)比用正數(shù)大一些..

            其實(shí)書上有寫,CreateFont的第一個參數(shù)

            (tmHeight – tmInternalLeading)(-數(shù)) = tmHeight(+數(shù)),如圖

             clip_image001

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

                                           gohan made 11.26

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

            999久久久免费精品国产| 国产精品福利一区二区久久| 精品国产91久久久久久久| 久久99九九国产免费看小说| 久久99精品国产麻豆蜜芽| 久久精品国产一区二区三区日韩| 久久综合狠狠综合久久综合88| 中文成人无码精品久久久不卡 | 国产精品一区二区久久精品无码| 国产精品国色综合久久| 久久天天躁狠狠躁夜夜avapp| 久久亚洲精品中文字幕| 久久久无码精品亚洲日韩蜜臀浪潮| 亚洲精品国精品久久99热一| 亚洲色婷婷综合久久| 久久久久亚洲精品无码蜜桃| 日韩av无码久久精品免费| 久久国产色AV免费观看| 蜜桃麻豆www久久| 99久久亚洲综合精品成人| 精品久久久久久无码中文字幕| 九九热久久免费视频| 亚洲国产成人久久一区久久| 亚洲综合久久久| 久久无码人妻一区二区三区午夜| 99精品久久精品一区二区| 国产精品狼人久久久久影院| 久久久亚洲精品蜜桃臀| 麻豆久久久9性大片| 久久久久久国产精品免费无码| 亚洲国产精品久久久久婷婷老年 | 无码任你躁久久久久久久| 久久国产精品无| 国产高潮国产高潮久久久| 国产成人精品久久一区二区三区av | 伊人久久大香线蕉精品不卡| 三上悠亚久久精品| 精品久久久无码中文字幕| 久久久久亚洲AV成人网人人网站 | 99久久精品无码一区二区毛片| 日韩十八禁一区二区久久|