《深入浅出MFC》第一章Win32基本程序观念-笔记(二)

消息映射(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

    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

    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)

本章笔记完

你可能感兴趣的:(《深入浅出MFC》第一章Win32基本程序观念-笔记(二))