Windows应用程序利用格式化的Windows消息来与其他Windows应用程序及Windows系统进行通信,这些消息被发往应用程序的窗口函数进行处理。由于Windows应用程序是消息或事件驱动的,因此必须了解Windows消息的有关概念。表所示为Windows的消息范围。
表 Windows的消息范围
消息范围 | 意义 |
0~WM_USER-1 | Windows消息 |
WM_USER~0x7FFF | 程序员定义的窗口消息 |
0x8000~0xbffff | Windows系统保留使用 |
0xc000~0xffff | 用于应用程序的字符串消息 |
表中WM_USER的值为0x0400,用户的自定义消息应该处在第二段。
建立自定义消息的操作步骤为:
①定义自己的窗口消息(定义消息标识符);
②在适当的位置声明消息处理函数;
③将消息处理函数与消息对应起来(映射消息);
④编写代码实现该消息处理函数;
⑤利用消息函数向指定的窗口发送消息。
【例】 本程序实现利用自定义消息实现启动Windows系统“附件”中的“画图”程序。本程序练习自定义消息、消息的发送、消息映射、消息的响应。其具体实现步骤为:
(1)生成应用程序框架
利用应用程序向导MFC AppWizard创建一个单文档的应用程序框架,该工程的名称为DefinedMsg,每个步骤都使用默认的选项。
(2)声明白定义的消息处理函数
在DefinedMsgView.h文件中声明 自定义的消息处理函数OnMyMessage。OnMyMessage函数的原型如下:
LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
(3)建立消息映射
在DefinedMsgView.cpp文件中把WM_MYMESSAGE和OnMyMessage关联起来,即建立消息映射(把消息WM_MYMESSAGE映射到函数OnMyMessage,即应用程序接收到消息WM_MYMESSAGE时,执行其对应的消息映射函数OnMyMessage)。
ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
(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);