zoukankan      html  css  js  c++  java
  • Win32 GDI基础(笔记)

    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);

  • 相关阅读:
    js 图片压缩
    C#.NET中对称和非对称加密、解密方法汇总--亲测可用
    最精美详尽的 HTTPS 原理图
    swagger ui
    python爬取百度谷歌搜索结果
    Gitlab 11.0.3 迁移简明笔记
    ELK stack 7.6.x + kafka构建日志平台
    Nginx 内存占用高排查
    运维机器人 hubot 集成 jenkins
    运维机器人hubot,解放运维的神器
  • 原文地址:https://www.cnblogs.com/lidabo/p/3439125.html
Copyright © 2011-2022 走看看