3.9 下拉列表框
<p>下拉列表框由CSkinComboBox类来代表,继承于CSkinRelativeLayout,支持CSkinRelativeLayout的所有属性和方法。</p>
<p>CSkinComboBox通常由编辑框和按钮组合而成,并支持CSkinEditView的所有属性。</p>
<h2>1 属性和相关方法</h2>
<h4>1.1 设置可选项</h4>
<ul>
<li>通过XML属性控制如下:
<pre><code class="language-xml">OptionText=&quot;男,女&quot;</code></pre></li>
<li>通过C++程序代码调用方法控制如下:
<pre><code class="language-c">LONG AddString(const tstring&amp; str);</code></pre></li>
</ul>
<h4>1.2 设置当前选中</h4>
<ul>
<li>通过XML属性控制如下:
<pre><code class="language-xml">CurSel=&quot;1&quot;</code></pre></li>
<li>通过C++程序代码调用方法控制如下:
<pre><code class="language-c">void SetCurSel(LONG nCurSel);</code></pre></li>
</ul>
<h4>1.3 设置列表最大高度</h4>
<ul>
<li>通过XML属性控制如下:
<pre><code class="language-xml">ListMaxHeight=&quot;100&quot;</code></pre></li>
<li>通过C++程序代码调用方法控制如下:
<pre><code class="language-c">void SetListMaxHeight(LONG nMaxHeight);</code></pre></li>
</ul>
<h2>2 消息处理</h2>
<h4>2.1 WM_COMBOBOX_SEL_CHANGE消息</h4>
<p>下拉列表框选中项发生变化时,会给所在窗口发送自定义消息WM_COMBOBOX_SEL_CHANGE。</p>
<p>参考下面的示例代码:</p>
<pre><code class="language-cpp">void CSkinComboBar::Notify(CSkinView* pView)
{
if(pView &amp;&amp; m_pComboBox)
{
UINT nOldSel = m_pComboBox-&gt;GetCurSel();
UINT nNewSel = pView-&gt;GetId();
if(nOldSel != nNewSel)
{
m_pComboBox-&gt;SetCurSel(nNewSel);
m_pComboBox-&gt;GetOwner()-&gt;PostMessage(WM_COMBOBOX_SEL_CHANGE, m_pComboBox-&gt;GetId(), reinterpret_cast&lt;LPARAM&gt;(m_pComboBox));
}
}
PostMessage(WM_CLOSE);
}</code></pre>
<h2>请看下面的示例</h2>
<h4>效果图</h4>
<p><img src="http://www.skinui.cn/doc/img/3/9/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_SHOW9&quot; Animation=&quot;SizeChange&quot;&gt;
&lt;SkinComboBox LayoutHeight=&quot;30&quot; Layout=&quot;ComboBox.xml&quot; Image=&quot;Edit.png&quot; ReadOnly=&quot;true&quot; Tips=&quot;请选择&quot; OptionText=&quot;男,女&quot; AlignParentLeft=&quot;50&quot; AlignParentRight=&quot;50&quot; AlignParentVerticalCenter=&quot;0&quot;/&gt;
&lt;/SkinDialog&gt;</code></pre>
<h4>h文件</h4>
<pre><code class="language-cpp">#pragma once
class CComboBoxDialog : public CSkinDialog
{
public:
enum
{
IDC_CHECKBOX1 = 101,
IDC_CHECKBOX2 = 102,
};
public:
CComboBoxDialog(const tstring&amp; strXml);
public:
virtual void OnInitDialog();
protected:
LRESULT OnComboBoxSelChange(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;ComboBoxDialog.h&quot;
SKINUI_BEGIN_MESSAGE_MAP(CComboBoxDialog, CSkinDialog)
ON_SKINUI_MESSAGE(WM_COMBOBOX_SEL_CHANGE, OnComboBoxSelChange)
SKINUI_END_MESSAGE_MAP()
CComboBoxDialog::CComboBoxDialog(const tstring&amp; strXml)
: CSkinDialog(strXml)
{
}
void CComboBoxDialog::OnInitDialog()
{
CSkinDialog::OnInitDialog();
}
LRESULT CComboBoxDialog::OnComboBoxSelChange(WPARAM wParam, LPARAM lParam)
{
CSkinComboBox* pComboBox = reinterpret_cast&lt;CSkinComboBox*&gt;(lParam);
if(pComboBox)
{
MsgBox(SkinUI::StringFormat(_T(&quot;OnComboBoxSelChange,Id=%d,CurSel=%d, CurText=%s!&quot;), wParam, pComboBox-&gt;GetCurSel(), pComboBox-&gt;GetText().c_str()));
}
return 1L;
}</code></pre>