**位於空間**區:
發現問題:
while(getmessage(&msg, null, 0, 0 ))
在視窗過程中響應wm_destroy訊息:
case wm_destroy:
postquitmessage(0);
return 0;
1、在訊息迴圈時,若傳遞給getmessage函式的第二個引數為hwnd, 則在關閉視窗後,後台應用程式程序並未關掉。
分析:<1>postquitmessage函式
函式功能:該函式向系統表明有乙個執行緒有終止請求。通常用來響應wm_destroy訊息。
函式原型:void postquitmessage(int nexitcode);
引數:nexitcode :指定應用程式退出**,此值被用作訊息wm_quit的wparam引數。
備註:postquitmessage傳送乙個wm_quit給執行緒的訊息佇列並立刻返回,此函式向系統表明有乙個執行緒請求在隨後的某個時間終止;當執行緒的訊息迴圈從訊息佇列中取出wm_quit訊息後,應當退出訊息迴圈並將控制傳回給系統,返回給系統的退出值必須是wm_quit訊息的wparam引數。
<2>getmessage函式
函式功能:該函式從呼叫執行緒的訊息佇列中接收訊息,該函式不接收屬於其他執行緒或應用程式的訊息,該函式會一直等待,直到從訊息佇列中得到乙個可利用的訊息後才返回。
函式原型:bool getmessage(lpmsg lpmsg, hwnd hwnd, uint wmsgfiltermin, uint wmsgfiltermax);
函式引數:wmsgfiltermin和wmsgfiltermax指定檢索的訊息的範圍;
返回值:接收到wm_quit訊息以外的訊息,返回非零值;接收到wm_quit訊息,返回零;出現錯誤,返回-1
備註:如果hwnd為null,則getmessage接收屬於呼叫執行緒視窗的訊息,執行緒訊息由函式postthreadmessage寄送給呼叫執行緒,由postthreadmessage寄送的執行緒訊息,其訊息hwnd值為null;另外,getmessae不從訊息佇列中清除wm_paint訊息,該訊息將儲存在訊息佇列中直到該訊息處理完畢。
<3>、為什麼當getmessage函式的第二個引數是hwnd(先前建立的視窗控制代碼),應用程式並未真正退出?
msdn中解釋,wm_quit不與視窗相關(wm_quit的hwnd應該為null),當設定getmessage的第二個引數為hwnd,就意味著getmessage函式只接收與hwnd相關的訊息,因此它不會接收到wm_quit訊息,所以雖然應用程式主主視窗關閉了,但是訊息迴圈還在進行,主程式並未退出。
延伸思考:
<1>、為什麼會出現主視窗關閉,但是應用程式並未關閉?
原因:wm_destroy 是視窗正在關閉時發出的,也就是說,當視窗過程在響應wm_destroy訊息時,視窗已經從視覺上被刪除了,wm_quit訊息是結束訊息迴圈讓主程式退出,在本次程式中,當getmessage函式的第二個引數為hwnd, getmessage不能接收到wm_quit訊息,所以應用程式並未退出。
<2>、總結:wm_close 、wm_destroy、wm_quit的區別
Linuc C 程式設計例項1
1 get.c include include include int main void bzero函式 原型 extern void bzero void s,int n 用法 include 功能 置位元組字串s的前n個位元組為零。bzero無返回值。這和windows不一樣 2 fork1....
Python GUI程式設計 文字彈窗的例項
如下所示 out subprocess.getstatusoutput adb shell pm list packages 程式設計客棧top tk.toplevel top.title 包名列表 top.geometry dx d 400,1200 程式設計客棧 設定視窗大小 t text to...
socket TCP程式設計模型例項1
功能需求 將本地資料夾下的source檔案通過tcp備份到遠端伺服器 執行環境 unbuntu 客戶端 1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 9 tcp客戶端 10 int main 11 28...