Visual C++ MFC的图形绘制
1. 带菜单界面制作
新建一个单文档类型的MFC AppWizard (exe)工程,工程取名为:Graphic。为此程序添加一个子菜单,菜单名称为“绘图”,并为其添加六个菜单项,分别用来控制不同图形的绘制。当用户选择其中的一个菜单项后,程序将按照当前的选择进行相应图形的绘制。添加的六个菜单项的ID及名称如表1所示。然后分别为这六个菜单项添加命令响应,本程序让视类(CGraphicView)对这些菜单命令进行响应,这六个响应函数的名称分别如表1所示
1.启动Visual C++6.0后,打开【File】(文件)菜单下的【New】(新建)菜单项,选择Project(工程)项。然后选择“MFC AppWizard(exe)”选项,在右边的对话框Project name(工程名称)中输入“Graphic”,在接下来的步骤中依次选择“多重文档”,然后单击【Finish】(完成)按钮。
进来之后
第3步就改一下属性名称就可以了,然后下面就会出现一个方框,同样的点进去,ID,标明直接复制老师给的文档里面的就可以了(有一个会报错,IDM-RECTANGLE,这个不是-而是下滑线_,IDM_RECTANGLE)
全部加完之后就是这样的
然后在对话框空白处单击右键,选择“ClassWizard”(建立类向导)选项,显示如下所示的“MFC Class Wizard”对话框,选择“Member Maps”选项卡,在“Object Ids”中可以看到对话框界面上的按钮和文本框的ID。选择“IDM_DOT”,单击【Add Variable】,为“IDC_Dot”添加变量(下面几个IDM_XXX,都按上述步骤添加变量)如图:
全都填加完后点确定。
然后在FileView–>Header Files
–>GraphicView.h(双击),添加一个私有变量,如图:
然后在FileView–>Header Files
–>GraphicView.cpp(双击),找到CGraphicView::CGraphicView()函数,进行初始化
加完之后往下滑 或者 在Class View
–>CGraphicView–>OnDot()(双击)
从OnDot()开始往下选中,换成如下代码
void CGraphicView::OnDot()
{
m_nDrawType=1;
}
void CGraphicView::OnLine()
{
m_nDrawType=2;
}
void CGraphicView::OnRectangle()
{
m_nDrawType=3;
}
void CGraphicView::OnEllipse()
{
m_nDrawType=4;
}
void CGraphicView::OnShanxing()
{
m_nDrawType=5;
}
void CGraphicView::OnLianxuxian()
{
m_nDrawType=6;
}
第一步就算完成了。
2. 点、直线、矩形、椭圆的绘制
对于直线、矩形和椭圆,在绘制时都可有两点来确定其图形。当鼠标左击时得到一个点,当鼠标左键松开时得到另外一个点。为视类CGraphicView分别捕获鼠标左键按下和弹起这两个消息。另外当鼠标左键按下时,需要将鼠标当前按下点保存,因此我们为CGraphicView再增加一个CPoint类型的私有成员变量:m_ptOrigin,在视类的构造函数中将此变量初始化为0。在鼠标按下消息响应函数中,保存该点。
在对话框空白处单击右键,选择“ClassWizard”(建立类向导)选项,显示如下所示的“MFC Class Wizard”对话框,选择“Member Maps”选项卡,在“Object Ids”中选
CGraphicView,在Messages里面找到WM_LBUTTONDOWN—>Add Function
再WM_LBUTTONUP–>Add Function(这两个就是鼠标按下跟弹起)
如图:
然后在FileView–>Header Files
–>GraphicView.h(双击),再添加一个私有变量,如图:
然后在FileView–>Header Files
–>GraphicView.cpp(双击),找到CGraphicView::CGraphicView()函数,进行初始化
初始化后,直接往下滑到最底,把这两个函数
改为
void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOrigin=point; //保存鼠标按下得到点,也是绘制一个点
CView::OnLButtonDown(nFlags, point);
}
在鼠标左键弹起消息响应函数中实现绘图,代码如下:
void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//创建并获得设备描述
CClientDC dc(this);
switch (m_nDrawType)
{
case 1:
dc.SetPixel(point,RGB(255,0,0)); /*绘制点*/
break;
case 2: /*绘制直线*/
dc.MoveTo(m_ptOrigin);/*调用MoveTo函数移动到原点*/
dc.LineTo(point);/*调用LineTo函数绘制到终点。*/
break;
case 3: /*绘制矩形*/
dc.Rectangle(CRect(m_ptOrigin,point));
break;
case 4: /*绘制椭圆*/
dc.Ellipse(CRect(m_ptOrigin,point));
break;
CView::OnLButtonUp(nFlags, point);
}
}
如果你复制Word文档里面的代码,会有报错
位置1:括号要改成英文的
位置2:少了一个反括号
改完后,大家就可以编译运行(Ctrl+F5)了,(因为只有四个函数,所以扇形跟连续线没有实现是画不出来的)
如图:
刚刚有人问我#include"stdafx.h",报错怎么解决。
具体方法还没研究出来,不过有的同学吧这个改成#include"StdAfx.h"就解决了
还有一个方法就是,打开StdAfx.cpp,编译一下(报错不管),关掉这个cpp,再编译一开始那个就解决了