Windows自定义消息: Windows应用程序利用格式化的Windows消息来与其他Windows应用程序及Windows系统进行通信,这些消息被发往应用程序的窗口函数进行处理。由于Windows应用程序是消息或事件驱动的,因此必须了解Windows消息的有关概念。表9.5所示为Windows的消息范围。
表9.5 Windows的消息范围
表9.5中WM_USER的值为0x0400,用户的自定义消息应该处在第二段。 建立自定义消息的操作步骤为: ①定义自己的窗口消息(定义消息标识符); ②在适当的位置声明消息处理函数; ③将消息处理函数与消息对应起来(映射消息); ④编写代码实现该消息处理函数; ⑤利用消息函数向指定的窗口发送消息。 【例9.5】 本程序实现利用自定义消息实现启动Windows系统“附件”中的“画图”程序。本程序练习自定义消息、消息的发送、消息映射、消息的响应。其具体实现步骤为: (1)生成应用程序框架 利用应用程序向导MFC AppWizard创建一个单文档的应用程序框架,该工程的名称为DefinedMsg,每个步骤都使用默认的选项。 (2)声明白定义的消息处理函数 在DefinedMsgView.h文件中声明 自定义的消息处理函数OnMyMessage,如图9.5所示。OnMyMessage函数的原型如下:
LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
图9.5 函数OnMyMessage原型
(3)建立消息映射 在DefinedMsgView.cpp文件中把WM_MYMESSAGE和OnMyMessage关联起来,即建立消息映射(把消息WM_MYMESSAGE映射到函数OnMyMessage,即应用程序接收到消息WM_MYMESSAGE时,执行其对应的消息映射函数OnMyMessage),如图9.6所示。
ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
图9.6添加消息映射
(4)编写代码实现消息映射函数OnMyMessage
LRESULT CDefinedMsgView::OnMyMessage(WPARAM wParam, LPARAM lParam) { charMsPaintFile[255]; //存放画图程序的路径 UINT uSize=255; GetSystemDirectory(MsPaintFile, uSize); //调用API函数GetSystemDirectory()取得Windows的系统目录 strcat(MsPaintFile, "\\mspaint"); //取得画图程序的完整路径 ShellExecute(m_hWnd,"open", MsPaintFile, NULL, NULL, SW_SHOW); //利用ShellExecute执行Windows系统提供的“画图”应用程序。 return 0; }
(5)发送自定义消息WM_MYMESSAGE 利用PostMessag()函数在单击鼠标右键时,发送一个WM_MYMESSAGE消息。
Void CDefinedMsgView::OnRButtonDown(UINT nFlags, CPoint point) { PostMessage(WM_MYMESSAGE); CView::OnRButtonDown(nFlags, point); }
编译并运行DefinedMsg工程,当单击鼠标的右键时,消息处理函数发出WM_ MYMESSAGE消息,OnMyMessage()函数被调用。在OnMyMessage()函数中,调用了“画图”程序。
说明 本程序中用到了一个函数ShellExecute,它负责打开文件的操作,下面为其函数原型说明:
HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd);
其中,参数hwnd为打开文件的窗口句柄。lpOperation为操作类型,分别是open(打开)、print (打印)、explore(浏览)。lpFile为欲打开文件的文件名。文件可以是本地文件,也可以是远程文件;文件的类型可以是文本文件,也可能是多媒体文件。参数lpParameters为打开文件时所传递的参数,特别适合于EXE文件的打开。lpDirectory为文件所在的路径,nShowCmd为打开文件时窗口的状态:0表示隐藏,1表示最大化,2表示最小化。 该函数主要有以下用法: ①浏览网页。下面的语句以最大化方式打开IE进入新浪网站。 ShellExeeute(0, "open", "http://www.sina.com", 0, 0, 1); ②打开、打印WORD文档。 //若要打印文档,则将operate赋值为“print”。 CString Operate="open"; ShellExecute(0, operate, "C:\my documents\\hello.doc", 0, 0, 1); //打开hello.doc文档 ③带参数调用EXE文件。下面的语句将运行记事本程序,并打开config.sys进行编辑。 ShellExecute(0,"open","notepad.exe", "config.sys", "c:\\ ", 1); ④调用资源管理器。下面的语句运行资源管理器查看D盘内容。 ShellExecute(0, "explore", 0, "D:\\ ", 0, 1); |
|