Window消息映射(Message Map)的雏形

本文介绍了MFC中实现消息映射的一种方法,通过定义结构体和数组来关联消息与其对应的处理函数,使得窗口过程函数能够简洁高效地处理各种Windows消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------引自深入浅出MFC

 

以下做法是MFC消息映射表格的雏形
首先,定义一个MSGMAP_ENTRY结构和一个dim宏:
struct MSGMAP_ENTRY{
    ULONG nMessage;
    LONG (
*pfn)(HWND, UINT, WPARAM, LPARAM);
};

#define dim(x) (sizeof(x) / sizeof(x[0]))
MSGMAP_ENTRY的第二个元素pfn是个函数指针,此指针指向的函数处理nMessage消息。
接下来,组织两个数组_messageEntries[]和_commandEntries[],把程序中欲处理的消息以及消息处理例程的关联性建立起来:
//消息与处理例程的对照表格
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,
};

//Command-ID与处理例程之对照表格
struct MSGMAP_ENTRY _commandEntries[] = 
{
    
//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));
}

//----------------------------------------------------------------------------
//OnCommand--专门处理WM_COMMAND
//----------------------------------------------------------------------------
LONG ON_COMMAND(HWND hWnd,      UINT message,
                WPARAM wParam,  LPARAM lParam)
{
    
int i;
    
//命令项目对照表
    for(i = 0; i < dim(_commandEntries); i++)
    {
        
if(LOWORD(wParam) == _commandEntries[i].nMessage)
            
return ((*_commandEntries[i].pfn)(hWnd, message, wParam, lParam));
    }
    
return (DefWindowProc(hWnd, message, wParam, lParam));
}

//----------------------------------------------------------------------------
LONG OnCreate(HWND hWnd, UINT wMsg, WPARAM wParam,  LPARAM lParam)
{
    ...
}

//----------------------------------------------------------------------------
LONG OnAbout(HWND hWnd, UINT wMsg, WPARAM wParam,  LPARAM lParam)
{
    ...
}
//----------------------------------------------------------------------------
 
这么一来,WndProc和OnCommand永远不必改变,每当有新的要处理的消息,只要在_messageEntries[]和_commandEntries[]两个数组中加上新元素,并针对新消息撰写新的处理例程即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值