天天看點

Duilib學習筆記《06》— 窗體基類WindowImpBase

在前面的例子中我們發現,視窗都是繼承CWindowWnd、INotifyUI,然後重載相關函數去實作。顯然,我們發現視窗的建立流程實際上都是差不多的,主要隻是在OnCreate加載的配置檔案不同等等…是以,能不能建立一個公有的窗體基類呢?其實,在duilib中已經提供了一個窗體基類 WindowImplBase:在基類内搭建視窗的消息架構,各處理函數為虛函數,子類可以重載處理函數,實作其處理。

此處我們以修改之前的代碼為例來進行說明。

CMainWndDlg類修改為繼承WindowImpBase類:class CMainWndDlg : public WindowImplBase

将之前的成員函數全部删除,添加如下函數(實際上是重載WindowImplBase中的函數)

<code>1</code>

<code>public</code><code>:</code>

<code>2</code>

<code>    </code><code>LPCTSTR</code> <code>GetWindowClassName()</code><code>const</code><code>;   </code>

<code>3</code>

<code>    </code><code>virtual</code> <code>CDuiString GetSkinFile();</code>

<code>4</code>

<code>    </code><code>virtual</code> <code>CDuiString GetSkinFolder();</code>

對應的函數實作:

<code>LPCTSTR</code> <code>CMainWndDlg::GetWindowClassName()</code><code>const</code>

<code>{</code>

<code>    </code><code>return</code> <code>_T(</code><code>"UIMainWnd"</code><code>);</code>

<code>}</code>

<code>5</code>

<code>CDuiString CMainWndDlg::GetSkinFile()</code>

<code>6</code>

<code>7</code>

<code>    </code><code>return</code> <code>_T(</code><code>"DemoSkin.xml"</code><code>);</code>

<code>8</code>

<code>9</code>

<code>CDuiString  CMainWndDlg::GetSkinFolder()</code>

<code>10</code>

<code>11</code>

<code>    </code><code>return</code> <code>CDuiString(CPaintManagerUI::GetInstancePath());</code>

<code>12</code>

這裡,窗體Create建立時直接根據傳遞的視窗XML布局檔案,調用父類的函數處理。這樣一來,編譯運作窗體就可以顯示出來了。

對于每個窗體,具體的操作是不一樣的,是以對應的控件消息等等還需要在對應的窗體中去自行處理。

在實際情況中,可能多個視窗之間傳遞使用者自定義消息等情況,而對于使用者自定義消息。我們需要在HandleCustomMessage中去處理。首先需要重載該函數:LRESULT HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL&amp; bHandled);在函數實作中,根據具體的消息進行部分的分支處理:

<code>LRESULT</code> <code>CMainWndDlg::HandleCustomMessage(</code><code>UINT</code> <code>uMsg,</code><code>WPARAM</code> <code>wParam,</code><code>LPARAM</code> <code>lParam,</code><code>BOOL</code><code>&amp; bHandled )</code>

<code>    </code><code>bHandled = TRUE;   </code><code>// 消息本地處理,不流入系統處理。</code>

<code>    </code><code>switch</code> <code>(uMsg)</code>

<code>    </code><code>{</code>

<code>    </code><code>default</code><code>:</code>

<code>        </code><code>bHandled = FALSE;   </code><code>// 本地沒有處理,流入系統處理。</code>

<code>    </code><code>}</code>

<code>    </code><code>return</code> <code>0;</code>

補充說明: