- 1、本文档共24页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MFC中自由使用自定义消息
??? 消息映射、循环机制是Windows程序运行的基本方式。VC++ MFC 中有许多现成的消息句柄,可当我们需要完成其它的任务,需要自定义消息,就遇到了一些困难。??? 在MFC ClassWizard中不允许添加用户自定义消息,所以我们必须在程序中添加相应代码,以便可以象处理其它消息一样处理自定义消息。通常的做法是采取以下步骤: 第一步:定义消息。 推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。#define WM_MY_MESSAGE (WM_USER+100)? 第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。 LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam) { ??? // TODO: 处理用户自定义消息 ??? ... ??? return 0; }? 第三步:在类头文件的AFX_MSG块中说明消息处理函数:class CMainFrame:public CMDIFrameWnd { ??? ... ??? // 一般消息映射函数 ??? protected: ??? // {{AFX_MSG(CMainFrame) ??? afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); ??? afx_msg void OnTimer(UINT nIDEvent); ??? afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); ??? //}}AFX_MSG ??? DECLARE_MESSAGE_MAP() } 第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。 BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ??? ON_WM_CREATE() ??? ON_WM_TIMER() ??? ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage) //}}AFX_MSG_MAP END_MESSAGE_MAP() ? 如果用户需要一个定义整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage定义消息:static UINT WM_MY_MESSAGE=RegisterWindowMessage(User); 并使用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。 当需要使用自定义消息时,可以在相应类中的函数中调用函数PostMessage或SendMessage发送消息PoseMessage(WM_MY_MESSAGE,O,O); 如果向其他进程发送消息可通过如下方法发送消息:DWORD result;SendMessageTimeout(wnd-m_hWnd, // 目标窗口?????????????????? WM_MY_MESSAGE, // 消息?????????????????? 0, // WPARAM?????????????????? 0, // LPARAM?????????????????? SMTO_ABORTIFHUNG |?????????????????? SMTO_NORMAL,?????????????????? TIMEOUT_INTERVAL,?????????????????? result); 以避免其它进程如果被阻塞而造成系统死等状态。??? 可是如果需要向其它类 (如主框架、子窗口、视类、对话框、状态条、工具条或其他控件等发送消息时上述方法显得无能为力,而在编程过程中往往需要获取其它类中的某个识别信号框架给我们造成了种种限制,但是可以通过获取某个类的指针而向这个类发送消息,而自定义消息的各种动作则在这个类中定义,这样就可以自由自在的向其它类发送消息了。?
下面举的例子叙述了向视类和框架类发送消息的方法:★在主框架类中向视类发送消息:1.视类中定义消息:ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage) //定义消息映射
2.视类定义消息处理函数:LRESULT CMessageView::OnMyMessage(WPARAM wParam, LPARAM lParam){??? // TO
文档评论(0)