DuiLib中窗口的創建


    以前基本沒有寫博客記錄工作學習中遇到的問題及解決方法的習慣,就發現過段時間后學習的東西就忘掉了。因此,今天決定將自己的學習成果記錄下來,以后后面參考。

    一直以來,自己對界面實在不怎么感冒,學習MFC也是斷斷續續的看過一些,由於工作中沒有直接用MFC做復雜的東西,所以MFC也只是一個皮毛。后來,聽朋友說她在驅動人生的時候,驅動人生使用的界面庫叫做Duilib。看了下百度,竟然還是國產的,必須得支持一下。下面將這段時間斷斷續續的看的Duilib的一些東西記錄下來。

    Duilib,它只是一個界面,不像MFC那樣的應用框架,不包含其他的一些常用功能,例如:線程、進程、日志系統、文件保存等功能,這些都需要運用windows系統函數或者C庫函數來完成。因此,可以明確,Duilib僅僅只是一個界面庫,我們用它來做展示的東西。自己在學習中遇到的問題,大致如下:

    1、Duilib中窗口的創建:在Duilib中,有一個CWindowWnd類,我們在創建自己的窗口時,可以從這個CWindowWnd進行繼承,其中有注冊、創建和其他的一些窗口的操作,我們就不用自己再進行編寫了。另外一個重要的類就是CPaintManagerUI,一般是一個窗口帶一個CPaintManagerUI的對象,用其來進行對控件的操作。Duilib中的控件,不同於MFC中的控件。Duilib中,所有的控件不是一個獨立的子窗口,而是由程序自己畫到窗口上的。所有的這些控件,都有CPaintManager對象來進行管理。    

    2、消息循環:首先在CPaintManager中,有一個靜態的方法MessageLoop(),來完成windows消息循環即GetMessage、TranslateMessage、DispatchMessage這三個函數。 學過win32應用程序的同學都知道,在我們調用CreateWindowEx時,在此函數未返回之前,會發送WM_NCCREATE的消息。Duilib在這里使用了一個技巧,在調用CreateWindowEx時,在函數的對應一個參數,傳入了當前窗口的指針。這個指針在處理WM_NCCREATE時,可以從通過參數lParam經過一定的變換獲取到。由於窗口處理函數是一個靜態的函數,所以,在其中我們就可以使用剛才獲取到的窗口指針,調用窗口我們自己編寫的消息處理函數。在這個函數中,我們自己可以攔截一些我們需要的消息,例如:我們自己自繪標題欄時,這時的窗口是無法像我們圖片的窗口那樣,在窗口的標題欄處,按下鼠標左鍵然后拖動窗口。此時,我們可以截取系統消息WM_NCHITTEST,在其中我們做相應的判斷,返回相應的值,就可以實現拖動的功能。 系統體統的CPaintManager類中,有對常用的消息做處理,例如單擊、雙擊等。此時,我們可以在調用CPaintManager中的MessageHandler來處理例如繪畫等消息。

    3、知道了上面兩點,我們就可以自己動手做些簡單的UI界面。當然,界面要漂亮,離不開一套漂亮的圖片。這里,圖片盡量使用png格式的圖片,因為png格式的圖片有兩個優點我們是需要用到,1) png圖片的壓縮了高,節省空間。2) png圖片一般帶有alpha通道,即透明通道,這樣我們就可以做出來很炫的界面。例如,想很多軟件里面看到的圓形button。

    4、Duilib中,將系統消息再做了一次封裝,這樣,我們只要將我們的窗口類使用多繼承,再繼承INotifyUI類。其實,從這個名字上我們可以看出,這是一個接口類,雖然C++中不支持接口(Java)這個技術,但是我們還是可以使用它的定義。在INotifyUI中,其實只有一個函數共有的未實現的虛函數Notify,我們在我們的窗口類中繼承了INotifyUI類后,就需要在我們的類中實現這個Notify的方法。一般,我們需要的一些消息就可以在其中進行處理,例如,單擊、雙擊 或者還有菜單創建等一些消息。

    在這里,沒有使用Duilib庫封裝好的WindowImplBase類。其實,我們在把基礎理解透徹后,再去使用這個類就會明白,其實它也是把一些常用的東西進行封裝,而使得客戶更加方便的使用。

    第一次寫博客,語言組織能力還是有待提高。


免責聲明!

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



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