消息映射(Message Map)的雏形
* 模块化窗口函数,这也是MFC消息映射表格的处理方式,列出代码框架就一目了然
struct MSGMAP_ENTRY{
UINT nMessage;//消息
LONG (*pfn)(HWND, UINT, WPARAM, LPARAM);//此函数指针的原型与窗口函数的相同,就是为了处理窗口函数
}
#define dim(x) (sizeof(x)/sizeof(x[0]))
//定义两个数组,把消息和处理消息的窗口函数对应起来
struct MSGMAP_ENTRY _messageEntries[] =
{//这是普通消息
WM_CREATE, OnCreate,
WM_PAINT, OnPaint,
WM_SIZE, OnSize,
WM_COMMAND OnCommand,
WM_SETFOCUS, OnSetFocus,
WM_CLOSE, OnClose,
WM_DESTROY, OnDestroy
};
struct MSGMAP_ENTRY _commandEnntries[]
{//这是WM_COMMAND消息,要特别处理,所以你也可以象WM_COMMAND一样自己定义一个消息,然后按此方式处理,又学了一招!
IDM_ABOUT, OnAbout,
IDM_FILEOPEN, OnFileOpen,
IDM_SAVEAS, OnSaveAs
}
//然后窗口函数象下面这么写代码就简单了,以后有新的消息要处理,只要在上面的数组加入新的消息和处理函数即可扩展
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int i;
for(i = 0; i<dim(_messageEntries);i++)
if(message == _messageEntries[i].nMessage)
return((*_messageEntries[i].pfn)(hWnd, message, wParam, lParam));
return (DefWindowProc(hWnd, message, wParam, lParam));
}
LONG OnCommand(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int i;
for(i = 0; i<dim(_commandEnntries);i++)
if(LOWORD(wParam) == _commandEnntries[i].nMessage)
return((*_commandEnntries[i].pfn)(hWnd, message, wParam, lParam));
return (DefWindowProc(hWnd, message, wParam, lParam));
}
LONG OnCreate(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
....
}
LONG OnPaint(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
....
}
LONG OnSize(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
....
}
...(其它窗口函数,略...)
对话框的运行
* 两类,Modal和Modeless
* 为了做出对话框,程序员需要准备两样东西:
1. 对话框模板(dialog template),这是在RC文件中定义的一个对话框外貌,以各种方式决定对话框的大小、字体、内部有哪此控件、各在什么位置等等。
2.对话框函数(dialog procedure),其原型类似于窗口函数,但是它通常只处理WM_INITDIALOG和WM_COMMAND两个消息。对话框中的各个控件也都是小小窗口,各自有自己的窗口函数,它们以消息与其管理者(父窗口,也就是对话框)沟通。而所有的控件传来的消息都是WM_COMMAND,再由其参数识别哪一个控件以及哪一种通知消息
Modal对话框的激活与结束,靠的是DialogBox和EndDialog两个API函数
Console程序
* Console程序可以调用部分的、不牵扯到图形使用者接口(GUI)的Win32API,甚至可以在console程序中使用部分的MFC类别(同样必须是与GUI没有关联的),例如处理数组、串行等数据结构的collection class(CArray、CList、CMap)、与文件有关的CFile、CStdioFile。如果程序是以main为进入点,调用Cruntime函数和不牵扯GUI的Win32API函数,那么就是一个console程序,console窗口将成为其标准输入和输出装置(cin和cout)
本章笔记完