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

    xiaoxiao2021-03-26  7

    设备描述表类: 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.主要的设备描述表属性

    属性默认值设置获取文本颜色BlackCDC::SetTextColorCDC::GetTextColor背景颜色WhiteCDC::SetBkColorCDC::GetBkColor背景模式OPAQUECDC::SetBkModeCDC::GetBkMode映射模式MM_TEXTCDC::SetMapModeCDC::GetMapMode当前位置(0,0)CDC::MoveToCDC::GetCurPosition当前画笔BLACK_PENCDC::SelectObjectCDC::SelectObject当前画刷WHITE_BRUSHCDC::SelectObjectCDC::SelectObject当前字体SYSTEM_FONTCDC::SelectObjectCDC::SelectObject绘图模式R2_COPYPENCDC::SetROP2CDC::GetROP2

    6个GDI对象: 画笔 画刷 字体 位图 区域 调色板(基本不用)

    设备描述表属性的保存和恢复可用 CDC::SaveDC,CDC::RestoreDC。 或WNDCLASS包含风格CS_OWNDC,CS_CLASSDC

    3.关于绘图模式 GDI将像素点输出到逻辑显示平面时,不是简单地输出像素点颜色,相反,它通过一系列布尔运算将 输出点颜色 和 输出目标位置上 像素颜色 合成。

    绘图模式执行的运算dest=R2_NOPdestR2_NOTNOT destR2_BLACKBLACKR2_WHITEWHITER2_COPYPENsrcR2_NOTCOPYPENnot srcR2_MERGEPENNOT(NOT dest) OR srcR2_MASKPENNOT(NOT dest) AND srcR2_MERGENOTPEN(NOT src) OR destR2_MASKNOTPEN(NOT src) AND destR2_MERGEPENdest OR srcR2_NOTMERGEPENNOT(dest OR src)R2_XORPENsrc XOR destR2_NOTXORPENNOT(src XOR dest)

    4.关于映射模式 用于确定 逻辑坐标到设备坐标的转换 一般传给CDC输出函数的都是逻辑坐标值。 Windows支持8中不同的映射模式

    映射模式一个逻辑单位对应的距离X轴和Y轴正方向MM_TEXT1像素X:向右,Y:向下MM_LOMETRIC0.1mmX:向右,Y:向上MM_HIMETRIC0.01mmX:向右,Y:向上MM_LOENGLISH0.01inX:向右,Y:向上MM_HIENGLISH0.001inX:向右,Y:向上MM_TWIPS1/1440inX:向右,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_SOLIDright-alignedPS_DASH短线PS_DOT更短线PS_DASHDOTare neatPS_DASHDOTDOTare neatPS_NULLare neatPS_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有错误检查避免了崩溃。

    转载请注明原文地址: https://ju.6miu.com/read-600365.html

    最新回复(0)