心得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: