訊息佇列與訊息迴圈(摘自win32api參考)
var msg: tmsg;
begin
while processmessage(msg) do ;
end;
程式通過簡單地建立乙個迴圈來實現自己的訊息迴圈,通過呼叫下邊四個函式實現.以下參考delphi幫助,自己翻譯的,理解也許有錯誤,不過這正是我需要的,等回頭看時,會收穫好多.
bool getmessage(
lpmsg lpmsg,
hwnd hwnd,
uint wmsgfiltermin,
uint wmsgfiltermax
);
bool peekmessage(
lpmsg lpmsg,
hwnd hwnd,
uint wmsgfiltermin,
uint wmsgfiltermax,
uint wremovemsg
);
bool translatemessage(
const msg *lpmsg );
如果訊息被轉換返回0.
lresult dispatchmessage(
const msg *lpmsg );
分發訊息給視窗程式,一般從getmessage獲得.
delphi通過processmessage函式來處理
var unicode: boolean;//老版本的delphi好像沒有這個,可能是為了處理寬字串吧
handled: boolean;
msgexists: boolean;
begin
result := false;
if peekmessage(msg, 0, 0, 0, pm_noremove) then //訊息處理後,在佇列中保留
begin
unicode := (msg.hwnd <> 0) and iswindowunicode(msg.hwnd);
if unicode then
msgexists := peekmessagew(msg, 0, 0, 0, pm_remove)//處理後移出訊息佇列
else
msgexists := peekmessage(msg, 0, 0, 0, pm_remove);
if not msgexists then exit;
result := true;
if msg.message <> wm_quit then
begin
handled := false;
if assigned(fonmessage) then fonmessage(msg, handled);
if not ispreprocessmessage(msg) and not ishintmsg(msg) and
not handled and not ismdimsg(msg) and
not iskeymsg(msg) and not isdlgmsg(msg) then
begin
translatemessage(msg);
if unicode then
dispatchmessagew(msg)
else
dispatchmessage(msg);//分發訊息到呼叫視窗
end;
endelse
fterminate := true;
end;
end;
每乙個訊息迴圈都是通過上邊的函式實現的.
Win32 API訊息函式 GetMessage
函式功能 該函式從呼叫執行緒的訊息佇列裡取得乙個訊息並將其放於指定的結構。此函式可取得與指定視窗聯絡的訊息和由postthreadmesssge寄送的執行緒訊息。此函式接收一定範圍的訊息值。getmessage不接收屬於其他執行緒或應用程式的訊息。函式原型 bool getmessage lpmsg...
win32 API程式設計之常用訊息詳解
一 傳送訊息的函式 例項 include include 自定義訊息 define wm aaa wm user 1hwnd hwnd hwnd hwnd2 自定義的視窗過程 lresult callback mywindowproc hwnd hwnd,uint msg,wparam wparam...
掃雷程式 win32API
1 已實現功能 基本的掃雷方塊的展開,方塊周圍雷數的計算,方塊的標旗,勝負的判斷,難度的更改 2 未實現功能 控制台顯示剩餘標旗數量和當前所用時間,選單項的豐富 3 基本原理 使用一張二維int表儲存每個方格的數字資訊,其中9表示雷 將整個雷區 客戶區 按難度分割成方格,每個方格為乙個靜態控制項,用...