windows平臺消息處理函數(C++版)

/*
   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;
  }
 
發佈了71 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章