第3章 MFC绘图基础
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
客户区坐标系以窗口客户区左上角为原点,主要 用于客户区的绘图输出和窗口消息的处理。鼠标 消息的坐标参数使用客户区坐标,CDC类绘图成 员函数使用与客户区坐标对应的逻辑坐标。
坐标之间的相互转换
编程时,有时需要根据当前的具体情况进行三 种设备坐标之间或与逻辑坐标的相互转换。 MFC提供了两个函数 CWnd::ScreenToClient()和 CWnd::ClientToScreen()用于屏幕坐标与客 户区坐标的相互转换。
CWindowDC类代表了整个程序窗口设备环境,
可以在整个窗口区域绘图。
CClientDC、CPaintDC和CWindowDC的区别
当窗口的某个区域需要重绘时激发窗口重绘消息WM_PAINT,相 应消息处理函数CWnd::OnPaint将被调用。CPaintDC一般只用 于OnPaint函数中,在处理完窗口重绘后, CPaintDC对象的析 构函数把WM_PAINT消息从消息队列中清除,避免不断地重绘操 作。坐标原点(0,0)是客户区的左上角。 CClientDC用于特定窗口客户区(窗口中除边框、标题栏、菜单 栏、状态栏外的中间部分)的输出,其构造函数中包含了GetDC, 析构函数中包含了ReleaseDC,不需要显式释放DC资源。一般用 于响应非重绘消息(如键盘和鼠标消息)的绘图操作。坐标原点 (0,0)是客户区的左上角。 CWindowDC在整个应用程序窗口上画图,而CClientDC和 CPaintDC只能在客户区绘制图形;除非要自己绘制窗口边框和按 钮,否则一般不用它。坐标原点(0,0)是屏幕的左上角。
函 数
SetPixel
功
用指定的颜色在指定的坐标画一个点
能
MoveTo
LineTo Polyline PolyBezier
移动当前位置到指定的坐标,函数返回以前位置的坐标。
从当前位置到指定位置画一条直线 从当前位置开始,根据函数参数绘制多条折线。 根据两个端点和两个控制点绘制贝济埃(Bezier)曲线。
如果采用SDK方法编程,获取DC的方法有两种:
在WM_PAINT消息处理函数中通过调用API函数 BeginPaint()获取设备环境,在消息处理函数返 回前调用API函数EndPaint()释放设备环境。在 其他函数中通过调用API函数GetDC()获取设备环 境,调用API函数ReleaseDC()释放设备环境。
MFC提供了两个函数CDC::DPtoLP()和CDC:: LPtoDP()用于设备坐标与逻辑坐标之间的相互 转换。
绘制基本图形
生成设备环境,就可以开始绘制不同形状的几何 图形,GDI提供了绘制基本图形的成员函数,这 些函数封装在 MFC 的 CDC 类中。 CDC 类提供的 绘图函数包括点、直线、曲线、矩形、椭圆、弧 、扇形、弦形和多边形等供用户使用。如果进行 复杂绘图的话,就需要通过算法来组织这些基本 绘图函数来完成绘图。 绘图函数使用的坐标都是逻辑坐标。
13
MFC中获取DC的方法
在如OnDraw等函数中传递一个指向CDC 对象的指针 如OnDraw(CDC* pDC); 使用构造函数构建对象 一般不构造CDC对象 在CWnd类的OnPaint函数中,定义CPaintDC对象 CPaintDC dc(this); 在CWnd类的其它函数中,定义CClientDC和 CWindowDC的对象 CClientDC dc(this); CWindowDC dc(this);
设备环境DC(Device Context)
为了实现设备无关性,应用程序的输出不直接面
向显示器等物理设备,而是面向一个称之为设备 环境DC(Device Context)的虚拟逻辑设备。
设备环境也称设备描述表或设备上下文,它是由
Windows管理的一个数据结构,它保存了绘图操 作中一些共同需要设置的信息,如当前的画笔、 画刷、字体和位图等图形对象及其属性,以及颜 色和背景等影响图形输出的绘图模式。
CPaintDC类是OnPaint()函数使用的设备环境类
,它代表一个窗口的绘图画面。如果添加 WM_PAINT消息处理函数OnPaint(),就需要使 用CPaintDC类来定义一个设备环境对象。
CClientDC类代表了客户区设备环境。当在客户
区实时绘图时,需要利用CClientDC类定义一个 客户区设备环境。
设备坐标系统
设备坐标系统
x轴自左至右,y轴从上到下,坐标原点在屏 幕左上角
O [0,0] X
Y
17
设备坐标系分为屏幕坐标系、窗口坐标系和客户区 坐标系三种相互独立的坐标系。
屏幕坐标系以屏幕左上角为原点,一些与整个屏 幕 有 关 的 函 数 均 采 用 屏 幕 坐 标 , 如 GetCursorPos() 、 SetCursorPos()、 CreateWindow()、MoveWindow()。 弹 出 式 菜单使用的也是屏幕坐标。 窗口坐标系以窗口左上角为坐标原点,它包括窗 口标题栏、菜单栏和工具栏等范围。
逻辑坐标系是面向 DC的坐标系,这种坐标不考虑
具体的设备类型,在绘图时,Windows会根据当 前设置的映射模式将逻辑坐标转换为设备坐标。
设备坐标系是面向物理设备的坐标系,这种坐标
以像素或设备所能表示的最小长度单位为单位,X 轴方向向右,Y轴方向向下。设备坐标系的原点位 置(0, 0)不限定在设备显示区域的左上角。
第三讲 MFC绘图基础
主讲:吕骏
Windows 是一个图形操作系统,大多数 应用程序都需要在客户区绘制一些图形,如绘 制文本、几何图形、位图和光标等。
Windows 提 供 了 一 个 称 为 图 形 设 备 接 口 GDI(Graphics Device Interface)的抽象接 口。GDI作为Windows的重要组成部分,它负责 管理用户绘图操作时功能的转换。用户通过调用 GDI 函数与设备打交道, GDI 通过不同设备提供 的驱动程序将绘图语句转换为对应的绘图指令, 避免了直接对硬件进行操作,从而实现所谓的设 备无关性。所谓设备无关性,是指操作系统屏蔽 了硬件设备的差异,使用户编程时一般无需考虑 设备的类型,如不同种类的显示器或打印机。
画线
LineTo函数用于绘制一条从当前绘图位置到 指定坐标点的直线段,其函数声明如下: BOOL LineTo(int x, int y); BOOL LineTo(POINT point); 参数x和y,及参数point指定了坐标点,默认 情况下从(0,0)开始画
利用MFC AppWizard建立一个SDI应用程序,在 OnDraw()函数中添加如下程序代码: pDC->LineTo(10,10); POINT p1;p1.x = 100;p1.y = 100;//使用 POINT结构 pDC->LineTo(p1); CPoint p2;p2.x = 200;p2.y = 100;//使用 CPoint类 pDC->LineTo(p2);
调用UpdateWindow函数刷新窗口 窗口的全部或者部分失效的时候 窗口从无到有 手动刷新窗口
调用InvalidateRect函数
9
获取设备描述表:方法二
该方法只适合于处理WM_PAINT消息
用BeginPaint“使无效窗口生效”并“返回 设备描述表句柄” 用EndPaint释放设备描述表句柄
Case
一般处理 WM_PAINT的形式如下: WM_PAINT;
hdc = BeginPaint(hwnd, &ps) ; …… EndPaint(hwnd, &ps) ; return 0 ;
10
计算机科学与技术学 院 张淼
如果采用MFC方法编程,MFC提供了不同类型的
DC类,每一个类都封装了DC句柄,并且它们的构 造函数自动调用获取DC的API函数,析构函数自 动调用释放DC的API函数。因此,在程序中通过 声明一个MFC设备环境类的对象就自动获取了一 个DC,而当该对象被销毁时就自动释放了获取的 DC。MFC AppWizard应用程序向导创建的 OnDraw()函数自动支持所获取的DC。
OnDraw与OnPaint的区别
OnDraw是CView类的成员函数,不响应消息;OnPaint 是CWnd类的成员函数,相应WM_PAINT消息。 CView默认调用的OnPaint函数如下
void CView::OnPaint() { CPaintDC dc(this); OnPrepareDC(&dc); OnDraw(&dc); //调用了OnDraw }
Rectangle函数 用于绘制矩形,其函数声明如下: BOOL Rectangle(int x1, int y1, int x2, int y2); BOOL Rectangle(LPCRECT lpRect); 其中第一个函数参数给出了两组点坐标,第 一组为矩形的左上角点坐标,第二组为矩形 的右下角点坐标。第二个函数使用了指向矩 形区域结构的指针作为参数,也可以使用 CRect类。如果绘图成功,函数返回TRUE ,否则返回FALSE。
获取设备描述表:方法一
该方法适合于处理非WM_PAINT消息
用GetDC获取设备描述表句柄 用ReleaseDC释放设备描述表句柄
这种获取设备描述表的一般方式如下
hdc = GetDC(hwnd) ; …… ReleaseDC(hwnd, hdc) ;
WMห้องสมุดไป่ตู้PAINT消息
什么时候向窗口过程发送WM_PAINT消 息(窗口发生重绘) - “无效”的时候
Windows绘图过程和设备无关性的实现 :
GDI处于设备驱动程序的上一层,当程序调用绘图函数时, GDI将绘图命令传送给当前设备的驱动程序,以调用驱动程序 提供的接口函数。驱动程序的接口函数将 Windows 绘图命令 转化为设备能够执行的输出命令,实现图形的绘制。不同设 备具有不同的驱动程序,设备驱动程序是设备相关的。
Rectangle
RoundRec t Ellipse Arc ArcTo Pie Chord Polygon DrawIcon
根据指定的左上角和右下角坐标绘制一个矩形
绘制一个圆角矩形。 根据指定的矩形绘制一个内切椭圆 根据指定的矩形绘制内切椭圆上的一段弧边 该函数功能与Arc函数相同,不同之处在于画弧成功后 绘制扇形 绘制弦形,弦形是一条椭圆弧和其对应的弦所组成的封闭图形。 根据两个或两个以上顶点绘制一个多边形 在指定位置画一个图标,如果成功函数返回非0,否则返回0。
移动画笔 MoveTo函数用于将当前绘图位置移到指 定的坐标点处,函数声明如下: CPoint MoveTo(int x, int y); CPoint MoveTo(POINT point); 参数x和y,及参数point指定了新的当前绘 图位置坐标。返回值是CPoint对象实例, 它包含了新的当前绘图位置坐标。
可见OnPaint函数也调用了CView::OnDraw函数。因而一 般在OnDraw函数内添加绘图代码,完成绘图任务
15
GDI坐标系和映射模式
Windows坐标系分为逻辑坐标系和设备坐标系两
种, GDI 支持这两种坐标系。一般而言, GDI 的 文本和图形输出函数使用逻辑坐标,而在客户区 移动或按下鼠标的鼠标位置是采用设备坐标。
形象地说,一个设备环境提供了一张画布和一些
绘画的工具,我们可以使用不同颜色的工具在上 面绘制点、线、圆和文本。
在Windows中不使用DC无法进行输出,在使用
任何GDI绘图函数之前,必须建立一个设备环境 。
获取设备环境DC的方法:
在程序中不能直接存取DC数据结构,只能通过系
统提供的一系列函数或使用设备环境的句柄HDC 来间接地获取或设置设备环境结构中的各项属性 ,如显示器高度和宽度、支持的颜色数及分辨率 等。
MFC的DC类包括CDC、CPaintDC、CClientDC
、CWindowDC等,其中CDC类是MFC设备环境 类的基类,其它的MFC设备环境类都是CDC的派 生类。
CDC类既作为其它MFC设备环境类的基类,又可
以作为一个一般的设备环境类使用。利用它可以 访问设备属性和设置绘图属性。CDC类对GDI的 所有绘图函数进行了封装。