MFC Windows程序设计--在窗口绘图

来源:互联网 发布:java计算a阶乘之和 编辑:程序博客网 时间:2024/06/05 00:59

设备描述表类:
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有错误检查避免了崩溃。

0 0
原创粉丝点击