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

            Jiang's C++ Space

            創(chuàng)作,也是一種學(xué)習(xí)的過(guò)程。

               :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::

            【20060307發(fā)表于blog.csdn.net,20090403重編輯】

            1、GDI名字的意義
            GDI Graphic Device Interface,我說(shuō)不清和GUI有什么區(qū)別。可能一種針對(duì)設(shè)備,一種針對(duì)用戶而言吧,反正以后都說(shuō)GDI,也就是Windows的圖形編程。

            2、設(shè)備描述上下文HDC
            Handle Device Context
            這個(gè)是關(guān)鍵的關(guān)鍵,可以理解成畫圖的環(huán)境,何謂環(huán)境?畫板,紙,筆,尺寸,字體,顏色,區(qū)域等。反正包括你能想到的和未能想到的了。要畫出不同的圖形,很大程度上是對(duì)HDC的修改。

            3、HDC的創(chuàng)建方式
            WM_PAINT消息來(lái)的時(shí)候,用:

            hdc = BeginPaint(hwnd, &ps);
            //...
            EndPaint(hwnd, &ps);

            結(jié)束后ps區(qū)域自動(dòng)變有效。還有:

            hdc = GetDC(hwnd);
            //...
            ReleaseDC(hwnd, hdc);

            這一對(duì)需要調(diào)用ValidateRect()函數(shù)來(lái)使得區(qū)域有效。

            還有別的辦法,但不常用,這里略過(guò)。不過(guò)有一個(gè)還是值得一說(shuō),那就是取得Window HDC的辦法,用它可以在Windows非客戶區(qū)畫圖:

            hdcWindow = GetWindowDC(hwnd);
            //...
            ReleaseDC(hwnd, hdcWindow);


            4、獲取HDC信息
            GetDeviceCaps()
            其中比較重要的指標(biāo)是:
            HORZRES - horizontal resolution
            VERTRES - vertical resolution
            BITSPIXEL - 色深

            5、保存HDC與還原HDC

            SaveDC(hdc);
            RestoreDC(hdc, 
            -1);


            6、畫圖畫圖!

            //[偽碼]

            // ----- 點(diǎn) -----
            //畫點(diǎn)
            SetPixel(hdc, x, y, crColor);
            //取點(diǎn)顏色
            crColor = GetPixel(hdc, x, y);

            // ----- 直線 -----
            //最后一參數(shù)為NULL表示不返回最后點(diǎn)
            MoveToEx(hdc, x, y, lpPrevPoint);
            //畫線
            LineTo(hdc, x, y);
            //畫多線,不移動(dòng)當(dāng)前點(diǎn)
            Polyline(hdc, lpPoint, cPointNum);
            //畫多線,移動(dòng)當(dāng)前點(diǎn)
            PolylineTo(hdc, lpPoint, cPointNum);
            //畫多組多線
            PolyPolyline(hdc, lppt, lpNum, cCount);

            //----- 曲線 -----
            //畫橢圓線
            Arc();
            //畫比澤爾曲線,不移動(dòng)但前點(diǎn)
            PolyBezier();
            //畫比澤爾曲線,移動(dòng)當(dāng)前點(diǎn)
            PolyBezierTo();

            //----- 區(qū)域 -----
            //畫矩形
            Rectangle();
            //畫橢圓
            Ellipse();
            //畫帶圓角的矩形
            RoundRect();
            //畫扇
            Pie();
            //畫弓
            Chord();


            7、畫筆HPEN(改變線條)
            方法1:
            HPEN hPen = GetStockObject(ARGUMENTS);
            ARGUMENTS為:BLACK_PEN 黑筆WHITE_PEN 白筆

            HPEN hPen = SelectObject(hdc, GetStockObject(WHITE_PEN));
            DelectObject(hPen);

            方法2:
            HPEN hPen = CreatePen(iPenStyle, iWidth, crColor);
            iPenStyle為:PS_SOLID實(shí)線PS_DASH虛線PS_DOT點(diǎn)線PS_DASHDOT虛點(diǎn)線PS_DASHDOTDOT虛雙點(diǎn)線PS_NULL空線PS_INSIDEFRAME??

            DeleteObject(SelectObject(hdc, GetStockObject(BLACK_PEN)));

            獲取畫筆信息:

            GetObject(hPen, sizeof(LOGPEN), (LPVOID)&logpen);

            選出HDC中的畫筆:

            hPen = GetCurrentObject(hdc, OBJ_PEN);


            8、背景模式
            改變背景模式,也就是制定虛線間間隙的填充問(wèn)題了:

            SetBkColor(hdc, crColor);
            SetBkMode(hdc, TRANSPARENT);
            SetBkMode(hdc, OPAQUE);

            有Set嘛,相應(yīng)地有Get了,這里略過(guò)。

            9、疊加模式

            SetROP2(hdc, iDrawMode);
            iDrawMode 
            = GetROP2(hdc);


            10、畫刷HBRUSH(改變填充)
            畫刷能指明區(qū)域填充模式。
            方法1:

            HBRUSH hBrush = GetStockObject(GRAY_BRUSH);
            SelectObject(hdc, hBrush);

            方法2:

            HBRUSH hBrush = CreateSolidBrush(crColor);
            HBRUSH hBrush 
            = CreateHatchBrush(iHatchStyle, crColor);


            11、多邊形填充模式及畫多邊形

            SetPolyFillMode(hdc, iMode); //iMode:ALTERNAME WINDING
            Polygon();

            12、區(qū)域HRGN(繪畫范圍)

            HRGN hRgn = CreateRectRgn(x1, y1, x2, y2);
            HRGN hRgn 
            = CreateRectRgnIndirect(&rect);
            HRGN hRgn 
            = CreateEllipticRgn(x1, y1, x2, y2);
            HRGN hRgn 
            = CreateEllipticRgnIndirect(&rect);

            區(qū)域合并

            CombineRgn(hDestRgn, hSrcRgn1, hSrcRgn2, iCombine); //iCombine: RGN_AND, RGN_OR, RGN_XOR, RGN_DIFF, RGN_COPY

            注意:hDestRgn, hSrcRgn1, hSrcRgn2都必須有效。

            FillRgn(); //填充區(qū)域。
            FrameRgn(); //給區(qū)域畫邊。
            InvertRgn(); //反轉(zhuǎn)區(qū)域。
            HRGN hRgnPrev = SelectObject(hdc, hRgn); //將區(qū)域放置入HDC。

            使區(qū)域無(wú)效/有效:

            InvalidateRgn(hRgn);
            ValidateRgn(hRgn);
            posted on 2009-04-03 19:02 Jiang Guogang 閱讀(1622) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Windows Programming
            国产91色综合久久免费| 伊人久久五月天| 国产99久久久国产精品~~牛| 91精品国产色综久久| 久久亚洲AV无码精品色午夜麻豆| 久久久久亚洲av无码专区导航| 国产国产成人久久精品| 久久亚洲熟女cc98cm| 99久久精品免费国产大片| 无码人妻久久一区二区三区免费 | 国内精品九九久久久精品| 精品久久久久久无码人妻热| 亚洲精品无码久久久影院相关影片| 久久91精品久久91综合| 中文字幕人妻色偷偷久久| 精品久久久久久无码人妻热| 99久久精品国内| 日韩人妻无码精品久久久不卡| 欧美亚洲另类久久综合婷婷| 国产免费久久精品丫丫| 精品免费久久久久久久| 婷婷伊人久久大香线蕉AV | 亚洲人成无码网站久久99热国产| 久久精品人成免费| 久久夜色精品国产噜噜亚洲AV| 模特私拍国产精品久久| 性做久久久久久久久| 久久久精品日本一区二区三区 | 亚洲国产精品成人AV无码久久综合影院 | 99久久精品免费看国产一区二区三区 | 亚洲伊人久久精品影院| 久久99这里只有精品国产| 一级做a爰片久久毛片免费陪| 久久人人爽人人爽AV片| 久久久久无码精品国产app| 久久精品无码一区二区三区日韩 | 亚洲AV日韩AV永久无码久久| 性欧美丰满熟妇XXXX性久久久| 亚洲AV无码一区东京热久久| 99国产精品久久| 精品久久国产一区二区三区香蕉 |