3.6 复选框
<p>复选框由CSkinCheckBox类来代表,继承于CSkinButton,支持CSkinButton的所有属性和方法。</p>
<p>通过给复选框设置不同的布局文件,可以得到各种形态的复选框。</p>
<h2>1 属性和相关方法</h2>
<h4>1.1 设置复选框是否选中</h4>
<ul>
<li>通过XML属性控制如下:
<pre><code class="language-xml">Checked=&quot;true&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>复选框的选中状态有:完全选中状态、部分选中状态和未选中状态。</p>
<ul>
<li>通过C++程序代码调用方法控制如下:
<pre><code class="language-c">virtual void SetCheckedState(CheckState state);</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 CSkinCheckBox::HandleLButtonUp(CPoint point)
{
if(GetState() == VS_PRESS_DOWN)
{
SetChecked(!IsChecked());
if(GetId() != 0)
{
GetOwner()-&gt;PostMessage(WM_COMMAND, GetId(), reinterpret_cast&lt;LPARAM&gt;(this));
}
}
SetState(VS_MOUSE_OVER);
RedrawView();
}</code></pre>
<h4>2.1 WM_CHECKBOX_STATE_CHANGE消息</h4>
<p>复选框选中状态发生变化时,会给所在窗口发送自定义消息WM_CHECKBOX_STATE_CHANGE。</p>
<p>参考下面的示例代码:</p>
<pre><code class="language-cpp">void CSkinCheckBox::SetCheckedState(CheckedState state)
{
if(m_eCheckedState != state)
{
m_eCheckedState = state;
GetOwner()-&gt;PostMessage(WM_CHECKBOX_STATE_CHANGE, state, reinterpret_cast&lt;LPARAM&gt;(this));
}
}</code></pre>
<h2>请看下面的示例</h2>
<h4>效果图</h4>
<p><img src="http://www.skinui.cn/doc/img/3/6/1.png" alt="复选框" /></p>
<h4>布局文件</h4>
<pre><code class="language-xml">&lt;SkinDialog DefaultWidth=&quot;400&quot; DefaultHeight=&quot;300&quot; SysButton=&quot;CLOSE&quot; Icon=&quot;128&quot; Caption=&quot;IDS_CONTROL_SHOW6&quot; Animation=&quot;SizeChange&quot;&gt;
&lt;SkinCheckBox Id=&quot;101&quot; LayoutWidth=&quot;200&quot; LayoutHeight=&quot;30&quot; ChildText1=&quot;IDS_CONTROL_SHOW_TEXT8&quot; Layout=&quot;CheckBox.xml&quot; AlignParentLeft=&quot;50&quot; AlignParentTop=&quot;75&quot;/&gt;
&lt;SkinCheckBox Id=&quot;102&quot; LayoutWidth=&quot;200&quot; LayoutHeight=&quot;30&quot; ChildText2=&quot;IDS_CONTROL_SHOW_TEXT9&quot; ChildImage1=&quot;Icon.png&quot; Layout=&quot;CheckBoxWidthIcon.xml&quot; AlignParentLeft=&quot;50&quot; AlignParentTop=&quot;175&quot;/&gt;
&lt;/SkinDialog&gt;</code></pre>
<h4>h文件</h4>
<pre><code class="language-cpp">#pragma once
class CCheckBoxDialog : public CSkinDialog
{
public:
enum
{
IDC_CHECKBOX1 = 101,
IDC_CHECKBOX2 = 102,
};
public:
CCheckBoxDialog(const tstring&amp; strXml);
public:
virtual void OnInitDialog();
protected:
void OnCheckBoxClicked(UINT uNotifyCode, int nID, CSkinView* pView);
LRESULT OnCheckBoxStateChange(WPARAM wParam, LPARAM lParam);
SKINUI_DECLARE_MESSAGE_MAP()
};</code></pre>
<h4>cpp文件</h4>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &quot;CheckBoxDialog.h&quot;
SKINUI_BEGIN_MESSAGE_MAP(CCheckBoxDialog, CSkinDialog)
ON_SKINUI_COMMAND(IDC_CHECKBOX1, OnCheckBoxClicked)
ON_SKINUI_COMMAND(IDC_CHECKBOX2, OnCheckBoxClicked)
ON_SKINUI_MESSAGE(WM_CHECKBOX_STATE_CHANGE, OnCheckBoxStateChange)
SKINUI_END_MESSAGE_MAP()
CCheckBoxDialog::CCheckBoxDialog(const tstring&amp; strXml)
: CSkinDialog(strXml)
{
}
void CCheckBoxDialog::OnInitDialog()
{
CSkinDialog::OnInitDialog();
}
void CCheckBoxDialog::OnCheckBoxClicked(UINT uNotifyCode, int nID, CSkinView* pView)
{
CSkinCheckBox* pCheckBox = static_cast&lt;CSkinCheckBox*&gt;(pView);
if(pCheckBox)
{
MsgBox(SkinUI::StringFormat(_T(&quot;OnCheckBoxClicked,Id=%d, IsChecked()=%s!&quot;), nID, pCheckBox-&gt;IsChecked() ? _T(&quot;true&quot;) : _T(&quot;false&quot;)));
}
}
LRESULT CCheckBoxDialog::OnCheckBoxStateChange(WPARAM wParam, LPARAM lParam)
{
CSkinCheckBox* pCheckBox = reinterpret_cast&lt;CSkinCheckBox*&gt;(lParam);
if(pCheckBox)
{
MsgBox(SkinUI::StringFormat(_T(&quot;OnCheckBoxStateChange,Id=%d,State=%d, IsChecked()=%s!&quot;), pCheckBox-&gt;GetId(), wParam, pCheckBox-&gt;IsChecked() ? _T(&quot;true&quot;) : _T(&quot;false&quot;)));
}
return 1L;
}</code></pre>