读书时间 2011/10/25

来源:互联网 发布:linux开机启动程序 编辑:程序博客网 时间:2024/05/21 08:57

《Windows Programming》V2


1. Chap 5, 框架


* _asm {int 3}只在debug状态下工作?

* 窗口handler与CWnd针针的映射

线程中每一个窗口都对应一个CWnd类指针

窗口函数通过hWnd得到CWnd指针,再调用相应方法完成功能

Q:HANDLE就是一种指针,YES。如模块HANDLE就是模块代码的首地址。


* CWinApp/CWinThread

任何程序必须定义一个CWinApp子类的全局变量,使CWinApp:CWinApp()能首先执行,完成初始化动作 。

系统中无需再定义WinMain()函数,此函数已经在CWinApp中实现了。

注:CWinApp初始化比WinMain()先执行。


2. Chap 6, 窗口

*  消息映射宏

enum AfxSig // 函数签名标识
{
    AfxSig_end = 0,    // 结尾标识

    AfxSig_vv,    // void (void),比如,void OnPaint()函数
    AfxSig_vw,    // void (UINT),比如,void OnTimer(UINT nIDEvent)函数
    AfxSig_is,    // int    (LPTSTR),比如,BOOL OnCreate(LPCREATESTRUCT)函数
};

注:除了需要消息处理函数地址外,还需要知道函数的签名方式,以便正确调用相关函数。


* CWnd::WindowProc()

LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    LRESULT lResult;
    if(!OnWndMsg(message, wParam, lParam, &lResult))
        lResult = DefWindowProc(message, wParam, lParam);
    return lResult;
}

* CWnd::OnWndMsg()

BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
    LRESULT lResult = 0;

    // 将命令消息和通知消息交给指定的函数处理
    if(message == WM_COMMAND)
    {
        if(OnCommand(wParam, lParam))
        {
            lResult = 1;
            goto LReturnTrue;
        }
        return FALSE;
    }
    if(message == WM_NOTIFY)
    {
        NMHDR* pHeader = (NMHDR*)lParam;
        if(pHeader->hwndFrom != NULL && OnNotify(wParam, lParam, &lResult))
            goto LReturnTrue;
        return FALSE;
    }

     ....

     // 处理其它消息类型

    // 在各类的消息映射表中查找合适的消息处理函数,找到的话就调用它
    const AFX_MSGMAP* pMessageMap;
    const AFX_MSGMAP_ENTRY* lpEntry;
    for(pMessageMap = GetMessageMap(); pMessageMap != NULL; pMessageMap = pMessageMap->pBaseMap)
    {
        ASSERT(pMessageMap != pMessageMap->pBaseMap);
        if((lpEntry = AfxFindMessageEntry(pMessageMap->pEntries, message, 0, 0)) != NULL)
                goto LDispatch;
    }


}

注1:WM_COMMAND, WM_NOTIFY是作为特殊message来处理的,其它都视同普通消息。

注2:整个系统中只有一个函数在处理消息,就是CWnd::OnWndMsg(),但是,所有类的消息映射不同,所以会有不同的行为。

注3:整个系统只有一个窗口类,对应一个窗口函数AfxWndProc()。


《把脉VC++》

 

1. Chap 10. 界面

* MFC处理的消息种类

WM_XXX(WM_COMMAND)除外,一般在CWnd中处理

WM_COMMAND,所有菜单、按钮、工具栏上发出的消息,通常和用户界面上的功能有关

控件通知消息:子窗口送给主窗口的WM_COMMAND通知消息???

 

2. 消息映射

* 避免switch,提供了自定义可能性

*几种不同的映射宏

ON_WM_XXX

ON_COMMAND

ON_CONTROL

ON_MESSAGE:自定义消息