实验一 直线的绘制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一直线的绘制
【实验目的】
1、熟悉VC++ 6.0开发环境;
2、掌握利用应用程序向导生成文档/视图结构应用程序的步骤;
3、掌握利用鼠标绘制直线的原理和实现方法;
4、定制程序资源。
【实验要求】
实验前认真预习MFC编程的基本特点和方法,在进行实验时,应注意爱护机器,按照试验指导书的要求的内容和步骤完成实验,尤其应注意认真观察实验结果,做好记录;实验完成后应认真撰写实验报告。
请保存好本次程序代码,下次实验在本次程序基础上继续。
【实验要点】
简单绘图程序MiniDraw用应用程序向导生成程序的基本外壳后,在视图类中加入读取用户的鼠标输入和在视图窗口内画直线的代码。用ClassWizard生成处理鼠标输入消息和定制视图窗口的函数,并用资源编辑器修改程序菜单和设计程序图标。
【实验步骤】
一、利用应用程序向导生成单文档/视图结构(SDI)的应用程序MiniDraw程序。
二、定义和初始化视图类数据成员
在视图类中加入几个成员:数据成员m_ClassName、m_Dragging、m_HCross、m_PointOld 和m_PointOrigin。在CMiniDrawView类定义开头加入标为黑体的语句:
class CMiniDrawView : public CView
{
protected:
CString m_ClassName;
int m_Dragging;
HCURSOR m_HCross;
CPoint m_PointOld;
CPoint m_PointOrigin;
protected: // create from serialization only
CMiniDrawView();
DECLARE_DYNCREATE(CMiniDrawView)
对m_Dragging和m_HCross数据成员初始化(在CMiniDrawView类构造器中)。
/////////////////////////////////////////////////////////////////////////////
// CMiniDrawView construction/destruction
CMiniDrawView::CMiniDrawView ()
{
// ToDo: add construction code here
m_Dragging = 0;
m_HCross = AfxGetApp ()->LoadStandardCursor (IDC_CROSS);
}
m_HCross存放在视图窗口内显示的鼠标光标的句柄。调用AfxGetApp取得应用程序类对象的指针,以调用CWinApp成员函数LoadStandardCursor,它传送标示符IDC_CROSS,返回标准十字形鼠标光标的句柄。
表1.1 可传入LoadStandardCursor函数的表示标准Windows光标的数值
说明:AfxGetApp是全局MFC函数,不是类的成员。MFC中有许多全局MFC函数,以Afx头。
三、加入消息处理功能
为使用户用鼠标在显示窗口内画直线,程序必须响应窗口内产生的鼠标事件。为处理鼠标输入,必须在视图类中加入处理发送到视图窗口的鼠标消息的成员函数。
1、OnLButtonDown函数
定义处理WM_LBUTTONDOWN消息的消息处理函数。鼠标光标在显示窗口内时,用户按下左鼠标键即发出这个消息。步骤如下:
1.选择View菜单的ClassWizard命令或按Ctrl + W,出现ClassWizard对话框。
2.单击Message Maps标签,打开ClassWizard对话框中定义成员函数的部分。
3.在Class name:清单中选择CMiniDrawView类以在视图类中加入消息处理函数。
4.选择Object IDs:清单的CMiniDrawView项目。
5.在Message:中选择WM_LBUTTODOND。这是要定义的函数处理的消息的标识
符。Message清单中包含可以发送到视图窗口的各类通知消息的标识符。消息标识
符以WM开头且全部大写。
6.单击Add Function按钮。C1assWizard生成消息处理成员函数的基本代码,名为
OnLButtonDown。ClassWizard在文件MiniDrawView.cpp中插入最小函数定义,
并将函数加进类消息映象中。完成的C1assWizard对话框如图1.1所示。
图1.1 定义WM_LBUTTONDOWN消息处理器时完成的ClassWizard对话框
7.单击Edit Code按钮,ClassWizard打开文件MiniDrawView.cpp并显示刚刚生成的
函数OnLButtonDown。
8.在OnLButtonDown中加入标黑体的语句:
void CMiniDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_PointOrigin = point;
m_PointOld = point;
SetCapture ();
m_Dragging = 1;
RECT Rect;
GetClientRect (&Rect);
ClientToScreen (&Rect);
::ClipCursor (&Rect);
CView::OnLButtonDown(nFlags, point);
}
光标在视图窗口内,用户按左鼠标键时,OnLButtonDown函数接到该事件,point参数包含光标的当前位置。
加进的代码将这个位置存到m_PointOrigin和m_PointO1d数据成员中。m_PointOrigin 存放左键按下的点坐标,将是所画直线的起点。m_PointO1d供其他鼠标消息处理器获得前一鼠标消息的鼠标位置。
说明:C1assWizard向OnLButtonDown函数中加入了一行调用基本类中定义的OnLButtonDown版本的代码。这是通常要做的,便于基本类完成需要的缺省消息处理。
调用CWnd成员函数SetCapture捕获鼠标,即所有后续鼠标消息都发送到视图窗口(直到放弃捕获)。这样,发生拖动操作时视图窗口充分控制鼠标。
说明:CMiniDrawView是直接从CWnd MFC类继承的,继承了所有CWnd的成员函数(CWnd派生CView,又派生CMiniDrawView)。
余下代码用于将鼠标限制在显示窗口内,使用户不会到窗口外画直线。调用CWnd::GetClientRect取得显示窗口当前坐标,CWnd::ClienToScreen将坐标换算为屏幕坐标,::ClipCursor将鼠标光标限定在指定的屏幕坐标内,从而保证光标在显示窗口内。
说明:::ClipCursor是Win32应用程序接口(API)提供的函数而不是MFC提供的。由于它是全局函数,名称前面用作用域操作符(::)。除非全局函数被同名的成员函数掩盖,否则并不需要这个作用域操作符。用作用域操作符表示该函数不属于MFC。
2、OnMouseMove函数
用户在显示窗口内移动鼠标光标时,窗口收到一系列WM_MOUSEMOVE消息,报告光标的当前位置,用ClassWizard生成消息处理函数的外壳。
完成的C1assWizard对话框如图1.2。