孙鑫MFC学习心得:Lesson10:图形的绘制

来源:互联网 发布:linux 启动ftp服务 编辑:程序博客网 时间:2024/06/01 09:37

心得1:在框架窗口中无法响应鼠标单击事件。 在CMainFrame类上右键Add Windows Message Hander… -> WM_LBUTTONDOWN -> Add And Edit.在CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)函数中添加: MessageBox("MainFrame Clicked"); 运行,点击鼠标没反应,是因为客户窗口总是在框架窗口之上,因此在这里框架窗口没法响应鼠标单击事件。因此响应事件一般都写在客户窗口中。

注意:框架窗口不能响应的是标准消息。对于点击菜单栏的命令消息,可以被框架窗口响应。

实际上,对于来自菜单栏的命令消息,所有从CCmdTarget派生类来的类都可以响应,只是有一个消息捕获的先后顺序问题。。而对于标准消息,只能被某个窗口响应,即只能被CWnd派生来的窗口类所响应。

心得2:给类添加成员变量时,不能忘了在该类的成员变量中给该变量初始化。

心得3:MFC的消息映射机制:看一下代码:

BEGIN_MESSAGE_MAP(CGraphicView, CView)//{{AFX_MSG_MAP(CGraphicView)ON_COMMAND(IDM_DOT, OnDot)ON_COMMAND(IDM_LINE, OnLine)ON_COMMAND(IDM_RECTANGLE, OnRectangle)ON_COMMAND(IDM_ELLIPSE, OnEllipse)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()

这是在类的源文件(.CPP)中,一般放在源文件的开头位置。在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间(一对注释宏之间)的代码实现了消息映射。消息映射就是消息与响应它的函数之间的映射。

以ON_COMMAND开头的几个消息映射是点击菜单项后发出的WM_COMMAND消息与消息响应函数之间的映射:在ON_COMMAND后的两个参数中,第一个参数是菜单项的ID,第二个参数是相应的响应函数。

另外两个消息映射

ON_WM_LBUTTONDOWN()
 ON_WM_LBUTTONUP()

ON_后面是Windows标准消息名(在Add Windows Message Handler中添加),由于系统默认Windows消息对应的函数为:如WM_LBUTTONDOWN的响应函数为OnLButtonDown,因此后面没有参数。

建立了消息与其响应函数之间的映射以后,我们就要去实现该响应函数。

实现分为两步:

第一步:在类的头文件中(一般在头文件末尾)对函数进行声明

protected://{{AFX_MSG(CGraphicView)afx_msg void OnDot();afx_msg void OnLine();afx_msg void OnRectangle();afx_msg void OnEllipse();afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnTest();//}}AFX_MSGDECLARE_MESSAGE_MAP()

声明的具体位置在DECLARE_MESSAGE_MAP之前,一对注释宏之间。声明时要在前面加上afx_msg.另外,一般来说,返回值都是void。

第二步:在类的源文件(.cpp)中实现对函数的定义。在这里不能在函数头部加上asx_msg了。 

void CGraphicView::OnDot() {// TODO: Add your command handler code herem_nDrawType=1;}void CGraphicView::OnLine() {// TODO: Add your command handler code herem_nDrawType=2;}void CGraphicView::OnRectangle() {// TODO: Add your command handler code herem_nDrawType=3;}void CGraphicView::OnEllipse() {// TODO: Add your command handler code herem_nDrawType=4;}


 

心得4:


 

原创粉丝点击