画图流程是:
1、画图之前windows程序从GDI获取设备描述表句柄;
2、每次调用GDI输出函数时将句柄返回给GDI。
MFC的CDC类将windows设备描述表和获取设备描述表句柄的GDI函数就近封装在一起,CDC的派生类则代表不同类型的设备描述表。
类名 描述
CPaintDC 用于在窗口客户区画图(仅限于OnPaint处理程序)
CClientDC 用于在窗口客户区画图(除OnPaint处理程序外的任何处理程序)
CWindowDC 用于在窗口内任何地方画图,包括非客户区
CMetaFileDC 用于向GDI元文件画图
得到设备环境句柄
HDC的方法:BeginPaint、GetWindowDC、GetDC
1.
采用
GetDC
获取
HDC
HDC hdc = ::GetDC( hwnd );
//
此处添加绘图代码
::ReleaseDC( hwnd, hdc );
2.
采用
BeginPaint
获取
HDC
适合用
在OnPaint程序中,则需用CWnd::BeginPaint和CWnd::EndPaint分别代替GetDC和ReleaseDC以保证合理地处理WM_PAINT消息
HDC hdc;
PAINTSTRUCT ps;//
保存
hdc = ::BeginPaint( hwnd, &ps );
//
此处添加绘图代码
::EndPaint( hwnd, &ps );
注意:另外在
OnPaint程序中CDC类可以直接进行实例化,构造函数和析构函数调用相应的函数捕获和释放设备描述表
在栈中实例化
CPaintDC dc(this);
// Do some drawing
在堆中实例化
CPaintDC * pDC = new CPaintDC(this)
// Do some drawing
delete pDC;
3.
采
用
GetWindowDC
获取
HDC 在非
OnPaint程序
HDC hdc = ::GetWindowDC( hwnd );
//
此处添加绘图代码
::ReleaseDC( hwnd, hdc );
设备描述表属性
当使用CDC输出函数在屏幕上画图时,输出的某些特性并没有在函数调用过程中规定,但可通过设备描述表自身获得。
Attribute Default Set with Get with
文本颜色 Black CDC::SetTextColor CDC::GetTextColor
背景颜色 White CDC::SetBkColor CDC::GetBkColor
背景模式 OPAQUE CDC::SetBkMode CDC::GetBkMode
映射模式 MM_TEXT CDC::SetMapMode CDC::GetMapMode
绘图模式 R2_COPYPEN CDC::SetROP2 CDC::GetROP2
当前位置 (0,0) CDC::MoveTo CDC::GetCurrentPosition
当前画笔 BLACK_PEN CDC::SelectObject CDC::SelectObject
当前画刷 WHITE_BRUSH CDC::SelectObject CDC::SelectObject
当前字体 SYSTEM_FONT CDC::SelectObject CDC::SelectObject
创建这些对象
位图:CreateBitmap, CreateBitmapIndirect, CreateCompatible Bitmap, CreateDIBitmap, CreateDIBsection(只有内存设备上下文环境可选择位图,并且在同一时刻只能一个设备上下文环境选择位图)。
画刷:CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush。
字体:CreateFont, CreateFontIndirect。
笔:CreatePen, CreatePenIndirect。
区域:CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect。
返回值为类型,然后调用SelectObject函数选中。选中后,返回原来画刷的句柄用来恢复时使用。图形绘制完毕后使用DeleteObject函数将其释放。
所以其流程如下:
CreatePen 新的
SelectObject 新的
SelectObject 旧的
DeleteObject 新的
画图
1.直线 MoveTo 、LineTo
2.
椭圆
Ellipse
3. 矩形
Rectangle
4.点
SetPixel
5.文本显示 DrawText
6.画刷填充 FillRect
引申到双缓冲绘图
双缓冲绘图步骤:
创建兼容DC(CreateCompatibleDC)
创建兼容位图(CreateCompatibleBitmap)
将兼容位图选入兼容DC(SelectObject)
在兼容DC中进行绘制工作
将兼容DC中的像素拷贝至屏幕DC(BitBlt)
从兼容DC中换出兼容位图(SelectObject)
删除兼容位图(DeleteObject)
删除兼容DC(DeleteObject)
CDC dc;
dc.CreateCompatibleDC(pDc);//创建兼容DC
CBitmap memBmp;
memBmp.CreateCompatibleBitmap(pDc, zcRect.Width(), zcRect.Height());//创建兼容位图
CBitmap* OldBmp = dc.SelectObject(&memBmp);//将位图选入DC
//具体画图
pDc->BitBlt(0,0,zcRect.Width(),zcRect.Height(),&dc,0,0,SRCCOPY);//将兼容DC中位图拷贝至屏幕DC
dc.SelectObject(OldBmp);
memBmp.DeleteObject();
dc.DeleteDC();