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: 占用四个字节
在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: 占用四个字节