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

            千張筆記

            Email:rain_qian830@163.com
            posts - 28, comments - 42, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            第五章 圖形基礎(chǔ)

            圖形設(shè)備接口(GDI:Graphics Device Interface)是Windows的子系統(tǒng),它負(fù)責(zé)在視頻顯示器和打印機上顯示圖形。GDI的主要目的之一是支持與設(shè)備無關(guān)的圖形。Windows程序應(yīng)該能毫無困難地在Windows支持的任意一種圖形輸出設(shè)備上運行,GDI通過將您的程序和不同輸出設(shè)備的特性隔離開來的方法來達到這一目的。

            <1> GDI函數(shù)調(diào)用
            組成GDI的幾百個函數(shù)課分為幾個大類:
            1.獲取和釋放設(shè)備描述表的函數(shù)
            2.獲取有關(guān)設(shè)備描述表信息的函數(shù)
            3.繪圖函數(shù)
            4.設(shè)置和獲取設(shè)備描述表參數(shù)的函數(shù)
            5.使用GDI對象的函數(shù)

            GDI圖元:直線和曲線;填充區(qū)域;位圖;文本。
            GDI的其他方面:映射模式和變換;元文件;區(qū)域;路徑;剪裁;調(diào)色板;打印。

            可用GetDeviceCaps函數(shù)獲得設(shè)備描述表信息。

            <2> 關(guān)于色彩
            "全色"視頻顯示器的分辨率是每個像素24位-8位紅色、8位綠色、8位藍色。
            "高彩色"顯示分辨率是每個像素16位-5位紅色、6位綠色、5位藍色。
            256色的視頻適配器使用色彩調(diào)色板。在大多數(shù)GDI函數(shù)調(diào)用中,使用COLORREF值來表示一種色彩。COLORREF值按照紅、綠和藍色的亮度指定了一種顏色,通常叫做"RGB色彩"。
            在16位或256色視頻適配器上,Windows可以使用"抖動"來模擬設(shè)備能夠顯示的顏色之外的色彩。抖動利用了由多種色彩的像素組成的像素圖案。可以調(diào)用GetNearestColor來決定與某一色彩最接近的純色。

            <3>保存設(shè)備描述表
            wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;在窗口風(fēng)格中加入CS_OWNDC,則基于這個窗口類所創(chuàng)建的每個窗口都將擁有自己的設(shè)備描述表,它一直存在,直到窗口被刪除。如果使用了CS_OWNDC風(fēng)格,就只需初始化設(shè)備描述表一次,可以在處理WM_CREATE消息期間完成這一操作:
            case WM_CREATE:
                 hdc=GetDC(hwnd);
                 [initialize device context attributes]
                 ReleaseDC(hwnd,hdc);
            CS_OWNDC風(fēng)格只影響GetDC和BeginPaint獲得的設(shè)備描述表,不影響其他函數(shù)獲得的設(shè)備描述表。(如GetWindowDC)
            SaveDC函數(shù)可保存改變屬性之后的hdc,RestoreDC函數(shù)可恢復(fù)調(diào)用SaveDC前存在的hdc。

            <4> 畫點和線
            1.寫像素
            Windows GDI包含了SetPixel和GetPixel來設(shè)置像素和獲得某點像素值。
            2.直線
            Windows可以畫直線、橢圓線和貝塞爾樣條,Windows NT支持的畫線函數(shù):
            LineTo:畫直線
            Polyline和PolylineTo:畫一系列相連的線
            PolyPolyline:畫多組相連的線
            Arc:畫橢圓線
            PolyBezier和PolyBezierTo:畫貝塞爾樣條
            ArcTo和AngleArc:畫橢圓線
            PolyDraw:畫一系列相連的線以及貝塞爾樣條

            下面為既畫線也能填充所畫圖形的封閉區(qū)域的函數(shù):
            Rectangle:畫矩形
            Ellipse:畫橢圓
            RoundRect:畫帶圓角的矩形
            Pie:畫橢圓的一部分,使其看起來像一個扇形
            Chord:畫橢圓的一部分,以呈弓形。
            設(shè)備描述表的五個屬性影響著用這些函數(shù)所畫線的外觀:當(dāng)前畫筆的位置、畫筆、背景方式、背景色和繪圖模式。

            MoveToEx和LineTo畫線
            GetCurrentPositionEx獲得當(dāng)前位置

            貝塞爾樣條:一條二維ideas貝塞爾樣條由4個點定義-兩個端點和兩個控制點。曲線的端點在兩個端點上,控制點就像磁石一樣把曲線從兩個端點間的直線處拉走。

            <5> 畫筆的創(chuàng)建、選擇和刪除
            HPEN hPen;
            hPen=GetStockObject(WHITE_PEN);
            SelectObject(hdc,hPen);
            如上,獲得畫筆句柄,并把該句柄選進設(shè)備描述表后才能使用這個畫筆。SelectObject的返回值是此調(diào)用前設(shè)備描述表中的畫筆句柄。

            邏輯畫筆是一種GDI對象,它是您可以創(chuàng)建的6種GDI對象之一,其他5種是刷子、位圖、區(qū)域、字體和調(diào)色板。除了調(diào)色板之外,這些對象都是通過SelectObject選進設(shè)備描述表的。

            在使用畫筆等等GDI對象時,應(yīng)該遵循三條規(guī)則:
            1.最后要刪除自己創(chuàng)建的所有GDI對象;
            2.當(dāng)GDI對象正在一個有效的設(shè)備描述表中時,不要刪除它;
            3.不要刪除現(xiàn)有對象。

            CreatePen和CreatePenIndirect函數(shù)可以創(chuàng)建自己的畫筆,如:
            static HPEN hPen;
            hPen=CreatePen(PS_SOLID,1,0);
            SelectObject(hdc,hPen);
            [line-drawing functions]
            然后可在WM_DESTROY期間,DeleteObject(hPen);若在WM_PAINT消息期間創(chuàng)建畫筆,也可在EndPaint之前或之后刪除畫筆。

            <6> 畫刷
            Windows有五個函數(shù),可以創(chuàng)建邏輯畫刷,然后可用SelectObject將其選進設(shè)備描述表。
            CreateSolidBrush
            CreateHatchBrush
            CreatePatternBrush
            CreateDIBPatternBrushPt
            CreateBrushIndirect

            <7> 設(shè)備坐標(biāo)和邏輯坐標(biāo)
            映射方式定義了Windows如何將GDI函數(shù)中指定的邏輯坐標(biāo)映射為設(shè)備坐標(biāo),這里的設(shè)備坐標(biāo)系取決于您用哪個函數(shù)來獲得設(shè)備描述表。

            GetClientRect(hwnd,&rect); //獲得客戶區(qū)大小,為設(shè)備單位
            DPtoLP(hdc,(POINT)&rect,2); //將設(shè)備坐標(biāo)轉(zhuǎn)換成邏輯坐標(biāo)

            LPtoDP(hdc,pPoints,iNumber);將邏輯點轉(zhuǎn)換成設(shè)備點。

            <8> 矩形、區(qū)域和裁剪
            FillRect:用指定的畫刷填充矩形,不需要先將畫刷選進設(shè)備描述表
            FrameRect:使用畫刷畫矩形框,但是不填充矩形
            InvertRect:將矩形中所有像素翻轉(zhuǎn),1換成0,0換成1

            PeekMessage(&msg,NULL,0,0,PM_REMOVE)可將消息從消息隊列中刪除,如果不希望刪除消息,那最后一個參數(shù)課設(shè)置成PM_NOREMOVE。當(dāng)消息隊列中有一個消息時,PeekMessage返回TRUE,并按通常方式處理消息,當(dāng)隊列中沒消息,則返回FALSE。
            while(TRUE)
            {
                  if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                  {
                          if(msg.message==WM_QUIT)
                          break;
                          TranslateMesage(&msg);
                          DispatchMessage(&msg);
                   }
                   else
                   {
                         [other program lines to do some work]
                   }
            }

            CreateRectRgn:創(chuàng)建矩形區(qū)域
            CreateEllipticRgn:創(chuàng)建橢圓區(qū)域
            CreateRoundRectRgn:創(chuàng)建圓角的矩形區(qū)域
            CreatePolygonRgn:創(chuàng)建多邊形區(qū)域
            CombineRgn:將兩個源區(qū)域組合起來

            SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL)將原點設(shè)置到客戶區(qū)的中心。


             PS:下面兩個鏈接講述GetDC和BeginPaint的區(qū)別
            http://www.quanxue.cn/JC_CLanguage/Sdk/Sdk06.html
            http://hi.baidu.com/joyeep/blog/item/d60c9351daabed19367abeaf.html

            Feedback

            # re: 【原】《Windows程序設(shè)計》第五章學(xué)習(xí)筆記  回復(fù)  更多評論   

            2008-12-19 19:51 by coast
            筆記做得還蠻仔細的.我一直都不太會做筆記,向你學(xué)習(xí).
            久久成人国产精品| 久久久精品日本一区二区三区 | 久久久久国产精品嫩草影院| 日韩欧美亚洲国产精品字幕久久久| 亚洲国产成人久久综合区| 久久国产精品成人影院| 国产精品欧美久久久久无广告| 亚洲精品午夜国产va久久 | 国产精久久一区二区三区| 亚洲а∨天堂久久精品| 国产精品一久久香蕉国产线看观看| 国产午夜精品久久久久九九电影| 中文无码久久精品| 久久人妻少妇嫩草AV无码蜜桃| 久久99亚洲网美利坚合众国| 久久精品国产99久久久香蕉| 久久99国产精品99久久| 久久频这里精品99香蕉久| 国产综合精品久久亚洲| 久久久久久亚洲精品成人| 久久久久av无码免费网| 亚洲国产成人精品女人久久久 | 久久国产乱子精品免费女| 7777久久久国产精品消防器材| 久久www免费人成看国产片| 99久久无色码中文字幕| 精品久久久久久无码专区不卡| 久久婷婷色综合一区二区| 热综合一本伊人久久精品| 国产精品va久久久久久久| 久久香蕉国产线看观看乱码| 99久久精品国内| 九九精品99久久久香蕉| 午夜天堂av天堂久久久| 色综合久久久久无码专区| 少妇内射兰兰久久| 久久国产热精品波多野结衣AV| 久久偷看各类wc女厕嘘嘘| 欧美黑人又粗又大久久久| 亚洲国产精品无码久久久蜜芽| 国产成人精品综合久久久久|