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: 占用四个字节
  • 相关阅读:
    HDU 4278 Faulty Odometer 8进制转10进制
    hdu 4740 The Donkey of Gui Zhou bfs
    hdu 4739 Zhuge Liang's Mines 随机化
    hdu 4738 Caocao's Bridges tarjan
    Codeforces Gym 100187M M. Heaviside Function two pointer
    codeforces Gym 100187L L. Ministry of Truth 水题
    Codeforces Gym 100187K K. Perpetuum Mobile 构造
    codeforces Gym 100187J J. Deck Shuffling dfs
    codeforces Gym 100187H H. Mysterious Photos 水题
    windows服务名称不是单个单词的如何启动?
  • 原文地址:https://www.cnblogs.com/AlexanderZhao/p/12878994.html
Copyright © 2011-2022 走看看