MFC绘图教程
VC中MFC绘图详细教程
前一页
休息
字体对象 CFont NewFont; (2)创建字体
CreateFont( int nheight,int nWidth,//高,宽 int nEscapement, //每行文字相以于页底的角 int nOrienation, //每个….. DWORD nWeight , //字体粗细 DWORD dwltalic, //非零表示倾斜 DWORD dwUnderline, //非零表示下划线 DWORD dwStrikeout, //非零表示中划线 DWORD dwCharset, //字符集 DWORD dwOutputPrecision, //输出精度 DWORD dwClipPrecision, //剪裁精度 DWORD dwQuality, //输出质量 DWORD dwPitchAndFamily, //字体系列 lpszFaceName//字体名称} ; 前一页 DWORD 休息
4
休息
设备环境
设 备 环 境
获取设备环境 (1)使用GetDC()函数 CDC *CWnd GetDC() int ReleaseDC(CDC * pDC ) (2)直接构造CDC对象 用声明一个CDC类或其派生类对象的方式来 获取设备环境 CClientDC dc(CWnd *)
前一页
休息
3
设备环境
设 备 环 境
前一页
(1)CWindowDC 和CClientDC CPaintDC区别 CWindowDC提供客户区和非客户区画图的设备环 境;坐标原点在屏幕左上角 CClientDC CPaintDC提供画图的设备环境;坐标原 点在客户区左上角 (2) CClientDC 和CPaintDC区别 CPaintDC是响应WM_PAINT消息,用在OnPaint() 函数中;只支持屏幕显示 CClientDC不响应WM_PAINT消息,只担负此时的 绘图工作;支持屏幕显示,也支持打印 CDC常用函数(参见MSDN)
MFC绘图
一、绘制线条1、新建MFC单文档工程Draw。
2、为CDrawView类添加CPoint类型的成员变量m_ptOrigin,将其访问权限设置为Private。
3、添加WM_LBUTTONDOWN的消息响应函数,该函数初始化m_ptOrigin变量m_ptOrigin=point。
4、添加WM_LBUTTONUP的消息响应函数void CDrawView::OnLButtonUp(UINT nFlags, CPoint point),在该函数里可添加如下各种代码实现绘图:(1)、利用SDK全局函数实现画线功能:HDC hdc;hdc=::GetDC(m_hWnd); //获得窗口的设备描述表MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); //移动到线条的起点LineTo(hdc,point.x,point.y); //画线::ReleaseDC(m_hWnd,hdc);//释放设备描述表知识点:所有派生于CWnd类的子类都拥有m_hWnd这一成员变量,m_hWnd被定义为HWND类型,用于保存当前窗口的句柄,该成员变量具有public的访问权限。
(2)、利用MFC的CDC类实现画线功能:CDC* pDC=GetDC();pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);知识点:MFC提供了设备描述表的封装类CDC,该类封装了所有与绘图相关的操作。
该类提供了一个数据成员m_hDC,用来保存与CDC类相关的DC句柄(3)、利用MFC的CClientDC类实现画线功能:CClientDC dc(this);//dc(GetParent())可获得父窗口的DCdc.MoveTo(m_ptOrigin);dc.LineTo(point);知识点:CClientDC派生于CDC类,当一个CClientDC对象在构造时,它在内部会调用GetDC 函数,在这个CClientDC对象析构时,它会调用ReleaseDC函数。
MFC画直线
MFC画直线最近自己在学习如何在VC 6.0 开发环境下的使用MFC AppWizard(exe)来绘画一条直线,虽然比较简单,通过这样的练习可以帮助你熟悉MFC的开发环境以及其中的消息传递机制,希望对于像我一样初入MFC图形绘制学习的人有帮助第一步:构建MFC窗体打开Visual C++ 6.0编译器新建→工程→MFC AppWizard(exe),工程名以DrawLine为例,然后确定。
为了方便,在MFC应用程序向导—步骤1当中选择“单文档”,其余所有的步骤都为默认值,直接“完成”。
这样一个简单的MFC 窗体就构建好了,自己不妨Compile—Build—BuildExecute一下。
第二步:编辑菜单项选择ResourceView视窗展开Menu文件夹,左键双击IDR_DRAWLITYPE,右边就会出现菜单图形编辑界面,为了简化,我们只在添加帮助→DrawLine功能选择项。
双击空白会弹出“菜单项目属性”对话框。
ID:ID_DRAW_LINE;标明:DrawLine(&D),其它的为缺省。
第三步:建立消息命令如果此时运行该程序,你会发现帮助—DrawLine的功能选项是灰色的,原因就在于我们还没有添加该功能的消息命令相应函数。
通过“查看—Message Maps—Project:DrawLine—Class name:CDrawLineView—Object IDs:ID_DRAW_LINE—选定COMMAND—Add Function…”,其它为默认,最后确定完成。
现在如果再重新运行该程序的话,会发现原来的灰色已经消除了。
第四步:添加鼠标消息响应打开ClassView视窗,右键选定CDrawLineView,选择Add Windows Messsage Handler会弹出对话框,完成CDrawLineView类的WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP三个Windows消息事件的新建。
第二章 MFC交互绘图基础
第一章MFC交互绘图基础 (2)2.1 创建工具条 (2)2.1.1 添加新工具条 (2)2.1.2 在应用程序中显示工具条 (6)2.1.3 连接工具条按钮处理函数 (8)2.2 使用鼠标绘图 (10)2.2.1 鼠标消息 (10)2.2.2 用鼠标绘制直线段 (13)2.2.3 用鼠标绘制椭圆和椭圆区域 (19)2.2.4 用鼠标绘制矩形区域 (20)2.3 图元定义及重画 (22)2.3.1 图元基类CMapElement (22)2.3.2 直线段图元子类CLine (26)2.3.3 椭圆图元子类CEllipse (27)2.3.4 椭圆区域图元子类CEllipseRegion (27)2.3.5 矩形区域图元子类CRectangleRegion (28)2.3.6 图元重画 (28)2.4 设置线型和区域填充方式 (33)2.4.1 添加对话框资源 (33)2.4.2 创建设置线型和区域填充方式对话框类CSetStyleDlg (35)2.4.3 完成颜色和示例的实时显示 (39)2.4.4 在下拉框中绘图 (46)2.4.5 初始化对话框 (53)2.4.6 使用用户选择的线型和区域填充方式绘制图元 (55)2.5 选中图元 (62)2.5.1 图元的包围盒 (63)2.5.2 图元的选中判断 (64)2.5.3 绘制图元的选中标识 (67)2.5.4 用鼠标选中单个图元 (69)2.5.5 用鼠标和键盘配合选择多个图元 (72)2.5.6 选择矩形区域内的多个图元 (73)2.6 编辑图元 (77)2.6.1 修改图元的形状 (77)2.6.2 移动图元 (84)2.6.3 放大或缩小图元 (88)2.6.4 删除图元 (93)2.6.5 图元的剪切、复制和粘贴 (95)2.6.6 在状态条中显示鼠标光标位置坐标值 (101)2.6.7 撤销图元的绘制和编辑 (102)2.7 图元的持久化 (112)2.8 解决闪屏现象 (117)2.9 小结 (119)第一章MFC交互绘图基础在上一章我们所创建的应用程序中,通过添加的菜单项实现了简单的用户和应用程序的交互。
MFC基本绘图函数使用方法
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数 绘制图形如下所示,坐标(100, 150)表示距离左边100,距离顶部 150。
计算机图形学
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数 注意:绘制图形主要调用CDC* pDC方法实现,MFC可以补充 提示函数。
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数
(1)绘制直线
计算机图形学
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数
void CTest01View::OnDraw(CDC* pDC) {
CTest01Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->MoveTo(100,150); pDC->LineTo(300,400); // TODO: add draw code for native data here }
MFC绘图工具类包括CGdiObject、CBitmap、CBrush、 CFont、CPallette、CPen和CRgn等。常用的包括:
(4) CPen:封装了GDI画笔,选作设备上下文的当前画笔, 画笔用于绘制图形边界线;
(5) CPallette:封装了GDI调色板,提供应用程序和显示器 之间的颜色接口;
计算机图形学
一.MFC基本绘图函数使用方法
一. MFC绘图基础知识 CDC类
CDC类派生出CClientDC类、CMetaFileDC类、 CPaintDC类和CWindowDC类。
MFC画图程序步骤
MFC画图程序步骤MFC(Microsoft Foundation Class)是一种用于开发Windows应用程序的C++类库。
在MFC中,我们可以使用GDI(Graphics Device Interface)来创建和操作图形。
下面是使用MFC创建一个简单的画图程序的步骤。
步骤1:创建一个新的MFC项目首先,打开Visual Studio并选择创建一个新的项目。
在项目类型中,选择Visual C++ -> MFC,然后选择MFC应用程序类型。
输入项目名称并选择保存的位置。
在应用程序类型中,选择“单文档”或“多文档”视图,具体根据你的需求而定。
点击“确定”按钮创建项目。
步骤2:设计用户界面在MFC应用程序中,用户界面是通过对话框资源来设计的。
在资源视图中,双击IDD_DIALOG(或其他对话框资源)以打开对话框编辑器。
在对话框编辑器中,你可以添加按钮、文本框、菜单等控件来设计你的用户界面。
在画图程序中,你可以添加一个画布控件来显示绘制的图形。
步骤3:添加绘图功能在MFC中,你可以使用GDI来进行绘图操作。
打开你的对话框类的头文件(例如,CMyDialog.h),添加以下头文件引用:#include <afxwin.h>#include <afxext.h>#include <afxdisp.h>在对话框类的源文件(例如,CMyDialog.cpp)中,添加以下代码来处理绘图操作:```void CMyDialog::OnPaint(){CPaintDC dc(this); // 用于绘制的设备上下文// 在这里进行绘图操作dc.Rectangle(100, 100, 200, 200); // 绘制一个矩形dc.Ellipse(300, 100, 400, 200); // 绘制一个椭圆}```步骤4:处理绘图事件在对话框类的消息映射中添加对绘图事件的处理。
MFC 一个简单的绘图程序
MFC 一个简单的绘图程序涉及到的知识点:1. 鼠标信息的处理,2. 文档和视图的关系,3. 新建一个类及其使用方法的技巧,4. 改变窗口大小或者刷新窗口后原来所绘制的图形没有显示出来的问题。
绘制图形的原理:鼠标被用作画笔,绘图过程中要进行不同的鼠标消息的处理,如按下鼠标,移动鼠标和释放鼠标。
当用户按下鼠标左键是必须记录鼠标当前的位置,并捕获鼠标,设置光标形状;当移动鼠标时,先判断鼠标左键是否同时被按住,如果是则从上一个鼠标位置到当前鼠标位置绘制一条直线。
并保存当前鼠标位置点,供绘制下一段直线用,当释放鼠标左键时将鼠标释放给系统。
一、简单绘图程序程序的实现1.使用MFC AppWizard 应用程序向导创建一个SDI应用程序MyDraw,在视图类CMyDrawView.h中添加如下代码:protected: // create from serialization onlyCMyDrawView();DECLARE_DYNCREATE(CMyDrawView)CPoint m_ptOrigin; //起始点坐标bool m_bDragging; //鼠标是否处于拖拽状态标记HCURSOR m_hCross;//拖拽状态时鼠标的样式2. 在构造函数中对拖拽标记和鼠标样式进行初始化CMyDrawView::CMyDrawView(){// TODO: add construction code herem_bDragging=false;//初始化为falsem_hCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);//十字光标}3. 使用类向导为视图类添加按下鼠标左键,移动鼠标,释放鼠标左键的消息处理函数。
代码分别为:void CMyDrawView::OnLButtonDown(UINT nFlags, CPoint point) //按下鼠标左键{// TODO: Add your message handler code here and/or call default SetCapture();::SetCursor(m_hCross);m_ptOrigin=point;m_bDragging=true;CView::OnLButtonDown(nFlags, point);}void CMyDrawView::OnLButtonUp(UINT nFlags, CPoint point) //释放鼠标左键{ // TODO: Add your message handler code here and/or calldefault if(m_bDragging){m_bDragging=false;ReleaseCapture();}CView::OnLButtonUp(nFlags, point);}void CMyDrawView::OnMouseMove(UINT nFlags, CPoint point) //移动鼠标{// TODO: Add your message handler code here and/or callif(m_bDragging){//CMyDrawDoc * pDoc=GetDocument();//ASSERT_VALID(pDoc);//pDoc->AddLine(m_ptOrigin,point);CClientDC dc(this);dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigin=point;}CView::OnMouseMove(nFlags, point);}4.在MyDraw.CPP中设置窗口标题m_pMainWnd->SetWindowText("简单的绘图程序");此后,编译、链接,运行程序后可以将鼠标当作一个画笔绘制曲线了。
MFC画板程序教程-图文
MFC画板程序教程-图文第四章屏幕绘图4.1、MFC绘图的基本知识4.1.1、设备描述表(deviceconte某t)的概念绝大多数的Window应用程序都要向不同的输出设备(打印机、屏幕)上绘制文本和图形。
由于Window是一个具有与设备无关性的操作系统,所以任何向屏幕上进行输出的功能都要间接地通过一个叫做设备描述表DC(deviceconte某t)的对象(简称为DC对象)来完成。
用户向设备描述表对象提出输出的要求,然后由Window自己来调用具体输出设备的驱动程序,及完成实际的输出工作。
使用设备描述表带来的最大的好处就是输出格式的一致性,因为输出不再是直接针对具体的设备,而是通过统一格式的设备描述表间接地实现。
设备描述表实际上是一种Window的数据结构,它保存了设备(打印机、屏幕等)的绘图属性和绘图函数。
设备描述表对象就是设备描述表数据结构的一个具体的实例,它提供了一个绘图的环境,所有的绘图工作都要通过它来实现。
MFC提供了不同类型的设备描述表类,每一个类都封装了代表Window设备描述表的句柄(HDC)和函数。
因此,使用MFC获取设备描述表的操作比使用WindowAPI方法容易的多。
围绕设备描述表,MFC还提供了一系列与其配合使用的绘图工具对象,这其中包括:画笔对象、刷子对象以及字体对象等等。
它们的工作流程是这样的:首先对设备描述表进行设置,即获取设备描述表对象;然后选择进行输出所需要的绘图工具;最后用设备描述表对象的输出函数绘制图形。
4.1.2、窗口、客户区和非客户区的概念窗口是Window应用程序基本的操作单元,是其运行及与用户进行交互的基本平台。
屏幕输出的目标一般都是窗口内的客户区,它不包括窗口的边框、水平和垂直滚动条、状态条、工具条、菜单栏和标题栏。
窗口内的客户区是一个万能的输出区域,可以接受无论是图形、文本、位图、还是其他类型的数据(例如OLE对象)。
窗口内除客户区之外的区域即为非客户区。
mfc简单绘图程序
M F C简单的绘图程序——王帅目录摘要 (2)关键字 (2)1 引言 (2)设计目的 ............................................................................................................... 错误!未定义书签。
2 功能说明 (2)2。
1菜单栏...................................................................................................... 错误!未定义书签。
2。
1.1图形 (3)2.1。
2画笔 (4)2。
1。
3画硬币 (4)2。
2工具栏 (5)2.3状态栏 (5)3 功能的实现 (5)3.1 视图设计 (5)3.2 编辑资源 (6)3。
3 编程思路及各个函数的实现 (7)(1)思路 (7)(2)代码的实现 (7)1。
为基本形状创建一个基类 (8)2.基本形状类的创建 (8)2.1矩形类的创建及定义 (8)2。
2圆形类的创建及定义 (10)2.3正五边形类的创建及定义 (11)2。
4正三角形类的创建及定义 (14)2。
5椭圆类的创建及定义 (16)2.6正四边形类的创建及的定义 (17)2。
7正六边形类的创建及定义 (18)2.8直线类的创建及定义 (19)3.各基本形状类在CMyDraw2_0类中的调用和绘图的实现 (20)3。
1矩形类的调用与与绘图的实现 (20)3.2圆形类的调用 (24)3.3正三角形类的调用 (25)3。
4基本类型调用的剩余代码 (26)4。
画笔的使用、颜色及大小的调整 (29)5.画硬币 (35)6.工具栏中的自定义控件 (38)7。
状态栏中的显示 (39)4程序功能的测试 (41)5最后总结 (42)摘要:本绘图程序能够进行基本图形的绘画,如直线,圆,矩形,三角形等等,并且在此基础上添加了多边形的绘画,如正五边形等。
第三章MFC绘图
7/22/2013
18
6.OnDraw与OnPaint的区别
OnDraw是CView类的成员函数,不响应消息;OnPaint是 CWnd类的成员函数,响应WM_PAINT消息。 CView默认调用的OnPaint函数如下
void CView::OnPaint() { CPaintDC dc(this); OnPrepareDC(&dc); OnDraw(&dc); //调用了OnDraw }
3.4重绘
为什么要重绘? 如何重绘? 在ondraw中重新绘制窗口内容: 把OnLButtonDown事件中的绘制图形 代码写在ondraw函数中。
7/22/2013
28
新的问题: 1)程序一开始就把OnLButtonDown事件 中绘制的图形画好了。 解决办法: 使用if控制:如果没有发生 OnLButtonDown事件,则不在ondraw中 重绘。 怎么实现?
文本:以图形方式输出文本,以逻辑坐标为单位计算输 出位置,而DOS是以行为单位。用户可以设置文本的各 种效果,如加粗、斜体、设置颜色等。
7/22/2013
3
2.设备上下文
应用程序的输出面向设备环境(Device Context,DC),是 一个虚拟逻辑设备,也称设备描述表或设备上下文。设备 环境DC 是由GDI 创建,用来代表设备连接的数据结构。 DC 的主要功能
7/22/2013
17
5.Windows系统发送WM_PAINT消息的时机
第一次创建一个窗口时 改变窗口的大小时 把窗口从另一个窗口背后移出时 窗口显示数据变化时,应用程序引发重绘操作
通过CWnd::Invalidate、CWnd::InvalidateRect或 CWnd::InvalidateRgn函数把指定区域加到窗口的 Update Region中。 窗口的Update Region不为空时,系统会自动产生 WM_PAINT消息。
MFC绘图基础——上机操作步骤
MFC绘图基础——上机操作步骤⼀、上机之前的介绍软件环境:VC++6.0⽬的:熟悉基本的MFC框架搭建和了解界⾯⼆、MFC上机操作步骤1,在Windows桌⾯上运⾏VC++6.0。
2,新建项⽬⼯程⽂件。
3,在MFC 应⽤程序向导-步骤1 对话框中,选中单⽂档单选按钮,其余保持默认。
4,弹出新建⼯程信息的对话框,单击确定。
5,完成上述步骤后,⼯程Testone的MFC框架已经⽣成。
6,在集成开发环境的左侧⼯作窗⼝中有3个标签页。
ClassView 显⽰所创建的类和成员函数ResourceView 显⽰所创建的资源FileView 显⽰程序⽂件,主要包括程序源⽂件、头⽂件和资源⽂件7,在CTestView 类的源⽂件TestView.cpp中可以找到成员函数OnDraw()。
其内容如下:void CTestoneView::OnDraw(CDC* pDC){CTestoneDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here}其中pDC定义为CDC类的指针。
pDoc通过GetDocument()函数得到了指向⽂档类CTestoneDoc的指针。
ASSERT_VALID(pDoc)函数使pDoc指针有效。
使⽤pDC指针,可以对CDC类的成员函数进⾏操作。
注意:OnDraw()函数是由系统框架直接调⽤的,每当窗⼝重绘时就会⾃动执⾏。
8,单击⼯具条上的按钮,就可以直接编译、运⾏程序。
三、结束语⾄此,尽管未编写⼀⾏代码,但Test⼯程已经形成⼀个可执⾏程序的框架了。
以后的⼯作就是针对具体的设计任务,为该框架添加⾃⼰的程序代码。
接下来就是Coding~~~。
实验一 MFC基本绘图
数学与计算科学系学生实验报告实验课程名称:计算机图形学实验内容:实验一 MFC基本绘图系别:年级:专业班:学生姓名:学号:开课时间:年下学期一、实验要求1. 按照教材第40页2.2节所介绍的操作步骤,熟悉MFC应用程序的创建过程,并完成第50页的例2-5。
2.在上面程序的基础上,通过设置不同的画笔和画刷,至少实现8个不同图形的绘制,如:椭圆、矩形、实线、虚线、位图显示、五角星(多边形)、圆弧、扇形、Bezier曲线等等。
二、实验过程1.启动Visval 6.0++,创建MFC单文档工程。
2. 在MFC的OnDraw(CDC* pDC)中“ // TODO: add draw code for native data here”下进行编程。
3.建立直角坐标系,并标出x,y轴和原点O。
4.在坐标系里画图。
5.用图片填充背景时要先将图片导入MFCresources中。
6.画五角星时在头文件中加入以下代码:#include "math.h"#define PI 3.1415926#define Round(d) int(floor(d+0.5))三、程序代码void CMywork1View::OnDraw(CDC* pDC){CMywork1Doc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereCRect rect;//定义矩阵GetClientRect(&rect);//获得客户区矩阵pDC->SetMapMode(MM_ANISOTROPIC);//设置映射模式pDC->SetWindowExt(100,100);//设置窗口pDC->SetViewportExt(100,100);//设置视区:x轴水平向右为正,y轴垂直向上为正pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);//设置客户区中心为坐标系原点rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);//客户区矩阵校正//建立坐标系CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(0,255,0));//画实线,选择绿色画笔pOldPen=pDC->SelectObject(&NewPen);pDC->MoveTo(-rect.right,0); //自定义坐标轴pDC->LineTo(rect.right,0);pDC->MoveTo(0,-rect.bottom);pDC->LineTo(0,rect.bottom);pDC->MoveTo(rect.right,0); //画x轴的箭头pDC->LineTo(rect.right-10,-7);pDC->MoveTo(rect.right,0); //画x轴的箭头pDC->LineTo(rect.right-10,7);pDC->MoveTo(0,-rect.bottom); //画y轴的箭头pDC->LineTo(7,10-rect.bottom);pDC->MoveTo(0,-rect.bottom); //画y轴的箭头pDC->LineTo(-7,10-rect.bottom);pDC->TextOut(rect.right-15,5,"x"); //显示x轴pDC->TextOut(25,15-rect.bottom,"y"); //显示y轴pDC->TextOut(-15,10,"O"); //显示原点//直线---画实线1CPoint A(50,50),B(450,300);CPen NewPen1,*pOldPen1;NewPen1.CreatePen(PS_SOLID,1,RGB(0,225,225));//画实线,选择青色画笔pOldPen1=pDC->SelectObject(&NewPen1);pDC->MoveTo(A);pDC->LineTo(B);pDC->SelectObject(pOldPen1);pDC->TextOut(50,50,'A');pDC->TextOut(450,300,'B');pDC->TextOut(200,200,"实线");//直线---画虚线2CPoint C(300,150),D(600,100);CPen NewPen2,*pOldPen2;NewPen2.CreatePen(PS_DASH,1,RGB(225,0,0));//画虚线,选择红色画笔pOldPen2=pDC->SelectObject(&NewPen2);pDC->MoveTo(C);pDC->LineTo(D);pDC->SelectObject(pOldPen2);pDC->TextOut(300,150,'C');pDC->TextOut(600,100,'D');pDC->TextOut(450,100,"虚线");//画椭圆3rect.DeflateRect(100,50);CBrush * pOldBrush3;pOldBrush3=(CBrush *)pDC->SelectStockObject(NULL_BRUSH);//选择透明画刷pDC->Ellipse(rect);//绘制椭圆pDC->SelectObject(pOldBrush3);//画圆角矩形4CBrush NewBrush4,*pOldBrush4;NewBrush4.CreateSolidBrush(RGB(255,0,0));pOldBrush4=pDC->SelectObject(&NewBrush4);pDC->RoundRect(-400,-200,-50,-40,40,20);pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush4);//画Bezier样条9CPoint pp[7];pp[0]=CPoint(20,-200);pp[1]=CPoint(90,-70);pp[2]=CPoint(220,-30);pp[3]=CPoint(250,-160);double a=(pp[3].y-pp[2].y)/(pp[3].x-pp[2].x);double x=270,y=a*(x-pp[3].x)+pp[3].y;pp[4]=CPoint(Round(x),Round(y));pp[5]=CPoint(480,-130);pp[6]=CPoint(400,-25);for(int j=0;j<7;j++){if(0==j)pDC->MoveTo(pp[j]);elsepDC->LineTo(pp[j]);pDC->Ellipse(pp[j].x-5,pp[j].y-5,pp[j].x+5,pp[j].y+5);//黑色实心圆绘制控制点}CPen NewPen9,*pOldPen9;NewPen9.CreatePen(PS_SOLID,3,RGB(255,0,0));//红色画笔绘制样条pOldPen9=pDC->SelectObject(&NewPen9);pDC->PolyBezier(pp,7);//绘制Bezier样条pDC->SelectObject(pOldPen9);pDC->TextOut(280,-100,"Bezier曲线");//绘制五角星6CPen penBlue(PS_SOLID,5,RGB(0,0,255));//定义五个像素宽的蓝色画笔CPen *pOldPen6=pDC->SelectObject(&penBlue);CBrush brushRed(RGB(255,0,0));//定义红色画笔CBrush * pOldBrush6=pDC->SelectObject(&brushRed);pDC->SetPolyFillMode(WINDING);//设置填充模式int r=200;//正五边形外接圆的半径CPoint p[5];//定义正五边形顶点数组double Beta=2*PI/5;//定义每个顶点的圆心角double Alpha=PI/10;//定义起始角for(int i=0;i<5;i++){p[i].x=Round(r*cos(i*Beta+Alpha));//计算正五边形顶点坐标p[i].y=Round(r*sin(i*Beta+Alpha));}CPoint v[5];//定义五角星顶点数组v[0]=p[0];v[1]=p[2];v[2]=p[4];v[3]=p[1];v[4]=p[3];//转储顶点pDC->Polygon(v,5);//绘制五角星pDC->SelectObject(pOldPen6);//恢复画笔pDC->SelectObject(pOldBrush6);//恢复画刷//画扇形7CBitmap NewBitmap7; CBrush NewBrush7,*pOldBrush7;NewBrush7.CreatePatternBrush(&NewBitmap7);//将背景图作为画刷填充扇形pOldBrush7=pDC->SelectObject(&NewBrush7);CPen *pOldPen7;pOldPen7=(CPen*)pDC->SelectStockObject(NULL_PEN);CPoint ld,rt,sp,ep;ld=CPoint(500,150),rt=CPoint(100,300);//第一个扇形的位置sp=CPoint(-100,-300),ep=CPoint(-500,-150);pDC->Pie(CRect(ld,rt),sp,ep);//画扇形函数CBrush Brush7;Brush7.CreateSolidBrush(RGB(0,255,255));//为下面的的扇形配青色pDC->SelectObject(&Brush7);ld=CPoint(-400,-170),rt=CPoint(-300,-130);//第二个扇形的位置sp=CPoint(-200,-100),ep=CPoint(-500,-100);pDC->Pie(CRect(ld,rt),sp,ep);//画获取像素图8srand((unsigned)time(NULL));//随机变量(随时间变化)COLORREF crColor;int m,n;for(n=50;n<100;n++)for(m=-100;m<-50;m++)pDC->SetPixelV(m,n,RGB(rand()%256,rand()%256,rand()%256));//生成随机像素点for(n=50;n<100;n++)for(m=-100;m<-50;m++){crColor=pDC->GetPixel(m,n);//获取原矩形区域的像素点pDC->SetPixelV(m-200,n+50,crColor);//用获取的像素点在y-90的位置生成原图}}四、实验结果。
mfc读取数据绘制曲线
mfc读取数据绘制曲线一、概述本篇文章将介绍如何使用Microsoft Foundation Class (MFC)库,从数据源读取数据,并将其绘制成曲线。
MFC是微软提供的一套用于开发Windows应用程序的类库,它提供了许多现成的类和函数,方便开发者快速开发应用程序。
二、需求分析在绘制曲线之前,我们需要明确数据来源和绘制方式。
通常,数据来源可以是数据库、文件、网络等。
绘制方式可以采用图表、曲线等方式。
在实际应用中,我们需要根据具体需求选择合适的数据源和绘制方式。
三、实现步骤1. 建立MFC应用程序:首先,我们需要创建一个MFC应用程序,以便于实现数据读取和曲线绘制功能。
2. 配置数据源:根据实际需求,配置数据源,如数据库、文件等。
可以使用MFC提供的数据库访问类(如CDatabase、CRecordSet等)或文件读取类(如CFile、CFileStream等)来实现数据读取。
3. 实现数据读取:使用MFC提供的函数或类(如AfxODBC、CFile等)从数据源中读取数据,并将其存储到变量中。
4. 绘制曲线:使用MFC提供的绘图类(如CPointF、CFont、CBrush等)和绘图函数(如CDC::DrawLine等)将数据绘制成曲线。
5. 调试和优化:在实现过程中,需要不断调试和优化代码,确保程序的正确性和性能。
四、代码示例以下是一个简单的代码示例,用于从文件中读取数据并绘制曲线:```cpp// 创建MFC应用程序// ...// 打开文件并读取数据CFile file("data.txt", CFile::modeRead);CString line;while (file.ReadLine(line)) {// 解析数据并存储到变量中double x, y;sscanf(line, "%lf %lf", &x, &y);// 绘制曲线CPen pen(PS_SOLID, 1, RGB(0, 0, 255)); // 绘制红色实线CPen* oldPen = pDC->SelectObject(&pen); // 选择画笔pDC->DrawLine(x1, y1, x2, y2); // 绘制曲线段pDC->SelectObject(oldPen); // 恢复旧画笔x1 += 1; // 更新x坐标}```五、总结通过以上步骤和代码示例,我们可以使用MFC库从数据源读取数据,并将其绘制成曲线。
mfc绘图程序上机步骤
mfc绘图程序上机步骤首先生成MFC程序空框架空框架中的每个类的职责是什么要自己理解清楚第一次课:1.定义自己的数据类CLine直线类,用于绘图点击菜单:插入—类选择Generic class,输入类名,每个类都是分成两个文件.h 中只有类体,包含类的数据成员定义和成员函数声明,.cpp中就是成员函数的类体外实现classCLine{int x1,y1,x2,y2;public:CLine(int a=0,int b=0,int c=0,int d=0);virtual ~CLine();int Getx1();int Gety1();int Getx2();int Gety2();void SetPoint1(intx,int y);很多函数是在后面使用中发现问题逐渐添加的void SetPoint2(intx,int y);};2.自定义的类要作为数据成员出现在Doc类中classCSmallCADDoc : public CDocument{protected: // create from serialization onlyCSmallCADDoc();DECLARE_DYNCREATE(CSmallCADDoc)// Attributespublic:CLine line1; //数据成员应该是私有,但是由于文档类与视图类交换频繁,为了访问方便,直接定义成公有了。
你也可以定义成私有,再定义一个Get函数间接访问,取他的值3.注意:添加了这个数据成员后,需要增加几个#include “Line.h”语句添加的原则是,每个cpp文件都单独编译,哪里用到新的类,相应的cpp前就要增加#include “。
”语句此处是在CSmallCADDoc类中添加了一个CLine line1;类对象,在SmallCADDoc.h文件中。
所以,凡是包含了#include “SmallCADDoc.h”的地方都要在前面添加#include “Line.h”语句。
第3章MFC绘图基础..
,它代表一个窗口的绘图画面。如果添加 WM_PAINT消息处理函数OnPaint(),就需要使 用CPaintDC类来定义一个设备环境对象。
CClientDC类代表了客户区设备环境。当在客户
区实时绘图时,需要利用CClientDC类定义一个 客户区设备环境。
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。
如果采用SDK方法编程,获取DC的方法有两种:
在WM_PAINT消息处理函数中通过调用API函数 BeginPaint()获取设备环境,在消息处理函数返 回前调用API函数EndPaint()释放设备环境。在 其他函数中通过调用API函数GetDC()获取设备环 境,调用API函数ReleaseDC()释放设备环境。
调用UpdateWindow函数刷新窗口 窗口的全部或者部分失效的时候 窗口从无到有 手动刷新窗口
调用InvalidateRect函数
9
获取设备描述表:方法二
mfc第七章图形绘制06修改版
颜色 颜色用三元式: RGB(Red, Green, Blue); 表示 其中: Red, Green, Blue取值: 0..255; 例如: RGB(255,0,0); 为红色 RGB(0,255,0); 为绿色 RGB(0,0,255); 为蓝色 RGB(0,0,0); 为黑色 RGB(255,255,255); 为白色
Guo yan -fang
第五章
图形绘制
设备环境
( Device Context设备上下文) 设备上下文) 设备上下文 (简称DC) 简称 )
Windows设备环境 Windows不允许直接访问硬件, 需要通过设备环境来达到目的的。 在MFC中,CDC类表示了设备 环境,OnDraw()函数就是使用设备 环境的接口。
பைடு நூலகம்
3. CBrush:
crColor); BOOL CreateSolidBrush(COLORREF crColor); 其中,参数crColor用于指定画刷的颜色。 其中,参数crColor用于指定画刷的颜色。 crColor用于指定画刷的颜色 例如: OnDraw() ()中 例如:下段程序放在视类的 OnDraw()中 NewBrush; //声明画刷对象 { CBrush NewBrush; //声明画刷对象 pOldBrush, //保存原先画刷的指针 CBrush* pOldBrush, //保存原先画刷的指针 //初始化实线蓝色画刷 //初始化实线蓝色画刷 NewBrush.CreateSolidBrush(RGB(0, 255)); NewBrush.CreateSolidBrush(RGB(0,0,255)); //将画刷选入设备文本对象 //将画刷选入设备文本对象 pDC->SelectObject(&NewBrush); pOldBrush = pDC->SelectObject(&NewBrush); //使用画刷 //使用画刷 …… pDC->SelectObject(pOldBrush);//恢复原先的画刷对象 pDC->SelectObject(pOldBrush);//恢复原先的画刷对象 }
第二章 MFC 绘图基础
图2-7 FileView标签页的展开显示
在CTestView类的源文件TestView.cpp中可以找到 OnDraw()函数。其内容如下:
void CTestView::OnDraw(CDC* pDC) {
CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here }
➢ pDC定义为CDC类的指针。 ➢ pDoc通过GetDocument()函数得到指向文档类CTestDoc的指
图2-4 New Project Information 对话 框
5. 完成上述步骤后,Test工程的MFC应用程序框架已经 生成。如图2-5所示。
图2-5 应用程序框架
6. 在应用程序框架的ClassView标签页中显示所创建 的类和成员函数;在ResourceView标签页板中显示
所创建的资源;在FileView标签页中显示源程序文件。 如图2-6所示。
CMetaFileDC类:
Windows图元文件设备上下文类。 •CMetaFileDC 封 装 了 在 Windows 中 绘 制 图 元 文 件 的 方法。 •图元文件是微软定义的一种Windows平台下的与设备 无关的的图形文件格式(扩展名为wmf),其所占的 磁盘空间比其它任何格式的图形文件都要小得多。 •wmf格式文件通常用于存储一系列由绘图命令所描述 的图形(如绘制直线与文本等) 。 •在 建 立 图 元 文 件 时 , 不 能 实 现 即 绘 即 得 , 而 是 先 将 GDI调用记录在图元文件中,然后在GDI环境中重新执 行图元文件,才可显示图像。
如何用MFC绘图
1 几何对象的结构和类为了使用绘图函数,应该先了解绘图所用到的几种表示几何对象的结构和类。
这些结构和类分别定义在头文件和中。
1.点1)点结构POINT点数据结构POINT用来表示一点的x、y坐标:typedef struct tagPOINT {LONG x;LONG y;} POINT;2)点类CPoint点类CPoint为一个没有基类的独立类,封装了POINT结构,有成员变量x 和y,其构造函数有5种:CPoint( );CPoint( int initX, int initY );CPoint( POINT initPt );CPoint( SIZE initSize );CPoint( LPARAM dwPoint ); . ...}... ...CView::OnLButtonUp(nFlags, point);}2 客户区大小和DC在绘图前,必须先得到客户区大小和设备上下文DC。
1.获得客户区绘图一般都是在视图窗口的客户区进行,而客户区的大小在运行时可由用户改变,为了使绘制的图形能随窗口大小自动改变,必须先得到当前客户区大小的数据(宽w和高h)。
获取客户区大小的方法有如下两种:1)在消息响应函数OnSize中获得利用属性窗口的信息页,在视图类中添加WM_SIZE消息的响应函数OnSize。
该函数在窗口第一次显示或窗口大小被改变时会被Windows系统调用。
其输入参数中的cx和cy就是客户区大小的宽和高,可将它们赋值给类变量(如m_iW 和m_iH)供绘图时使用。
例如void CDrawView::OnSize(UINT nType, int cx, int cy) {CView::OnSize(nType, cx, cy);OBJ_BRUSHOBJ_PALOBJ_FONTOBJ_BITMAP 也可分别调用CDC类的下列成员函数来做同样的事:CPen* GetCurrentPen( ) const;CBrush* GetCurrentBrush( ) const;CFont* GetCurrentFont( ) const;CBitmap* GetCurrentBitmap( ) const;CPalette* GetCurrentPalette( ) const;如:HPEN hPen = (HPEN)GetCurrentObject(pDC->m_hDC, OBJ_PEN);CPen* pPen = CPen::FromHandle(hPen);等价于:CPen* pPen = pDC-> GetCurrentPen( );4 画图在Windows中,绘图一般在视图窗口的客户区进行,使用的是设备上下文类CDC中各种绘图函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
常用颜色对照表
例:COLLORREF red = RGB(255,0,0);
3/21/2011
13
中获取DC 在MFC中获取 中获取
在如OnDraw等函数中传递一个指向 等函数中传递一个指向CDC 对象的 在如 等函数中传递一个指向 指针
3/21/2011
9
设备环境类的基本功能
3/21/2011
10
CDC类常用绘图函数 类常用绘图函数
Arc:绘制一段弧 : Chord:绘制弦形 : Ellipse:绘制椭圆或圆 : MoveTo:将当前位置移动到指定位置 : LineTo:从当前位置到指定位置画一条直线 : Polyline:画连接指定点的折线段 : PolyBezler:根据两个端点和两个控制点画贝塞尔曲线 : Pie:画冰块 : Polygon:根据两个或两个以上的顶点绘制一个多边形 : Rectangle:根据指定的左上角和右下角坐标绘制一个矩形 : RoundRect:画圆角矩形 : SetPixel:画一个点 :
void CView::OnPaint() { CPaintDC dc(this); OnPrepareDC(&dc); ; OnDraw(&dc); //调用了 调用了OnDraw 调用了 }
可见OnPaint函数也调用了 可见 函数也调用了CView::OnDraw函数。因而一 函数。 函数也调用了 函数 般在OnDraw函数内添加绘图代码,完成绘图任务 函数内添加绘图代码, 般在 函数内添加绘图代码
3/21/2011
16
OnDraw与OnPaint的区别 与 的区别
OnDraw是CView类的成员函数,不响应消息;OnPaint是 是 类的成员函数, 类的成员函数 不响应消息; 是 CWnd类的成员函数,相应 类的成员函数, 消息。 类的成员函数 相应WM_PAINT消息。 消息 CView默认调用的 默认调用的OnPaint函数如下 默认调用的 函数如下
3/21/2011
17
ห้องสมุดไป่ตู้ 主要内容
GDI与设备环境(DC) 与设备环境( ) 与设备环境 用CDC绘图 绘图 应用举例 绘图工具类
3/21/2011
18
举例
编写一个单文档MFC应用程序,完成以下要求: 应用程序,完成以下要求: 编写一个单文档 应用程序 ,(2) (1)在客户区中画最大的椭圆,( )当点击鼠 )在客户区中画最大的椭圆,( 标左键时,以鼠标左键点击的位置为中心,画一 标左键时,以鼠标左键点击的位置为中心, 个半径为20个像素的圆 个像素的圆。 个半径为 个像素的圆。 建立一个单文档的MFC项目 项目DrawTest1 建立一个单文档的 项目
可用RGB宏设置颜色值,将红、绿、蓝分量值转 宏设置颜色值,将红、 可用 宏设置颜色值 换为COLORREF类型的颜色数据 换为 类型的颜色数据
COLORREF RGB(
BYTE byRed, // red component of color BYTE byGreen, // green component of color BYTE byBlue // blue component of color );
理解Windows编程的基本概念。 编程的基本概念。 理解 编程的基本概念 鉴于教学时间进度限制, 鉴于教学时间进度限制,更复杂的应用程序开发通过 自学完成。 自学完成。
实现基本MFC应用程序需要掌握如下内容: 应用程序需要掌握如下内容: 实现基本 应用程序需要掌握如下内容
Windows编程基本概念 编程基本概念 文档/视图结构 文档 视图结构 文档读写 对话框及标准控件的使用 菜单栏的使用 绘图及鼠标消息的处理
3/21/2011
11
绘图颜色
DWORD类型的 类型的COLORREF数据用于存放颜色值 类型的 数据用于存放颜色值 “0x00bbggrr” ”
低位字节存放红色强度值 第2 个字节存放绿色强度值 第3个字节存放蓝色强度值 个字节存放蓝色强度值 高位字节存放0 高位字节存放
本文由hoplee_2010贡献
ppt文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
MFC MFC绘图
MFC编程学习的基本目标 编程学习的基本目标
可以进行简单的基于MFC的图形界面编程 的图形界面编程 可以进行简单的基于
屏幕:对若干行和列的像素操作 屏幕: 打印机: 打印机:对若干行和列的点阵输出 直接从内存到显存的复制操作,速度快,内存要求高。 直接从内存到显存的复制操作,速度快,内存要求高。
文本:以图形方式输出文本, 文本:以图形方式输出文本,以逻辑坐标为单位计算输 出位置, 是以行为单位。 出位置,而DOS是以行为单位。用户可以设置文本的各 是以行为单位 种效果,如加粗、斜体、设置颜色等。 种效果,如加粗、斜体、设置颜色等。
3/21/2011
5
设备环境
应用程序的输出面向设备环境(Device Context,DC),是 应用程序的输出面向设备环境 , , 一个虚拟逻辑设备,也称设备描述表或设备上下文。 一个虚拟逻辑设备,也称设备描述表或设备上下文。设备 环境DC 是由 是由GDI 创建,用来代表设备连接的数据结构。 创建,用来代表设备连接的数据结构。 环境 DC 的主要功能
3/21/2011
6
设备坐标系统
设备坐标系统
x轴自左至右,y轴从上到下,坐标原点在屏 轴自左至右, 轴从上到下 轴从上到下, 轴自左至右 幕左上角
O [0,0] X
Y
3/21/2011
7
主要内容
GDI与设备环境(DC) 与设备环境( ) 与设备环境 用CDC绘图 绘图 应用举例 绘图工具类
3/21/2011
4
GDI的图形输出 的图形输出
应用程序可以使用GDI 创建如下图形输出 应用程序可以使用
矢量图形:画线和填充图形,包括点、直线、曲线、多 矢量图形:画线和填充图形,包括点、直线、曲线、 边形、扇形和矩形等。 边形、扇形和矩形等。 光栅图形: 光栅图形:通过光栅图形函数对以位图形式存储的数据 进行操作,包括各种位图和图标的输出。 进行操作,包括各种位图和图标的输出。
3/21/2011
15
Windows系统发送WM_PAINT消息的时机 系统发送 系统发送 消息的时机
第一次创建一个窗口时 改变窗口的大小时 把窗口从另一个窗口背后移出时 窗口显示数据变化时, 窗口显示数据变化时,应用程序引发重绘操作
通过CWnd::Invalidate、CWnd::InvalidateRect或 、 通过 或 CWnd::InvalidateRgn函数把指定区域加到窗口的 函数把指定区域加到窗口的 Update Region中。 中 窗口的Update Region不为空时,系统会自动产生 不为空时, 窗口的 不为空时 WM_PAINT消息。 消息。 消息
3/21/2011 2
主要内容
GDI与设备环境(DC) 与设备环境( ) 与设备环境 用CDC绘图 绘图 应用举例 绘图工具类
3/21/2011
3
图形设备接口( 图形设备接口(GDI) )
Windows提供了一个称为图形设备接口 提供了一个称为图形设备接口 (Graphics Device Interface,GDI)的抽象接口。 的抽象接口。 , 的抽象接口 GDI 作为 作为Windows的重要组成部分,负责管理用 的重要组成部分, 的重要组成部分 户绘图操作时功能的转换。 户绘图操作时功能的转换。 用户通过调用GDI 函数与设备打交道,GDI 通过 函数与设备打交道, 用户通过调用 不同设备提供的驱动程序将绘图语句转换为对应 的绘图指令,避免了用户对硬件直接进行操作, 的绘图指令,避免了用户对硬件直接进行操作, 从而实现设备无关性(显示器或打印机)。 从而实现设备无关性(显示器或打印机)。
如OnDraw(CDC* pDC);
使用构造函数构建对象
一般不构造CDC对象 对象 一般不构造 类的OnPaint函数中,定义 函数中, 在CWnd类的 类的 函数中 定义CPaintDC对象 对象
CPaintDC dc(this);
类的其它函数中, 在CWnd类的其它函数中,定义 类的其它函数中 定义CClientDC和 和 CWindowDC的对象 的对象
3/21/2011
8
设备环境类CDC 设备环境类
MFC封装了 ,提供 封装了DC,提供CDC 类及它的子类以 封装了 访问GDI。 访问 。 CDC类派生自 类派生自CObject类,其子类包括 类派生自 类
CClientDC CObject CMetaFileDC CPaintDC CWindowDC
CClientDC dc(this); CWindowDC dc(this);
3/21/2011
14
CClientDC、CPaintDC和CWindowDC的区别 、 和 的区别
当窗口的某个区域需要重绘时激发窗口重绘消息WM_PAINT,相应消息 , 当窗口的某个区域需要重绘时激发窗口重绘消息 处理函数CWnd::OnPaint将被调用。CPaintDC一般只用于 将被调用。 一般只用于OnPaint函数 处理函数 将被调用 一般只用于 函数 在处理完窗口重绘后, 对象的析构函数把WM_PAINT消 中,在处理完窗口重绘后, CPaintDC对象的析构函数把 对象的析构函数把 消 息从消息队列中清除,避免不断地重绘操作。坐标原点(0,0)是客户区的 息从消息队列中清除,避免不断地重绘操作。坐标原点 是客户区的 左上角。 左上角。 CClientDC用于特定窗口客户区(窗口中除边框、标题栏、菜单栏、状 用于特定窗口客户区( 用于特定窗口客户区 窗口中除边框、标题栏、菜单栏、 态栏外的中间部分)的输出,其构造函数中包含了GetDC,析构函数中包 态栏外的中间部分)的输出,其构造函数中包含了 析构函数中包 含了ReleaseDC,不需要显式释放 资源。一般用于响应非重绘消息 资源。 含了 ,不需要显式释放DC资源 如键盘和鼠标消息)的绘图操作。坐标原点(0,0)是客户区的左上角。 是客户区的左上角。 (如键盘和鼠标消息)的绘图操作。坐标原点 是客户区的左上角 CWindowDC在整个应用程序窗口上画图,而CClientDC和CPaintDC只 在整个应用程序窗口上画图, 在整个应用程序窗口上画图 和 只 能在客户区绘制图形;除非要自己绘制窗口边框和按钮, 能在客户区绘制图形;除非要自己绘制窗口边框和按钮,否则一般不用 坐标原点(0,0)是屏幕的左上角。 是屏幕的左上角。 它。坐标原点 是屏幕的左上角