<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    Win32 GDI基礎(筆記)

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    1、GDI名字的意義

    GDI Graphic Device Interface,我說不清和GUI有什么區別。可能一種針對設備,一種針對用戶而言吧,反正以后都說GDI,也就是Windows的圖形編程。

     

    2、設備描述上下文HDC

    Handle Device Context

    這個是關鍵的關鍵,可以理解成畫圖的環境,何謂環境,畫板,紙,筆,尺寸,字體,顏色,區域等。反正包括你能想到的和未能想到的了。

    要畫出不同的圖形,很大程度上是對HDC的修改。

     

    3、HDC的創建方式

    WM_PAINT消息來的時候,用:

    hdc = BeginPaint(hwnd, &ps);

    //......

    EndPaint(hwnd, &ps);

    結束后ps區域自動變有效。還有:

    hdc = GetDC(hwnd);

    //......

    ReleaseDC(hwnd, hdc);

    這一對需要調用ValidateRect()函數來使得區域有效。

    還有別的辦法,但不常用,這里略過。不過有一個還是值得一說,那就是取得Window HDC的辦法,用它可以在Windows非客戶區畫圖:

    hdcWindow = GetWindowDC(hwnd);

    //......

    ReleaseDC(hwnd, hdcWindow);

     

    4、獲取HDC信息

    GetDeviceCaps()

    其中比較重要的指標是:

    HORZRES(horizontal resolution)

    VERTRES(vertical resolution)

    BITSPIXEL(色深)

     

    5、保存HDC與還原HDC

    SaveDC(hdc);

    RestoreDC(hdc, -1);

     

    6、畫圖畫圖!

    SetPixel(hdc, x, y, crColor);

    crColor = GetPixel(hdc, x, y);

     

    畫點

    取點顏色

    直線

    MoveToEx(hdc, x, y, lpPrevPoint);

    LineTo(hdc, x, y);

    Polyline(hdc, lpPoint, cPointNum);

    PolylineTo(hdc, lpPoint, cPointNum);

    PolyPolyline(hdc, lppt, lpNum, cCount);

     

    最后一參數為NULL表示不返回最后點

    畫線

    畫多線,不移動當前點

    畫多線,移動當前點

    畫多組多線

    曲線

    Arc(...);

    PolyBezier(...);

    PolyBezierTo(...);

     

    畫橢圓線

    畫比澤爾曲線,不移動但前點

    畫比澤爾曲線,移動當前點

    區域

    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實線PS_DASH虛線PS_DOT點線PS_DASHDOT虛點線PS_DASHDOTDOT虛雙點線PS_NULL空線PS_INSIDEFRAME??

    用法:DeleteObject(SelectObject(hdc, GetStockObject(BLACK_PEN)));

     

    獲取畫筆信息:

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

     

    選出HDC中的畫筆:

    hPen = GetCurrentObject(hdc, OBJ_PEN);

     

    8、背景模式

     

    改變背景模式,也就是制定虛線間間隙的填充問題了:

    SetBkColor(hdc, crColor);

    SetBkMode(hdc, TRANSPARENT);

    SetBkMode(hdc, OPAQUE);

    有Set嘛,相應地有Get了,這里略過。

     

    9、疊加模式

     

    SetROP2(hdc, iDrawMode);

    iDrawMode = GetROP2(hdc);

     

    10、畫刷HBRUSH(改變填充)

    畫刷能指明區域填充模式。

     

    方法1:

    HBRUSH hBrush = GetStockObject(GRAY_BRUSH);

    使用:SelectObject(hdc, hBrush);

     

    方法2:

    HBRUSH hBrush = CreateSolidBrush(crColor);

    HBRUSH hBrush = CreateHatchBrush(iHatchStyle, crColor);

     

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

    SetPolyFillMode(hdc, iMode);

    iModeALTERNAME WINDING

    Polygon(...);

     

    12、區域HRGN(繪畫范圍)

    HRGN hRgn = CreateRectRgn(x1, y1, x2, y2);

    HRGN hRgn = CreateRectRgnIndirect(&rect);

    HRGN hRgn = CreateEllipticRgn(x1, y1, x2, y2);

    HRGN hRgn = CreateEllipticRgnIndirect(&rect);

     

    區域合并

    CombineRgn(hDestRgn, hSrcRgn1, hSrcRgn2, iCombine);

    iCombine: RGN_ANDRGN_ORRGN_XORRGN_DIFFRGN_COPY

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

     

    使用:

    FillRgn(); 填充區域。

    FrameRgn(); 給區域畫邊。

    InvertRgn(); 反轉區域。

    HRGN hRgnPrev = SelectObject(hdc, hRgn); 將區域放置入HDC。

     

    使區域無效/有效:

    InvalidateRgn(hRgn);

    ValidateRgn(hRgn);

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全