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

心得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 commands
	ON_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_MSG
	DECLARE_MESSAGE_MAP()

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

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

void CGraphicView::OnDot() 
{
	// TODO: Add your command handler code here
	m_nDrawType=1;
}

void CGraphicView::OnLine() 
{
	// TODO: Add your command handler code here
	m_nDrawType=2;
}

void CGraphicView::OnRectangle() 
{
	// TODO: Add your command handler code here
	m_nDrawType=3;
}

void CGraphicView::OnEllipse() 
{
	// TODO: Add your command handler code here
	m_nDrawType=4;
}


 

心得4:


 

你可能感兴趣的:(孙鑫MFC学习心得:Lesson10:图形的绘制)