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

  • 相关阅读:
    LeetCode 123. Best Time to Buy and Sell Stock III (stock problem)
    精帖转载(关于stock problem)
    LeetCode 122. Best Time to Buy and Sell Stock II (stock problem)
    LeetCode 121. Best Time to Buy and Sell Stock (stock problem)
    LeetCode 120. Triangle
    基于docker 搭建Elasticsearch5.6.4 分布式集群
    从零开始构建一个centos+jdk7+tomcat7的docker镜像文件
    Harbor实现容器镜像仓库的管理和运维
    docker中制作自己的JDK+tomcat镜像
    docker镜像制作---jdk7+tomcat7基础镜像
  • 原文地址:https://www.cnblogs.com/lidabo/p/3439125.html
Copyright © 2011-2022 走看看