Duilib中創建子窗口后,子窗口銷毀的問題


    自己在學習Duilib時,學習ListDemo中的右鍵生成菜單,然后當菜單被點擊活着失去焦點時,這個菜單窗口如何銷毀的問題。

    1、在這里,創建菜單時使用了子窗口的概念,創建時,使用了WS_EX_TOOLWINDOW類型,表示是一個工具欄窗口。

    2、這個菜單窗口有自己的消息處理函數HandleMessage。第一次的嘗試是調用CWindowWnd中的Close函數,查看了這個函數的源碼,發現其中是使用PostMessage給自己發送了一個WM_CLOSE的消息,然后在HandleMessage中攔截WM_CLOSE的消息,在消息處理函數中調用了PostQuitMessage(0),此種情況下,菜單窗口是退出了,但是父窗口也是跟着退出了。因為在CPaintManager的MessageLoop中的GetMessage,當收到WM_QUIT的消息時會返回0,此時,MessageLoop中的while循環就會給打破。整個消息循環就會退出,因此整個程序退出

    3、第二次的嘗試,是直接在菜單項被選中和菜單窗口失去焦點時調用PostQuitMessage(0),由於跟第一次嘗試是換湯不換葯的動作,因此也已失敗告終。

    4、由於前兩次的失敗,然后再網上各種查詢也未找到相關的解決方法。后來在查看MSDN時,查看了消息WM_CLOSE的Remark,其中說道“應用程序通過處理WM_CLOSE消息,可以在窗口銷毀前對用戶做一些提示,如果用戶確認提示的話,通過調用DestoryWindow來銷魂窗口”。因此,此基礎和第一二次嘗試的基礎上,對代碼進行了修改。首先,在菜單項被選中和菜單窗口失去焦點時調用CWindowWnd的Close函數,然后在窗口的消息處理函數中攔截WM_CLOSE消息,在WM_CLOSE的消息處理函數中通過使用DestoryWindow來達到銷毀菜單窗口的目的,在調用了DestoryWindow后,再調用delete this來刪除窗體本身。這樣才達到了效果。

    當然,在做完第4步時,也遇到了其他的一些小麻煩,稍作調試即完成。也算對window應用編程又有了點新的體會。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM