欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

第05章笔记

发布时间:2025/3/20 编程问答 37 豆豆
生活随笔 收集整理的这篇文章主要介绍了 第05章笔记 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

主要内容:

使程序能够响应菜单事件和鼠标事件(按下左键、移动、松开左键)。


关于事件:

视窗程序通过事件进行用户进行交互。当用户进行单击鼠标、选择菜单、按下键盘等操作时都会产生一个事件。在程序中,我们需要:1,为指定的事件编写处理程序;2.将事件处理程序进行注册。


编写事件处理程序

编写事件处理程序其实就是为处理事件的类添加一个方法(即成员函数)。在MFC中,无论是视窗框架类(如CFrameWnd,CMDIFrameWnd,CMDIChildWnd),还是文档类,或者视图类,都可以处理事件,我们只需要在类中添加相应的方法即可。

由于事件处理程序是特殊的方法,所以事件处理程序必须要以afx_msg开头


事件处理程序注册

要处理事件的类,在类体中除了要添加负责处理事件的方法外,还要:1,在类体中添加以下宏DECLARE_MESSAGE_MAP();2,在类体外添加事件处理程序注册宏,格式如下:

BEGIN_MESSAGE_MAP(类名,父类名)

    具体的事件注册宏

END_MESSAGE_MAP()


有一些事件,如:单击鼠标、移动鼠标等,被称为系统消息,其特点是:1,处理该类事件的方法声明是由系统固定的,如移动鼠标的方法声明是:afx_msg void OnMouseMove(UINT nFlags, CPoint point);2,在注册该类事件时,都是以ON_WM开头的,如移动鼠标的事件注册为:ON_WM_MOUSEMOVE()。

而对于有一些操作,例如选择菜单,虽然动作都是单击,但是由于不同的菜单项需要不同的处理函数,所以对于此类方法来说:1,处理事件的函数名是可以自己定义的;2,注册事件的宏名是固定的,如选择菜单的注册事件宏是:ON_COMMAND;3,需要给事件处理宏添加2个参数,第一个参数是发生事件的资源ID,第二个是参数是处理在资源上指定事件的函数名。

例如:在菜单中有一个菜单项“Test”,其ID为:IDM_TEST,其事件处理函数的声明是:afx_msg void OnTest(),则其事件注册宏为:ON_COMMAND(IDM_TEST, OnTest)。


示例程序:

创建一个简单的视窗程序,程序有一个简单的菜单“File”,有两个菜单项:“Exit1”和“Exit”。

菜单项
资源ID
功能
Exit1
IDM_EXIT
显示提示信息后退出程序。
Exit
ID_APP_EXIT
退出程序。

其中:ID_APP_EXIT是系统提供的资源ID,功能是退出程序,无需用户自己编程。而IDM_EXIT是用户自定的资源ID,需要自己添加处理程序。

在程序窗口中按下鼠标左键移动时,会在窗口中绘制红色的点。


主要事件分析:

1:单击”Exit1“菜单时,调用程序,显示对话框并退出程序。

2:在视窗中,按下鼠标,开始捕捉鼠标轨迹。

3:按住左键移动鼠标时,绘制红色的点。

4:松开鼠标时,结束捕捉。


程序代码:

#include <afxwin.h> #include "Message.h"class CMyFrame : public CFrameWnd { private:CMenu *pMenu; public:CMyFrame(){Create(NULL, "Hello MFC");pMenu = new CMenu;pMenu->LoadMenu(IDR_MENU1);SetMenu(pMenu);}~CMyFrame(){delete pMenu;}afx_msg void OnExit()//事件处理函数必须以afx_msg开头{MessageBox("Exit1");DestroyWindow();}afx_msg void OnLButtonDown(UINT nFlags, CPoint point)//系统消息的方法声明是固定格式的{SetCapture();}afx_msg void OnMouseMove(UINT nFlags, CPoint point){if(GetCapture() == this){CClientDC aDC(this);aDC.SetPixel(point, RGB(255, 0, 0));}}afx_msg void OnLButtonUp(UINT nFlags, CPoint point){ReleaseCapture();}DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMyFrame, CFrameWnd)ON_COMMAND(ID_Exit1, OnExit)ON_WM_LBUTTONDOWN()ON_WM_MOUSEMOVE()ON_WM_LBUTTONUP() END_MESSAGE_MAP()class CMyApp : public CWinApp { public:BOOL InitInstance(){CFrameWnd *pFrame = new CMyFrame;m_pMainWnd = pFrame;pFrame->ShowWindow(SW_SHOW);return true;} }a_app;

。。。

转载于:https://blog.51cto.com/3677403/1655304

总结

以上是生活随笔为你收集整理的第05章笔记的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。