实验一 直线的绘制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档