zoukankan      html  css  js  c++  java
  • GDI+学习笔记5-设备环境DC的概念

    DC(Device Context)又称设备上下文,设备描述表。它是一个关于如何绘制图形的方法的集合,它既可以绘制各种图形,也可以确定在应用窗口中绘制图形的方式,就是绘图模式和映射模式。

    在Win32编程中,设备环境是用HDC来标识。H: Handle

    获取HDC的三种方法:

    1. 通过GetDC函数来获得相应窗口的HDC
    GetDC函数适合在窗口现有图形的基础上进行绘制。
    代码段:
    {
    HDC hDC = ::GetDC(hWnd);
    ...
    ::ReleaseDC(hWnd,hDC);
    }

    GetDC总传入的参数hWnd是窗口的句柄,它返回和这个窗口相关的DC.

    2. 通过BeginPaint函数来获得所在窗口的HDC
    BeginPaint和EndPaint用于响应WM_PAINT消息
    BeginPaint函数是将窗口上所有内容清除干净,然后在上面绘制
    code:
    {
    PAINSTRUCT ps;
    HDC hDC = ::BeginPaint(hWnd,&ps);
    ...
    ::EndPaint(hWnd,&ps);
    }

    typedef struct tagPAINTSTRUCT{
    HDC hdc; // 显示器的设备环境句柄
    BOOL fErase; // 是否擦除背景
    RECT rcPaint; // 指定了绘图的窗口区域
    BOOL fRestore;
    BOOL fIncUpdate;
    BYTE rgbReserved[32];
    }PAINTSTRUCT;

    3. 通过CreateCompatibleDC创建兼容内存DC
    一般用于解决界面的闪烁问题
    code:
    {
    HDC hMemDC = ::CreateCompatible(hDest);
    ...
    ::BitBlt(hDest,x,y,w,h,hMemDC,0,0,SRCCOPY);
    ...
    ::DeleteDC(hMemDC);
    }

    常用的GDI对象的介绍:
    画笔Pen:
    在GDI中,用HPEN来表示画笔,画线,画边框(如矩形边框,圆边框,饼边框)都是采用画笔来操作的。
    GDI默认的画笔为黑色,宽度为1,样式为SOLID

    画刷Brush:
    在GDI中,用HBRUSH来表示画刷。填充矩形,填充圆,填充饼等以及刷窗口背景都是通过画刷来操作的。GDI默认的画刷是白色的。

    字体Font:
    在GDI中,用HFONT来表示字体。所有文本绘制都要基于具体的字体对象来绘制的。
    GDI中默认的字体是系统等宽字体。

    区域Region:
    在GDI中,用HREGN来表示区域,在窗口中,一个区域可以是椭圆形,多边形或矩形。

    位图Bitmap:
    在GDI中,用HBITMAP来表示位图。GDI的绘制分为图形绘制(线,矩形,椭圆,饼等),图像绘图(位图)


    SelectObject:
    HGDIOBJ WINAPI SelectObject(HDC hdc,HGDIOBJ h);
    第一个参数是设备DC
    第二个参数是HGDIOBJ,其实是一个void*. 这个函数传入一个新的GDI对象到第一个参数的DC中,并返回该DC的老的同类型的GDI对象。

    GDI对象的例子:
    {
    LOGFONT lf={0};
    lf.lfWidth = 16;
    lf.lfHeight = 40;
    lf.lfCharSet = GB2312_CHARSET;
    HFONT hFont = ::CreateFontIndirect(&lf);
    HFONT hOldFont = ::SelectObject(hDC,hFont);
    DrawText(hDC,_T("abc"),3,&rect,DT_LEFT);
    ...
    ::SelectObject(hDC,hOldFont);
    ::DeleteObject(hFont);
    }

    库存GDI对象的使用:
    //画刷
    #define WHITE_BRUSH 0 // 白色画刷
    #define LTGRAY_BRUSH 1 // 亮灰色画刷
    #define GRAY_BRUSH 2 // 灰色画刷
    #define DKGRAY_BRUSH 3 // 深灰色画刷
    #define BLACK_BRUSH 4 // 黑色画刷
    #define NULL_BRUSH 5 // 空画刷,透明画刷
    #define HOLLOW_BRUSH NULL_BRUSH

    // 画笔
    #define WHITE_PEN   6 // 白色画笔
    #define BLACK_PEN 7 // 黑色画笔
    #define NULL_PEN 8 // 空画笔

    // 字体
    #define OEM_FIXED_FONT 10
    #define ANSI_FIXED_FONT 11
    #define ANSI_VAR_FONT 12
    #define SYSTEM_FONT 13
    #define DEVICE_DEFAULT_FONT 14
    #define DEFAULT_PALETTE 15
    #define SYSTEM_FIXED_FONT 16
    #define DEFAULT_GUI_FONT 17

    通过对象的ID号来获得库存的GDI对象的函数如下:
    HGDIOBJ GetStockObject(int i);
    GetStockObject(WHITE_PEN)
    Stock:库存,GetStockObject获取的对象不需要销毁,因为库存对象是整个系统共用的。

    GDI对象的信息获取:
    获得对象的一些信息可以通过调用GetObject函数来实现:
    int WINAPI GetObject(HANDLE h,int c,LPVOID pv);
    第一个参数填入GDI对象的句柄
    第二个参数填入结构的大小
    第三个参数填入结构的指针

    比如:位图HBITMAP对象的结构是BITMAP,画刷HBRUSH对象的结构是LOGBRUSH。现以获得位图对象的信息为例:得到位图的宽度和高度:
    BITMAP bm;
    ::GetObject(hBitmap,sizeof(BITMAP)&bm);

    typedef struct tagBITMAP {
      LONG   bmType;
      LONG   bmWidth;
      LONG   bmHeight;
      LONG   bmWidthBytes;
      WORD   bmPlanes;
      WORD   bmBitsPixel;
      LPVOID bmBits;
    } BITMAP, *PBITMAP;

    DC和GDI设备之间的关系:
    DC:画布,GDI:绘制设备

    图片与颜色:
    RGB,各个分量取值(0-255),没有透明度信息,RGB实际占用三个字节。

    ARGB: 占用四个字节
  • 相关阅读:
    EasyUI笔记(三)Window窗口
    EasyUI笔记(二)Layout布局
    从零构建Flink SQL计算平台
    从零构建Flink SQL计算平台
    Hystrix压测
    Java对象属性复制备忘
    Java垃圾回收手册翻译
    一次虚拟机升级和参数调整记录
    获取不同虚拟机参数的终极方法
    Dataset数据的XML持久化处理
  • 原文地址:https://www.cnblogs.com/AlexanderZhao/p/12878994.html
Copyright © 2011-2022 走看看