Name: MessageMap.cpp
Author:CarveTimes
Description: simulating the windows message maps
Date: 30-08-04 19:50
Copyright: CarveTimes
*/
#include<iostream>
#include<windows.h>
#include<stdlib.h>
using namespace std;
/*定義消息結構體*/
struct MSGMA_ENTRY{
UINT nMessage; /*消息編號*/
LONG (*pfn)(HWND,UINT,WPARAM,LPARAM); /*函數指針,準備用這個指針指向對應的消息處理函數*/
} ;
#define dim(x) (sizeof(x)/sizeof(x[0]))/*宏定義,用來求的數組的大小*/
/*WM_CREATE消息的處理函數,返回值要大寫,數據類型要大寫,函數名稱要遵循命名規範大小寫結合*/
LONG OnCreate(HWND hWnd,UINT wMsg,UINT wParam ,LONG lParam)
{
cout<<"call OnCreate function"< return 0;
} ;
/*WM_PAINT消息的處理函數,返回值要大寫,數據類型要大寫,函數名稱要遵循命名規範大小寫結合*/
LONG OnPaint(HWND hWnd,UINT wMsg,UINT wParam ,LONG lParam)
{
cout<<"call OnPaint function"< return 0;
} ;
/*WM_SIZE消息的處理函數,返回值要大寫,數據類型要大寫,函數名稱要遵循命名規範大小寫結合*/
LONG OnSize(HWND hWnd,UINT wMsg,UINT wParam ,LONG lParam)
{
cout<<"call OnSize function"< return 0;
} ;
/*WM_CLOSE消息的處理函數,返回值要大寫,數據類型要大寫,函數名稱要遵循命名規範大小寫結合*/
LONG OnClose(HWND hWnd,UINT wMsg,UINT wParam ,LONG lParam)
{
cout<<"call OnClose function"< return 0;
} ;
/*WM_DESTROY消息的處理函數,返回值要大寫,數據類型要大寫,函數名稱要遵循命名規範大小寫結合*/
LONG OnDestroy(HWND hWnd,UINT wMsg,UINT wParam ,LONG lParam)
{
cout<<"call OnDestroy function"< return 0;
} ;
/*當接受到的消息不是消息列表中已經定義消息處理函數的消息,則用這個函數處理,稱爲缺省的消息處理函數*/
LONG DefMessageProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
cout<<"DefMessageProc"< return 0;
}
/*定義數組,把消息和對應於該消息的消息處理函數對應起來,下列每一行對應於該數組的一個元素,該數組的每一個元素都是一個結構體
類型的變量,該結構體類型的變量擁有兩個屬性:消息編號,和函數指針*/
struct MSGMA_ENTRY _messageEnteries[] =
{
WM_CREATE, OnCreate,
WM_PAINT, OnPaint,
WM_SIZE, OnSize,
WM_CLOSE, OnClose,
WM_DESTROY,OnDestroy
};
/*消息分發函數,根據接受到的消息,分別調用對應的消息處理函數*/
LONG MessageProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
int i;
for(i = 0;i< dim(_messageEnteries);i++) /*遍歷消息結構體數組*/
{
if(message == _messageEnteries[i].nMessage ) /*如果收到的消息和數組中已經定義消息處理函數的消息一致,
則通過return語句調用對應的消息處理函數 */
return ((*_messageEnteries[i].pfn)(hWnd,message,wParam,lParam)) ;
}
/*如果收到的消息不沒有定義對應的消息處理函數,則採用缺省的消息處理函數*/
return (DefMessageProc(hWnd,message,wParam,lParam)) ;
}
int main()
{
/*定義消息數組*/
LONG msg[]={WM_CREATE,WM_PAINT,WM_SIZE,WM_CLOSE,WM_DESTROY};
for(int i = 0;i < sizeof(msg)/sizeof(long); i++)
LONG res = MessageProc(0,msg[i],0,0);/*遍歷消息數組,使用該函數找到對應的消息處理函數*/
system("pause");/*程序暫停執行*/
return 0;
}