Visual C++ MFC的图形绘制——常见问题汇总(不定期更新)

                  Visual C++ MFC的图形绘制——常见问题汇总

目录

一.常见问题

1. 菜单界面制作

2.命令响应函数 

3.添加私有变量

4.消息响应函数

二.后记

三.补充代码


一.常见问题

1. 菜单界面制作

题目描述:新建一个单文档类型的MFC AppWizard (exe)工程,工程取名为:Graphic。为此程序添加一个子菜单,菜单名称为“绘图”,并为其添加六个菜单项,分别用来控制不同图形的绘制

分析:从题中可以得知,需要做一个菜单,并添加相应的子菜单

常见问题:1.新建一个菜单,做一个水平菜单栏,并添加六个菜单项(如图)

            发现报错,修改,完成(机智如我,骄傲.jpg)

示例写法:在原菜单的基础下,建立菜单(命名为绘图),并建立6个子菜单。(这里我写个7的子菜单)

2.命令响应函数 

问题描述:当用户选择其中的一个菜单项后,程序将按照当前的选择进行相应图形的绘制。添加的六个菜单项的ID及名称。然后分别为这六个菜单项添加命令响应,本程序让视类(CGraphicView)对这些菜单命令进行响应。代码如下:

void CGraphicView::OnDot(){....................}

分析:在CGraphicView类中,添加相对应的命令响应函数 

常见问题:1.默认类是CMainFrame,而这里需要用CGraphicView类 (错了的,回去面壁吧!)

3.添加私有变量

问题描述:在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。因此在CGraphicView类中添加一个私有变量m_nDrawType;用来保存用户的选择,该变量的定义如下所述:

private:    UINT m_nDrawType;

接着,在视类的构造函数中将此变量初始化为0

m_nDrawType=0;

分析:找到CGraphicView.h文件添,添加私有变量m_nDrawType;然后在CGraphicView.cpp中 对私有变量 初始化

常见问题:1.找不到位置;2.格式 (写法不唯一,也可以鼠标右键添加变量)

示例写法:1.对 CGraphicView.h 文件操作


class CGraphicView : public CView //添加私有变量 类 的位置
{
////////////////////////// 上面的部分代码删去////////////////////////////////////
protected:
	//{{AFX_MSG(CGraphicView)
	afx_msg void OnDot();
	afx_msg void OnLine();
	afx_msg void OnRectangle();
	afx_msg void OnEllipse();
	afx_msg void OnShanxing();
	afx_msg void OnLianxuxian();
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg void OnXiantiao();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
///////////////// 添加private变量 //////////////////////////////////////////////
/////////////////////// 格式 ///////////////////////////////////////////////////
////////////////  private:  	////////////////////////////////////////////////
///////////////      UINT m_nDrawType;    //////////////////////////////////////
private:
	UINT m_nDrawType;
	CPoint m_ptOrigin;
	CPoint m_ptOld;
	BOOL m_bDraw;//设置为私有类型,true代表鼠标点下,false代表鼠标谈起
};

          2.对 CGraphicView.cpp 文件操作

CGraphicView::CGraphicView()  // 初始化 类 的位置
{
	// TODO: add construction code here

	m_nDrawType=0;  //初始化
	m_ptOrigin=0;
	m_ptOld=0;
	m_bDraw=FALSE;
}

 4.消息响应函数

问题描述:对于直线、矩形和椭圆,在绘制时都可有两点来确定其图形。当鼠标左击时得到一个点,当鼠标左键松开时得到另外一个点。为视类CGraphicView分别捕获鼠标左键按下和弹起这两个消息。在鼠标按下消息响应函数中,保存该点,代码如下:

void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point){ ....................... }

void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point) { .......................... }

分析:在CGraphicView类中添加鼠标消息响应函数

常见问题:1.找不到鼠标消息响应函数在哪里,不知道如何添加(迷茫.jpg)

                  2.新建 OnLButtonDown(UINT nFlags, CPoint point)和OnLButtonUp(UINT nFlags, CPoint point)

                    的函数(机智.jpg)  写完后,不报错,运行没反应(疑惑.jpg)

                  3.知道如何添加消息响应函数,鼠标左键 写成 鼠标右键

                     写完后,不报错,鼠标左键没反应,右键有反应。(鼠标左键表示:这锅我不背!)

示例写法:1. 建立类向导(快捷键 Ctrl+W)

                 2 .确认 Object IDs: 和 Class name; 并在 Messages  中双击 WM_LBUTTONBOWN ,最后点击确认

                           3. 重复上面步骤 添加WM_LBUTTONUP 

二.后记

本文感谢,沉迷贪玩蓝月的学委,班级扛把子学霸哥,Zombie,徐不帅 等提供各种错误案例(真机智.jpg)。

原本并不想写这篇博文,但鉴于出现的问题过于奇怪,并在 班级扛把子学霸哥 的游说下 ,写下篇文章(我是不是上当了,脑阔疼,jpg),并保持不定期更新。

还是那就话,本人水平有限,才学不高;难免有问题,发现问题请发消息。

 

三.补充代码

void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	//创建并获得设备描述
	CClientDC dc(this); 
	switch (m_nDrawType)
	{
	case 5:  
		m_bDraw=FALSE;//新加/*绘制扇形*/
		break;
    case 6:        /*绘制连续线*/
		dc.MoveTo(m_ptOrigin);/*调用MoveTo函数移动到原点*/
		dc.LineTo(point);/*调用LineTo函数绘制到终点。*/
		m_ptOrigin = point;
		break;
	case 7:        /*绘制线条*/
		break;
	CView::OnLButtonUp(nFlags, point);
	}

}

////////////////////////////////////////////////////////////
void CGraphicView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	////////////   5. 扇形   ////////////////////////
	CClientDC dc(this);  

    CPen pen(PS_SOLID,1,RGB(255,0,0)); //建立画笔 大小1 颜色 红色
    CPen *pOldPen=dc.SelectObject(&pen);// 选择画笔

	switch (m_nDrawType)
	{
	case 5:  
    if(m_bDraw==TRUE)
    {
        dc.MoveTo(m_ptOrigin);
        //dc.LineTo(m_ptOld);//带边框
		//dc.MoveTo(m_ptOld);//带边框
        dc.MoveTo(m_ptOrigin);
        dc.LineTo(point);
        //m_ptOld=point; //带边框
    }
    dc.SelectObject(pOldPen); //调用画笔
	break;
    /////////////////   7. 连续线条  /////////////////////////////
	case 7:  
    if(m_bDraw==TRUE)
    {
        dc.MoveTo(m_ptOrigin);
        dc.LineTo(point);
        m_ptOrigin=point;
    }
    dc.SelectObject(pOldPen);
	break;

	CView::OnMouseMove(nFlags, point);
	}
}

猜你喜欢

转载自blog.csdn.net/DUGUjing/article/details/84031021