设备描述表类:
CDC
1.获取CDC
对非OnPaint中
CDC* pDC = CWnd::GetDC();// 客户区DC,CWnd::GetWindowDC(),整个窗口
对OnPaint中
PAINTSTRUCT ps;
CDC *pDC = BeginPaint(&ps);
….
EndPaint(&ps);
MFC的改进:
提供专门用途的设备描述表类
CPaintDC:在客户区绘图,仅限OnPaint中使用
CClientDC:在客户区绘图,除OnPaint外其他地方
CWindowDC:窗口内任意地方
CMetaFileDC:向GDI文件绘图
各个类的构造和析构函数调用相应的函数捕获和释放设备描述表。
在整个屏幕绘图:
CClientDC dc(NULL);/ CWindowDC dc(NULL);
2.主要的设备描述表属性
属性 | 默认值 | 设置 | 获取 |
---|---|---|---|
文本颜色 | Black | CDC::SetTextColor | CDC::GetTextColor |
背景颜色 | White | CDC::SetBkColor | CDC::GetBkColor |
背景模式 | OPAQUE | CDC::SetBkMode | CDC::GetBkMode |
映射模式 | MM_TEXT | CDC::SetMapMode | CDC::GetMapMode |
当前位置 | (0,0) | CDC::MoveTo | CDC::GetCurPosition |
当前画笔 | BLACK_PEN | CDC::SelectObject | CDC::SelectObject |
当前画刷 | WHITE_BRUSH | CDC::SelectObject | CDC::SelectObject |
当前字体 | SYSTEM_FONT | CDC::SelectObject | CDC::SelectObject |
绘图模式 | R2_COPYPEN | CDC::SetROP2 | CDC::GetROP2 |
6个GDI对象:
画笔
画刷
字体
位图
区域
调色板(基本不用)
设备描述表属性的保存和恢复可用 CDC::SaveDC,CDC::RestoreDC。
或WNDCLASS包含风格CS_OWNDC,CS_CLASSDC
3.关于绘图模式
GDI将像素点输出到逻辑显示平面时,不是简单地输出像素点颜色,相反,它通过一系列布尔运算将 输出点颜色 和 输出目标位置上 像素颜色 合成。
绘图模式 | 执行的运算dest= |
---|---|
R2_NOP | dest |
R2_NOT | NOT dest |
R2_BLACK | BLACK |
R2_WHITE | WHITE |
R2_COPYPEN | src |
R2_NOTCOPYPEN | not src |
R2_MERGEPENNOT | (NOT dest) OR src |
R2_MASKPENNOT | (NOT dest) AND src |
R2_MERGENOTPEN | (NOT src) OR dest |
R2_MASKNOTPEN | (NOT src) AND dest |
R2_MERGEPEN | dest OR src |
R2_NOTMERGEPEN | NOT(dest OR src) |
R2_XORPEN | src XOR dest |
R2_NOTXORPEN | NOT(src XOR dest) |
4.关于映射模式
用于确定 逻辑坐标到设备坐标的转换
一般传给CDC输出函数的都是逻辑坐标值。
Windows支持8中不同的映射模式
映射模式 | 一个逻辑单位对应的距离 | X轴和Y轴正方向 |
---|---|---|
MM_TEXT | 1像素 | X:向右,Y:向下 |
MM_LOMETRIC | 0.1mm | X:向右,Y:向上 |
MM_HIMETRIC | 0.01mm | X:向右,Y:向上 |
MM_LOENGLISH | 0.01in | X:向右,Y:向上 |
MM_HIENGLISH | 0.001in | X:向右,Y:向上 |
MM_TWIPS | 1/1440in | X:向右,Y:向上 |
MM_ISOTROPIC | 依赖用户,X,Y同等缩放 | 依赖用户 |
MM_ANISOTROPIC | 依赖用户,X,Y独立缩放 | 依赖用户 |
使用公制映射模式时,显示屏幕上1逻辑英寸不等于实际中1英寸。因为Windows不知道监视器每英寸内像素树。打印机和其他硬拷贝设备无此情况。
使用MM_ISOTROPIC时,同等缩放,指的是x和y方向的一个逻辑单位,对对应到相同数量的物理单位。
坐标转换:
CDC::LPToDP/DPToLP
CWnd::ClientToScreen/ScreenToClient,一个相对于屏幕左上角。一个相对于客户区左上角。
映射模式相关函数:
Window代表逻辑。Viewport代表设备
CDC::SetWindowOrg(x,y)等价于 告诉Windows将逻辑点(x,y)映射成设备点(0,0)
CDC::SetViewportOrg(x,y)等价于告诉Windows将设备点(x,y)映射成逻辑点(0,0)
CDC::SetWindowExt
CDC::SetViewportExt
5.从CDC::GetDeviceCaps从获取几个设备描述表相关的设备信息
参数 | 含义 |
---|---|
HORZRES | 像素数目表示的显示宽 |
VERTRES | 像素数目表示的显示高 |
HORZSIZE | 毫米表示的显示宽 |
VERTSIZE | 毫米表示的显示高 |
6.GDI绘图函数
MoveTo
LineTo
PolylineTo
Polyline
Arc
ArcTo
PolyBezier
所有GDI画曲线函数,不会画最后一个像素点
Chord
Ellipse
Pie
Polygon
Rectangle
RoundRect
画封闭图形时,从外接方框的左上边界画到右下边界(不含右下边界)
7.GDI画笔,CPen
画笔用来画曲线和封闭图形的边框
画笔样式
样式 | 描述 |
---|---|
PS_SOLID | right-aligned |
PS_DASH | 短线 |
PS_DOT | 更短线 |
PS_DASHDOT | are neat |
PS_DASHDOTDOT | are neat |
PS_NULL | are neat |
PS_INSIDEFRAME | 画的线在图形边框内 |
PS_SOLID/PS_NULL/PS_INSIDEFRAME风格下才有宽度概念
对通路可使用扩展笔。
8.GDI画刷,CBrush
画刷三类基本类型:
单色,
带阴影线:HS_DIAGCROSS,
带图案
对阴影线画刷,背景模式为OPAQUE时,线间空隙由CDC的背景色填充。为TRANSPARENT时,由当前背景填充。
画刷原点:
CPoint point(x1, y1);
dc.LPToDP(&point);
point.x %= 8;
point.y %= 8;
brush.unrealizeObject();// 允许改变画刷原点
dc.SetBrushOrg(point);// 改变原点
dc.SelectObject(&brush);// 新的原点,新原点下画刷
dc.Rectangle(x1,y1,x2,y2);
9.画文本
CDC文本函数 | 描述 |
---|---|
DrawText | 格式化矩形中显示 |
TextOut | 指定位置 |
TabbedTextOut | 输出一行含制表符文本 |
ExtTextOut | 输出文本且可改变矩形背景,字符间距 |
GetTextExtent | 获得当前字体下,字符串尺寸 |
GetTabbedTextExtent | 获得当前字体下,含制表符字符串尺寸 |
GetTextMetrics | 获得当前字体信息 |
SetTextAlign | 文本对齐 |
SetTextJustification | 均匀分配空白符占据尺寸 |
10.字体,CFont
11.备用对象
对于备用对象,使用时 用CDC::SelectStockObject将其选入设备描述表。也可用 CGdiObject::CreateStockObject将其赋给GDI对象。
备用笔:NULL_PEN,WHITE_PEN,BLACK_PEN
备用刷:NULL_BRUSH,HOLLOW_BRUSH,…,WHITE_BRUSH
12.关于GDI对象的删除
在栈上创建的CGdiObject或其派生类对象,在超出范围时被自动析构。
用new在堆上创建的CGdiObject或其派生类对象,要在不用时删除。
CGdiObject或其派生类对象可用 CGdiObject::DeleteObject被显示删除。
不能删除已经选入设备描述表的GDI对象,试图用已删除的对象画图,是错了。此时程序没有崩溃是,Windows有错误检查避免了崩溃。