您的位置:首页 > 其它

GDI+学习笔记5-设备环境DC的概念

2015-09-04 00:57 393 查看
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: 占用四个字节
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: