VC中幾個基本問題

回調函數的內在機制如何

使用回調函數實際上就是在調用某個函數(通常是API函數)時,將自己的一個函數(這個函數爲回調函數)的地址作爲參數傳遞給那個函數。而那個函數在需要的時候,利用傳遞的地址調用回調函數,這時你可以利用這個機會在回調函數中處理消息或完成一定的操作。

什麼是窗口函數呢?

    窗口函數定義了應用程序對接受到的不同消息的響應,其中包含了應用程序對各種可能接受到的消息的處理過程,是消息處理分支控制語句的集合。一般來說,窗口函數由一個或多個switch語句組成。每一個case語句對應一種消息,當應用程序接受到一個消息時,在窗口函數內的相應的case語句就會被激活並執行相應的響應程序模塊。
   
簡單的說窗口函數就是應用程序處理接受到的消息的函數,其中包含了應用程序對各種可能接受到的有用的消息的處理過程。
   
窗口函數的一般格式是這樣的:
LRESULT CALLBACK WndProc
( HWND hwnd,     //窗口句柄
  UNIT message,  //代表所處理消息的消息值
  WPARAM wParam, //消息的附加參數(1)
  LPARAM lParam  //消息的附加參數(2)
)

句柄

它是WINDOWS編程的基礎。一個句柄是指WINDOWS在內存中使用的一個唯一的整數質,是一個4個字節長的數值,用於標識應用程序中不同對象和相同對象的不同實例。
這裏列出幾種WINDOWS常用的句柄:
HWND: 標示窗口句柄
HINSTANCE:標示當前實例句柄
HCOURSOR:標示光標句柄
HFONT: 標示字體句柄
HPEN:標示畫筆句柄
HBRUSH:標示畫刷句柄
HDC:標示設備環境句柄
HBITMP:標示位圖句柄
HICON:標示圖標句柄
HMENU:標示菜單句柄
HFILE:標示文件句柄

消息

VC++中消息都用前綴標示消息所屬的分類,下面介紹一下這些前綴
BM
表示按鈕控制消息
CB
表示組合框控制消息
DM
表示默認下壓式按鈕控制消息
EM
表示編輯控制消息
LB
表示列表框控制消息
SBM
表示滾動條控制消息
WM
表示窗口消息

由於WINDOWS應用程序利用WINDOWS消息來與其它的WINDOWS應用程序及WINDOWS系統進行消息交換。所以消息是一個十分重要的對象它的結構如下。

typedef struct{
  HWND hwnd;     //檢索消息的窗口句柄
  UNIT message;  //代表一個消息的消息質
  WPARAM wParam; //消息附加信息的字參數
  LPARAM lParam; //消息附加信息的長字參數
  DWORD time;    //消息入隊時間
  POINT pt;      //消息發送時鼠標的位置 point.x;point.y;
} tagMSG;

系統保留消息標識符的值在0x00000x03ff(WM_USER-1)範圍。這些值被系統定義消息使用。應用程序不能使用這些值給自己的消息。應用程序消息從WM_USER0X0400)到0X7FFF,或0XC0000XFFFFWM_USER0X7FFF範圍的消息由應用程序自己使用;0XC0000XFFFF範圍的消息用來和其他應用程序通信.

WM_NULL---0x0000 空消息。
0x0001----0x0087 主要是窗口消息。
0x00A0----0x00A9 非客戶區消息
0x0100----0x0108 鍵盤消息
0x0111----0x0126 菜單消息
0x0132----0x0138 顏色控制消息
0x0200----0x020A 鼠標消息
0x0211----0x0213 菜單循環消息
0x0220----0x0230 多文檔消息
0x03E0----0x03E8 DDE消息
0x0400 WM_USER
0x8000 WM_APP
0x0400----0x7FFF 應用程序自定義私有消息

大體上有3種:窗口消息、命令消息和控件通知消息。

由於控件通知消息很重要的,人們用的也比較多,但是具體的含義往往令初學者暈頭轉向,所以我決定把常見的幾個列出來供大家參考:

按扭控件
BN_CLICKED 用戶單擊了按鈕
BN_DISABLE 按鈕被禁止
BN_DOUBLECLICKED 用戶雙擊了按鈕
BN_HILITE 用/戶加亮了按鈕
BN_PAINT 按鈕應當重畫
BN_UNHILITE 加亮應當去掉
  組合框控件
CBN_CLOSEUP 組合框的列表框被關閉
CBN_DBLCLK 用戶雙擊了一個字符串
CBN_DROPDOWN 組合框的列表框被拉出
CBN_EDITCHANGE 用戶修改了編輯框中的文本
CBN_EDITUPDATE 編輯框內的文本即將更新
CBN_ERRSPACE 組合框內存不足
CBN_KILLFOCUS 組合框失去輸入焦點
CBN_SELCHANGE 在組合框中選擇了一項
CBN_SELENDCANCEL 用戶的選擇應當被取消
CBN_SELENDOK 用戶的選擇是合法的
CBN_SETFOCUS 組合框獲得輸入焦點
  編輯框控件
EN_CHANGE 編輯框中的文本己更新
EN_ERRSPACE 編輯框內存不足
EN_HSCROLL 用戶點擊了水平滾動條
EN_KILLFOCUS 編輯框正在失去輸入焦點
EN_MAXTEXT 插入的內容被截斷
EN_SETFOCUS 編輯框獲得輸入焦點
EN_UPDATE 編輯框中的文本將要更新
EN_VSCROLL 用戶點擊了垂直滾動條消息含義
  列表框控件
LBN_DBLCLK 用戶雙擊了一項
LBN_ERRSPACE 列表框內存不夠
LBN_KILLFOCUS 列表框正在失去輸入焦點
LBN_SELCANCEL 選擇被取消
LBN_SELCHANGE 選擇了另一項
LBN_SETFOCUS 列表框獲得輸入焦點

WinMain函數

一個基本的WinMain函數應該具有以下的功能:
1,
註冊窗口類,建立窗口及執行其他必要的初始化工作
2,
進入消息循環,根據從應用程序消息隊列接受的消息,調用相應的處理過程。
3,
當消息循環檢索到WM_QUIT消息時中止程序運行
WinMain
函數有三個基本組成部分:函數說明、初始化和消息循環。

(1)函數說明
int WINAPI WinMain
(
HINSTANCE hThisInst, //應用程序當前實例句柄
HINSTANCE hPrevInst, //應用程序其它實例句柄
LPSTR lpszCmdLine,   //指向程序命令行參數的指針
int nCmdShow         //應用程序開始執行時窗口顯示方式的整數值標示
)
(2)初始化
初始化包括窗口類的定義、註冊、創建窗口實例和顯示窗口四部分。
(在以後的程序中我將詳細的介紹它們具體的實現方法)

(3)
消息循環
WINDOWS
應用程序的運行是以消息爲核心的。WINDOWS將產生的消息放入應用程序的消息隊列中,而應用程序的WinMain函數從消息循環提取隊列中的消息,並將其傳遞給窗口函數的相應過程處理。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章