SkinUI入门教程

SkinUI入门教程


3.7 单选框

<p>单选框由CSkinRadioButton类来代表,继承于CSkinButton,支持CSkinButton的所有属性和方法。</p> <p>单选框的父组件的父组件必须为CSkinRadioGroup或其子类,用来将单选框分组。选中组框中的一个单选框时,自动取消其他单选框的选中状态。通过给单选框设置不同的布局文件,可以得到各种形态的单选框。</p> <h2>1 属性和相关方法</h2> <h4>1.1 设置单选框是否选中</h4> <ul> <li>通过XML属性控制如下: <pre><code class="language-xml">Checked=&amp;quot;true&amp;quot;</code></pre></li> <li>通过C++程序代码调用方法控制如下: <pre><code class="language-c">virtual void SetChecked(BOOL bChecked);</code></pre></li> </ul> <h4>1.2 设置单选框绑定的视图</h4> <p>通过给复选框设置不同的布局文件,可以得到不同形态的单选框。例如:通常使用单选框来实现Tab控件。 单选框被选中时,绑定的视图同时显示;单选框取消选中时,绑定的视图同时隐藏。</p> <ul> <li>通过XML属性控制如下: <pre><code class="language-xml">BindView=&amp;quot;1000&amp;quot;</code></pre></li> <li>通过C++程序代码调用方法控制如下: <pre><code class="language-c">virtual void SetBindView(LONG nBindView);</code></pre></li> </ul> <h2>2 消息处理</h2> <h4>2.1 WM_COMMAND消息</h4> <p>单击鼠标左键按下时,如果单选框Id不为0,会给所在的窗口发送WM_COMMAND消息。</p> <p>参考下面的示例代码:</p> <pre><code class="language-cpp">void CSkinRadioButton::HandleLButtonDown(CPoint point, BOOL&amp;amp; bHandle) { if(GetId() != 0) { GetOwner()-&amp;gt;PostMessage(WM_COMMAND, GetId(), reinterpret_cast&amp;lt;LPARAM&amp;gt;(this)); } CSkinRadioGroup* pGroupBox = static_cast&amp;lt;CSkinRadioGroup*&amp;gt;(GetParent()); if(pGroupBox) { if(!IsChecked()) { CRedrawLocker locker(GetOwner()); pGroupBox-&amp;gt;SetChecked(this); } } CSkinButton::HandleLButtonDown(point, bHandle); }</code></pre> <h4>2.1 WM_CHECKBOX_STATE_CHANGE消息</h4> <p>单选框选中状态发生变化时,会给所在窗口发送自定义消息WM_RADIO_GROUP_CHECKED_CHANGE。</p> <p>参考下面的示例代码:</p> <pre><code class="language-cpp">void CSkinRadioGroup::SetChecked(CSkinRadioButton* pRadioButton) { if(pRadioButton) { CSkinRadioButton* pChecked = GetChecked(); if(pChecked &amp;amp;&amp;amp; pChecked != pRadioButton) { pChecked-&amp;gt;SetChecked(FALSE); if(pChecked-&amp;gt;IsVisible()) { pChecked-&amp;gt;SetState(VS_NORMAL); } CSkinView* pBindView = GetOwner()-&amp;gt;GetChildById(pChecked-&amp;gt;GetBindView()); if(pBindView) { pBindView-&amp;gt;SetState(VS_HIDED); } } pRadioButton-&amp;gt;SetChecked(TRUE); GetOwner()-&amp;gt;SendMessage(WM_RADIO_GROUP_CHECKED_CHANGE, GetId(), reinterpret_cast&amp;lt;LPARAM&amp;gt;(pRadioButton)); CSkinView* pBindView = GetOwner()-&amp;gt;GetChildById(pRadioButton-&amp;gt;GetBindView()); if(pBindView) { pBindView-&amp;gt;SetState(VS_NORMAL); } } }</code></pre> <h2>请看下面的示例</h2> <h4>效果图</h4> <p><img src="http://www.skinui.cn/doc/img/3/7/1.png" alt="单选框" /></p> <h4>布局文件</h4> <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_SHOW7&amp;quot; Animation=&amp;quot;SizeChange&amp;quot;&amp;gt; &amp;lt;SkinRadioGroup Id=&amp;quot;100&amp;quot; LayoutWidth=&amp;quot;200&amp;quot; LayoutHeight=&amp;quot;60&amp;quot; AlignParentLeft=&amp;quot;50&amp;quot; AlignParentTop=&amp;quot;100&amp;quot;&amp;gt; &amp;lt;SkinRadioButton Id=&amp;quot;101&amp;quot; LayoutWidth=&amp;quot;200&amp;quot; LayoutHeight=&amp;quot;30&amp;quot; ChildText1=&amp;quot;IDS_CONTROL_SHOW_TEXT10&amp;quot; Layout=&amp;quot;RadioButton.xml&amp;quot; AlignParentTop=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;SkinRadioButton Id=&amp;quot;102&amp;quot; LayoutWidth=&amp;quot;200&amp;quot; LayoutHeight=&amp;quot;30&amp;quot; ChildText2=&amp;quot;IDS_CONTROL_SHOW_TEXT11&amp;quot; ChildImage1=&amp;quot;Icon.png&amp;quot; Layout=&amp;quot;RadioButtonWidthIcon.xml&amp;quot; AlignParentTop=&amp;quot;30&amp;quot;/&amp;gt; &amp;lt;/SkinRadioGroup&amp;gt; &amp;lt;/SkinDialog&amp;gt;</code></pre> <h4>h文件</h4> <pre><code class="language-cpp">#pragma once class CRadioButtonDialog : public CSkinDialog { public: enum { IDC_RADIOBUTTON1 = 101, IDC_RADIOBUTTON2 = 102, }; public: CRadioButtonDialog(const tstring&amp;amp; strXml); public: virtual void OnInitDialog(); protected: void OnRadioButtonClicked(UINT uNotifyCode, int nID, CSkinView* pView); LRESULT OnRadioGroupCheckedChange(WPARAM wParam, LPARAM lParam); SKINUI_DECLARE_MESSAGE_MAP() };</code></pre> <h4>cpp文件</h4> <pre><code class="language-cpp">#include &amp;quot;stdafx.h&amp;quot; #include &amp;quot;RadioButtonDialog.h&amp;quot; SKINUI_BEGIN_MESSAGE_MAP(CRadioButtonDialog, CSkinDialog) ON_SKINUI_COMMAND(IDC_RADIOBUTTON1, OnRadioButtonClicked) ON_SKINUI_COMMAND(IDC_RADIOBUTTON2, OnRadioButtonClicked) ON_SKINUI_MESSAGE(WM_RADIO_GROUP_CHECKED_CHANGE, OnRadioGroupCheckedChange) SKINUI_END_MESSAGE_MAP() CRadioButtonDialog::CRadioButtonDialog(const tstring&amp;amp; strXml) : CSkinDialog(strXml) { } void CRadioButtonDialog::OnInitDialog() { CSkinDialog::OnInitDialog(); } void CRadioButtonDialog::OnRadioButtonClicked(UINT uNotifyCode, int nID, CSkinView* pView) { CSkinRadioButton* pRadioButton = static_cast&amp;lt;CSkinRadioButton*&amp;gt;(pView); if(pRadioButton) { MsgBox(SkinUI::StringFormat(_T(&amp;quot;OnRadioButtonClicked,Id=%d, IsChecked()=%s!&amp;quot;), nID, pRadioButton-&amp;gt;IsChecked() ? _T(&amp;quot;true&amp;quot;) : _T(&amp;quot;false&amp;quot;))); } } LRESULT CRadioButtonDialog::OnRadioGroupCheckedChange(WPARAM wParam, LPARAM lParam) { CSkinRadioButton* pRadioButton = reinterpret_cast&amp;lt;CSkinRadioButton*&amp;gt;(lParam); if(pRadioButton) { MsgBox(SkinUI::StringFormat(_T(&amp;quot;OnRadioGroupCheckedChange,RadioGroup Id=%d,IsChecked()=%s!&amp;quot;), wParam, pRadioButton-&amp;gt;IsChecked() ? _T(&amp;quot;true&amp;quot;) : _T(&amp;quot;false&amp;quot;))); } return 1L; }</code></pre>

页面列表

ITEM_HTML