欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
《Windows程序設計》第三章學(xué)習心得(1)|圖解消息機制 - 程序設計 - 如鵬網(wǎng) 計...

《Windows程序設計》第三章學(xué)習心得(1)|圖解消息機制

    為了繪制下面那張所謂“Windows消息循環(huán)流程圖”,忙活了一下午!先給表?yè)P一下自己(吼吼~畫(huà)得還蠻好看的嘛?。?,再潑桶冷水(呃~亂七八糟地塞了一堆條條框框,沒(méi)被消息循環(huán)搞昏就先被這圖搞暈了!

        OK,不說(shuō)廢話(huà),慢慢切入正題!

    最近讀完《Windows程序設計》第三章,把書(shū)上的“HelloWin”代碼敲了兩遍,又查閱了一些參考資料,前后改了4個(gè)版本。這一來(lái)二去的,算是對Windows程序的運行機制(主要是消息處理)有了一點(diǎn)點(diǎn)小小的認識。為了對所學(xué)知識進(jìn)行鞏固,為了與各位鵬友互通有無(wú),為了維護世界的和平,為了&@#$(不好意思,突然想到《寵物小精靈》),特地寫(xiě)了這篇學(xué)習心得,也算是對上一篇的延續吧!

    正如書(shū)中所講,Windows編程的難點(diǎn)”在于“Windows程序所做的一切都是響應發(fā)送給窗口過(guò)程的消息”。對于我們這些剛從單純的控制臺出來(lái),一躍進(jìn)入WIN32多彩世界的孩子們來(lái)說(shuō),未免讓人眼花繚亂,以至于頭冒金星,亂了方寸。

    學(xué)習這一章中最為重要的,我想莫過(guò)于理解消息處理機制。為此我雙眼死盯著(zhù)書(shū)中第61頁(yè)最后一段話(huà)。猛查找了不少資料,做了不少試驗,還特地繪了張Windows消息循環(huán)流程圖”。下面同各位鵬友分享一下這張花了我一下午功夫的流程圖。



注:這是小圖版,大圖版在文章下方可以下載!

    此前在網(wǎng)上找到了幾張老外繪制的流程圖,由于過(guò)于簡(jiǎn)潔,以至于很多細節沒(méi)有體現。這么一來(lái)這些流程圖很難解決我的一堆疑問(wèn)。小小的失望之后我又振奮了起來(lái)!于是繼續猛搜資料,跟隨做了一系列試驗。哈哈,皇天不負有心人,終于讓我得到了較為滿(mǎn)意的答案。


    然而,僅僅僅停留于這些答案之上并不能讓我滿(mǎn)足。我想,我需要再做點(diǎn)什么事情,以使我今后的人生更有意義(扯遠了)。繼而又突發(fā)奇想,結合了幾張流程圖的特點(diǎn),再加上從這些參考資料上得到的答案,另外繪制出了這張“Windows消息循環(huán)流程圖”。

    這圖畫(huà)得可能些許花哨,咋一看可能有點(diǎn)暈乎。別怕,我畫(huà)它的目的不是讓大家精神恍惚的。先別糾結,讓我結合這張流程圖同各位鵬友分享一下我對消息處理的一點(diǎn)小小的認識。

    有Charles Pezold的《Windows程序設計》這本書(shū)的鵬友可以翻開(kāi)第61頁(yè),看到最后一段。只有電子版的鵬友可以在“窗口和消息”-Windows程序設計的難點(diǎn)”里的“別呼叫我,我會(huì )呼叫你”的最后一段找到。

    下面把這段話(huà)給貼出來(lái):


“有時(shí)候,DefWindowProc處理完消息后會(huì )產(chǎn)生其它的消息。例如,假設使用者執行HELLOWIN,并且使用者最終單擊了 Close按鈕,或者假設用鍵盤(pán)或鼠標從系統菜單中選擇了 Close, DefWindowProc處理這一鍵盤(pán)或者鼠標輸入,在檢測到使用者選擇了Close選項之后,它給窗口消息處理程序發(fā)送一條WM_SYSCOMMAND消息。WndProc將這個(gè)消息傳給DefWindowProc。DefWindowProc給窗口消息處理程序發(fā)送一條WM_CLOSE消息來(lái)響應之。WndProc再次將它傳給DefWindowProc。DestroyWindow呼叫DestroyWindow來(lái)響應這條WM_CLOSE消息。DestroyWindow導致Windows給窗口消息處理程序發(fā)送一條WM_DESTROY消息。WndProc再呼叫PostQuitMessage,將一條WM_QUIT消息放入消息隊列中,以此來(lái)響應此消息。這個(gè)消息導致WinMain中的消息循環(huán)終止,然后程序結束。”
(訂正:“DestroyWindow呼叫DestroyWindow”改為“DefWindowProc呼叫DestroyWindow”。)


    我的流程圖便是根據文中關(guān)閉窗口這個(gè)操作繪制的。下面詳談一下我對這段話(huà)的理解。



0、鼠標左鍵點(diǎn)擊窗口關(guān)閉按鈕


    首先,用鼠標左鍵點(diǎn)擊窗口的關(guān)閉按鈕。于是我們看到窗口在桌面上消失了。僅僅停留于這層認識當然不是我們這些Windows程序設計學(xué)習者所能容許的。至少還需要了解在這個(gè)短暫的瞬間都發(fā)生了什么微妙的變化!讓我們一起體驗“第一次親密接觸”吧!

    在此瞬間,Windows檢測到鼠標左鍵的點(diǎn)擊事件。從書(shū)本第62頁(yè)“3.2.2進(jìn)隊消息與不進(jìn)隊消息”第四段獲悉,Windows將鼠標左鍵點(diǎn)擊產(chǎn)生的消息(WM_LBUTTONDOWN)送入了消息隊列。

    接著(zhù),應用程序的消息循環(huán)利用GetMessage函數,將msg消息結構的指針傳遞給Windows,讓W(xué)indows對msg這個(gè)結構進(jìn)行數據填充。而這個(gè)“數據填充”的過(guò)程就是所謂“從消息隊列中取出消息”的過(guò)程。(是不是有點(diǎn)像山里用竹子做成的“自動(dòng)引水”設備。想象一下,水流啊流,水車(chē)轉啊轉,水一瓢接著(zhù)一瓢往山下送。

    接到消息后,TranslateMessage函數對這個(gè)消息進(jìn)行一些處理。從書(shū)上得知進(jìn)行一些鍵盤(pán)轉換處理。咱們暫且不管它都干了些什么勾當,這不是第三章要告訴我們的。(下一篇心得會(huì )講到我改造的HelloWin,里面有稍微涉及到這個(gè)知識。)

    TranslateMessage函數干完活回家后(返回),DispatchMessage函數又將這個(gè)msg結構傳給Windows。然后就要進(jìn)行一步很有意義的動(dòng)作啦。Windows把這個(gè)msg結構傳給適當的窗口過(guò)程進(jìn)行處理。也就是傳遞WM_LBUTTONDOWN消息給窗口過(guò)程。而msg結構里存儲著(zhù)WM_LBUTTONDOWN消息及其相關(guān)參數。同咱日常生活一樣,信不能亂送,得放到信封里,填上姓名、地址、郵編等等,還要貼上郵票。

    瞧瞧,Windows是不是像個(gè)勤勞盡職的雜工:負責把咱們寫(xiě)好的信收拾好(放入消息隊列),等郵遞員(GetMessage)來(lái)了,得把信紙裝成一封一封的信件交給他。當郵局對信件進(jìn)行審核蓋章(TranslateMessage的工作)并分發(fā)(DispatchMessage也是個(gè)郵遞員)到各個(gè)私人信箱后,Windows還得挨家挨戶(hù)去幫人家取信件,并轉交給各戶(hù)的管家(窗口過(guò)程WndProc)。真是盡職盡責,佩服,在此向Windows鞠個(gè)躬。

    在流程圖中并沒(méi)有提到WM_LBUTTONDOWN消息,其中有兩個(gè)原因:一個(gè)是第三章里沒(méi)有提到這個(gè)消息的處理。HelloWin的窗口過(guò)程WndProc中沒(méi)有處理這個(gè)消息的代碼。(WndProc不處理這個(gè)消息,而是把它交給DefWindowProc來(lái)處理。)另外,WM_LBUTTONDOWN并不是關(guān)閉窗口的特定消息。DefWindowProc只是通過(guò)從該消息的msg結構的POINT成員結構中獲取鼠標焦點(diǎn),來(lái)判斷鼠標是否在關(guān)閉按鈕上點(diǎn)擊。

    DefWindowProc對這一鼠標點(diǎn)擊進(jìn)行處理。在檢測到我們點(diǎn)擊了關(guān)閉按鈕后,它給WndProc發(fā)送一條WM_SYSCOMMAND消息。

1、處理WM_SYSCOMMAND消息

    其實(shí)DefWindowProc并沒(méi)有把消息直接發(fā)送給WndProc。我們知道很多事情都是由我們勤勞的Windows來(lái)做,這邊也不例外,WM_SYSCOMMAND消息是通過(guò)Windows間接發(fā)送給WndProc的。(再次鞠躬)

    同上面處理WM_LBUTTONDOWN消息大同小異。Windows將WM_SYSCOMMAND消息(流程圖——消息①)放入消息隊列中。(終于可以一邊看文字一邊參照流程圖了!由于流程圖中有標注,因此有些細節在后面不再詳談。

    GetMessage從消息隊列中取出WM_SYSCOMMAND消息。經(jīng)過(guò)TranslateMessage和DispatchMessage后,再由Windows將其發(fā)送給WndProc。WndProc不處理,又將其傳給DefWindowProc。DefWindowProc接收到WM_SYSCOMMAND消息后,同樣通過(guò)Windows間接發(fā)送一條WM_CLOSE消息(流程圖——消息②)給WndProc。

    實(shí)際上DefWindowProc接收到WM_SYSCOMMAND消息后還需判斷是否為關(guān)閉窗口。即做類(lèi)似“wParam & 0xFFF0 == SC_CLOSE”這樣的判斷,條件成立才發(fā)送WM_CLOSE消息。參考資料:在WM_SYSCOMMAND消息中,wParam參數的4個(gè)低位是Windows內部實(shí)用的。當應用程序檢測到wParam的值時(shí),它必須通過(guò)AND操作來(lái)將0xFFF0與wParam值相與,以便得到正確結果。)這個(gè)我們暫且不去理會(huì ),保留一些腦細胞繼續往下看。我會(huì )在下一篇學(xué)習心得里涉及到一點(diǎn)點(diǎn)這個(gè)知識。

2、處理WM_CLOSE消息

    WndProc還是不處理WM_CLOSE消息,再次將它傳給DefWindowProc。DefWindowProc調用DestroyWindow函數來(lái)響應這條WM_CLOSE消息。在此期間,DestroyWindow對窗口進(jìn)行一系列的銷(xiāo)毀工作,并通過(guò)Windows給WndProc發(fā)送一條WM_DESTROY消息(流程圖——消息③)。于是我們發(fā)現桌面上的那個(gè)窗口消失了,而在這彈指一揮間,該應用程序其實(shí)還沒(méi)有結束。(下篇學(xué)習心得會(huì )演示出來(lái)。)

3、處理WM_DESTROY消息

    WndProc中終于有WM_DESTROY消息的處理代碼了。WndProc調用PostQuitMessage函數,將一條WM_QUIT消息(流程圖——消息④)放入消息隊列中。此刻PostQuitMessage不等WM_QUIT消息是否被處理便立即返回。(嘿嘿,它忙著(zhù)逃命去啦,因為我們的應用程序要完蛋了?。?/font>

4、終止消息循環(huán),結束程序,返回Windows

    GetMessage從消息隊列中取出WM_QUIT消息并返回0值,導致消息循環(huán)終止。緊接著(zhù)整個(gè)應用程序結束運行并返回Windows。由于此前取出消息后GetMessage返回的都是非0值,故一直執行消息循環(huán)。

    OK,匯報完畢!

    看完了匯報是不是對消息處理機制有了進(jìn)一步的認識?是不是開(kāi)始蠢蠢欲動(dòng),想從中做些手腳來(lái)滿(mǎn)足一下未脫的搞怪心理?

    下一篇學(xué)習心得將跟大家分享我的搞怪版HelloWin,敬請期待吧!
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
WM_CLOSE、WM_DESTROY、WM_QUIT, SENDMESSAGE ,POS...
MFC中關(guān)閉非模式窗口
WM_COMMAND消息(轉載)
WM_COMMAND & WM_SYSCOMMAND
截獲windows的消息并分析實(shí)例(DefWindowProc)
如何捕獲windows的關(guān)機和休眠命令
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久