SkinUI入门教程

SkinUI入门教程


1.6 界面编程

<h2>1 使用XML布局文件</h2> <p>SkinUI推荐使用XML布局文件来控制视图,这样不仅简单明了,而且可以将应用的视图控制逻辑从C++代码中分离出来,放入XML文件中控制,从而更好的体现逻辑与界面分离的原则。</p> <p>在SkinUI应用的bin\debug\res\HelloWorld\layout\目录下定义一个文件名为【SkinDialog.xml】的布局文件。布局文件的格式如下:</p> <pre><code class="language-xml">&amp;lt;SkinDialog DefaultWidth=&amp;quot;400&amp;quot; DefaultHeight=&amp;quot;300&amp;quot; SysButton=&amp;quot;CLOSE&amp;quot; Icon=&amp;quot;128&amp;quot; Caption=&amp;quot;IDS_CONTROL_SHOW1&amp;quot; Animation=&amp;quot;SizeChange&amp;quot; EscCloseDialog=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;SkinTextView Id=&amp;quot;1&amp;quot; FontColor=&amp;quot;ID_COLOR_TEXT&amp;quot; Text=&amp;quot;IDS_CONTROL_SHOW_TEXT1&amp;quot; AlignParentLeft=&amp;quot;30&amp;quot; AlignParentRight=&amp;quot;30&amp;quot; AlignParentTop=&amp;quot;45&amp;quot; LayoutHeight=&amp;quot;24&amp;quot; FontStyle=&amp;quot;ID_FONT_NORMAL&amp;quot;/&amp;gt; &amp;lt;/SkinDialog&amp;gt;</code></pre> <p>C++代码可以通过以下方式使用该布局文件:</p> <ul> <li> <p>作为模态对话框的布局文件</p> <pre><code class="language-c">CSkinDialog dlg(_T(&amp;quot;SkinDialog.xml&amp;quot;)); dlg.DoModal(m_hWnd);</code></pre> </li> <li> <p>作为非模态对话框的布局文件</p> <pre><code class="language-c">CSkinDialog* pSkinDialog = new CSkinDialog(_T(&amp;quot;SkinDialog.xml&amp;quot;)); if(pSkinDialog) { if(!pSkinDialog-&amp;gt;Create()) { delete pSkinDialog; } else { pSkinDialog-&amp;gt;ShowWindow(SW_SHOW); } }</code></pre> <h2>2 使用C++代码</h2> <p>虽然SkinUI推荐使用XML布局文件来控制UI界面,但是如果开发者愿意,SkinUI允许开发者完全抛弃XML布局文件,完全在C++代码中控制UI界面。如果希望在代码中控制UI界面,那么所有的UI组件都将通过new关键字创建出来,然后以合适的方式搭建在一起即可。</p> </li> <li> <p>头文件</p> <pre><code class="language-c">class CMainDialog : public CSkinDialog { public: CMainDialog(); public: virtual void OnInitDialog(); };</code></pre> </li> <li>源文件 <pre><code class="language-c">#include &amp;quot;stdafx.h&amp;quot; #include &amp;quot;MainDialog.h&amp;quot; CMainDialog::CMainDialog() : CSkinDialog(_T(&amp;quot;MainDialog.xml&amp;quot;)) { } void CMainDialog::OnInitDialog() { CSkinDialog::OnInitDialog(); CSkinTextView* pTextView = new CSkinTextView(this); if(pTextView) { pTextView-&amp;gt;SetId(1); pTextView-&amp;gt;SetFontColor(_T(&amp;quot;ID_COLOR_TEXT&amp;quot;)); pTextView-&amp;gt;SetText(_T(&amp;quot;IDS_CONTROL_SHOW_TEXT1&amp;quot;)); pTextView-&amp;gt;SetLayoutAlignParentLeft(30); pTextView-&amp;gt;SetLayoutAlignParentRight(30); pTextView-&amp;gt;SetLayoutAlignParentTop(45); pTextView-&amp;gt;SetLayoutHeight(24); pTextView-&amp;gt;SetFontStyle(_T(&amp;quot;ID_FONT_NORMAL&amp;quot;)); } }</code></pre></li> </ul> <h2>3 XML布局文件和C++代码混合</h2> <p>完全使用C++代码来控制UI界面不仅繁琐,而且不利于解耦。而完全使用XML布局文件来控制UI界面虽然方便、便捷,但难免有失灵活。因此,有些时候可能需要混合使用XML布局文件和代码来控制UI界面。</p> <p>当混合使用XML布局文件和代码来控制UI界面时,习惯上把变化小、行为比较固定的组件放在XML布局文件中管理,而那些控制比较复杂的组件则交给C++代码来管理。</p> <p>例如下面的应用,我们先在布局文件中定义一个简单的树控件,该布局文件的代码如下:</p> <pre><code class="language-xml">&amp;lt;SkinDialog DefaultWidth=&amp;quot;400&amp;quot; DefaultHeight=&amp;quot;300&amp;quot; SysButton=&amp;quot;CLOSE&amp;quot; Icon=&amp;quot;128&amp;quot; Caption=&amp;quot;IDS_CONTROL_SHOW12&amp;quot; Animation=&amp;quot;SizeChange&amp;quot;&amp;gt; &amp;lt;SkinRelativeLayout AlignParentLeft=&amp;quot;15&amp;quot; AlignParentRight=&amp;quot;15&amp;quot; AlignParentTop=&amp;quot;35&amp;quot; AlignParentBottom=&amp;quot;15&amp;quot; BkgColor=&amp;quot;ID_COLOR_WHITE&amp;quot; Border=&amp;quot;ID_COLOR_LINE&amp;quot;&amp;gt; &amp;lt;SkinTreeView Id=&amp;quot;101&amp;quot; AlignParentLeft=&amp;quot;1&amp;quot; AlignParentRight=&amp;quot;1&amp;quot; AlignParentTop=&amp;quot;1&amp;quot; AlignParentBottom=&amp;quot;1&amp;quot; VScrollBar=&amp;quot;VScrollBar.xml&amp;quot;&amp;gt; &amp;lt;/SkinTreeView&amp;gt; &amp;lt;/SkinRelativeLayout&amp;gt; &amp;lt;/SkinDialog&amp;gt;</code></pre> <p>上面的布局文件只是定义了一个简单的树控件。接下来我们会在程序中获取该树控件,并往该树控件添加子节点。下面是代码:</p> <pre><code class="language-c">void CTreeDialog::OnInitDialog() { CSkinDialog::OnInitDialog(); CSkinTreeView* pTreeView = static_cast&amp;lt;CSkinTreeView*&amp;gt;(GetChildById(IDC_TREEVIEW)); if(pTreeView) { for(int64 i = 0; i &amp;lt; 10; ++i) { CSkinTreeItem* pRootItem = new CSkinTreeItem(pTreeView); if(pRootItem) { pRootItem-&amp;gt;SetLayoutHeight(30); pRootItem-&amp;gt;SetLayout(_T(&amp;quot;TreeItem.xml&amp;quot;)); pRootItem-&amp;gt;SetImage(_T(&amp;quot;ListItem.png&amp;quot;)); pTreeView-&amp;gt;InsertItem(NULL, pRootItem); for(int64 j = 0; j &amp;lt; 10; ++j) { CSkinTreeItem* pTreeItem = new CSkinTreeItem(pTreeView); if(pTreeItem) { pTreeItem-&amp;gt;SetLayoutHeight(30); pTreeItem-&amp;gt;SetLayout(_T(&amp;quot;TreeItem.xml&amp;quot;)); pTreeItem-&amp;gt;SetImage(_T(&amp;quot;ListItem.png&amp;quot;)); pTreeView-&amp;gt;InsertItem(pRootItem, pTreeItem); } } } } pTreeView-&amp;gt;ResetSortedItem(); } }</code></pre>

页面列表

ITEM_HTML