目录
一.常见问题
1. 菜单界面制作
2.命令响应函数
3.添加私有变量
4.消息响应函数
二.后记
三.补充代码
题目描述:新建一个单文档类型的MFC AppWizard (exe)工程,工程取名为:Graphic。为此程序添加一个子菜单,菜单名称为“绘图”,并为其添加六个菜单项,分别用来控制不同图形的绘制
分析:从题中可以得知,需要做一个菜单,并添加相应的子菜单
常见问题:1.新建一个菜单,做一个水平菜单栏,并添加六个菜单项(如图)
发现报错,修改,完成(机智如我,骄傲.jpg)
示例写法:在原菜单的基础下,建立菜单(命名为绘图),并建立6个子菜单。(这里我写个7的子菜单)
问题描述:当用户选择其中的一个菜单项后,程序将按照当前的选择进行相应图形的绘制。添加的六个菜单项的ID及名称。然后分别为这六个菜单项添加命令响应,本程序让视类(CGraphicView)对这些菜单命令进行响应。代码如下:
void CGraphicView::OnDot(){....................}
分析:在CGraphicView类中,添加相对应的命令响应函数
常见问题:1.默认类是CMainFrame,而这里需要用CGraphicView类 (错了的,回去面壁吧!)
问题描述:在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。因此在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;
}
问题描述:对于直线、矩形和椭圆,在绘制时都可有两点来确定其图形。当鼠标左击时得到一个点,当鼠标左键松开时得到另外一个点。为视类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);
}
}