在前面的例子中我們發現,視窗都是繼承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& 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>& 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>
補充說明: