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: 占用四个字节
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值