Windows 消息及MFC的处理方式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

wcex.cbSize = sizeof(wcex); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = MyWindowProc; wcex.hInstance = g_hInstance; wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1); wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); wcex.lpszClassName = _T("MainWindow"); return RegisterClassEx(&wcex);
消息处理
?窗口处理函数中的 窗口处理函数中的 switch-case结构如何封装 结构如何封装? 结构如何封装
►消息处理函数 (message handler) ►MFC下的消息映射机制 (Map) 下的消息映射机制 ) ►CCmdTarget 命令目标类:可映射消息 命令目标类: CWnd, CDocument, CWinApp, … ►标准Windows消息 窗口对象 CWnd 标准Windows消息 Windows 命令目标链 CCmdTarget类 ►命令消息 命令目标链, CCmdTarget类
►常规的命令目标发送顺序
参阅木林森书: 参阅木林森书:p101! !
►CCmdTarget::OnCmdMsg() 可修改路径
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
按照命令路径描述的命令目标链进行处理。 按照命令路径描述的命令目标链进行处理。 命令目标链进行处理
SDK中消息的处理
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • LRESULT CALLBACK MyWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) ATOM CMainWindow::Register() { case WM_CREATE: { ... WNDCLASSEX wcex = { 0 }; break; case WM_DESTROY: ... break; case WM_SETCURSOR: ... break; case WM_INITMENU: ... break; case WM_COMMAND: ... break; }
CWnd的消息映射已经含有所有标准 的消息映射已经含有所有标准Windows消息 的消息映射已经含有所有标准 消息 的处理函数,完成默认的操作。 的处理函数,完成默认的操作。 CWnd{ … afx_msg void OnPaint(); … }
需完成特定的操作行为, 若CMyWnd需完成特定的操作行为,需增加消息处 需完成特定的操作行为 需增加消息处 理函数入口。消息处理函数名本质上是CWnd的函数重 的函数重 理函数入口。消息处理函数名本质上是 必须严格按照基类的函数定义。 载,必须严格按照基类的函数定义。 CChildView: CWnd{… afx_msg void OnPaint();}
DECLARE_MESSAGE_MAP()
MFC下的消息映射机制(2) 下的消息映射机制( ) 下的消息映射机制
►消息映射的结构
消息类型 标准Windows 标准 命令 更新命令 用户自定义命令 命令ID范围 命令 范围 宏格式 ON_WM_xxxx ON_COMMAND ( 命令 函数名 ) 命令ID,函数名
Windows 消息及MFC的处理方 式
事件为驱动、消息机制
• Windows程序和DOS程序的主要不同点之一是: Windows程序是以事件为驱动、消息机制为基础。如何理 解? 举了例子,当你CLICK Windows “开始”BUTTON时,为 什么就会弹出一个菜单呢? 当你单击鼠标左键时,操作系统中与MOUSE相关的驱动 程序在第一时间内得到这个信号[LBUTTONDOWN],然 后它通知操作系统―――“嗨,鼠标左键被单击了!”, 操作系统得到这一信号后,马上要判断――用户单击鼠标 左键,这是针对哪个窗口呢?如何判断?这很简单!当前 状态中,具有焦点的窗口[或控件]就是了[这里当然是 “开始”BUTTON了]。然后操作系统马上向这个窗口发 送一条消息到这个窗口所在进程的消息队列,消息内容应 是消息本身的代号、附加参数、窗口句柄…等等
►基本结构
CCHildView.h CCHildVieP(CChildView ,CWnd ) //{{AFX_MSG_MAP(CChildView) ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP()
//{{AFX_MSG(CChildView) afx_msg void OnPaint(); //}}AFX_MSG
ON_UPDATE_COMMAND_UI (命令 函数名 命令ID,函数名 命令 函数名) ON_MESSAGE ( 自定义消息 函数名 ) 自定义消息ID,函数名 ON_COMMAND_RANGE
标准Windows消息 消息 标准
消息直接由相关窗口进行处理。 ►标准Windows消息直接由相关窗口进行处理。 标准 消息直接由相关窗口进行处理 ►标准Windows消息的处理函数 标准 消息的处理函数
继承类中的消息处理函数优先。 继承类中的消息处理函数优先。
命令消息: 命令消息:命令目标链
►命令消息可以在各种CCmdTarget类中处理 命令消息可以在各种 类中处理
// 窗口类 窗口、视图 ,WinApp, Document类、文档模板类 窗口类(窗口 视图), 窗口、 类 系统将命令发给多个候选的命令目标; 系统将命令发给多个候选的命令目标;按照优先级形成命令 目标链; 目标链; 处理时,按照优先级查找,是否有映射? 处理时,按照优先级查找,是否有映射?先遇到的映射函数 得以执行! 得以执行!
}
return DefFrameProc( hWnd, that == NULL ? NULL : that->m_hMDIClient, uMsg, wParam, lParam ); }
MFC下的消息映射机制(1) 下的消息映射机制( ) 下的消息映射机制
►消息映射
所谓消息映射, 所谓消息映射,就是将命令或消息与消息处理函数相 联系。 联系。
相关文档
最新文档