3.5 按钮
<p>按钮由CSkinButton类来代表,继承于CSkinView,支持CSkinView的所有属性和方法。通过给按钮设置不同的布局文件,可以得到各种形态的按钮。</p>
<h2>1 属性和相关方法</h2>
<h4>1.1 设置鼠标移上去按钮垂直方向的偏移量</h4>
<ul>
<li>通过XML属性控制如下:
<pre><code class="language-xml">MouseOverOffset=&quot;-1&quot;</code></pre></li>
<li>通过C++程序代码调用方法控制如下:
<pre><code class="language-c">void SetMouseOverOffset(LONG nOffset);</code></pre></li>
</ul>
<h4>1.2 设置鼠标按下时按钮垂直方向的偏移量</h4>
<ul>
<li>通过XML属性控制如下:
<pre><code class="language-xml">PressDownOffset=&quot;1&quot;</code></pre></li>
<li>通过C++程序代码调用方法控制如下:
<pre><code class="language-c">void SetPressDownOffset(LONG nOffset);</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 CSkinButton::HandleLButtonUp(CPoint point)
{
if(GetState() == VS_PRESS_DOWN &amp;&amp; GetId() != 0)
{
GetOwner()-&gt;PostMessage(WM_COMMAND, GetId(), reinterpret_cast&lt;LPARAM&gt;(this));
}
if(GetState() == VS_PRESS_DOWN)
{
SetState(VS_MOUSE_OVER);
RedrawView();
}
CSkinRelativeLayout::HandleLButtonUp(point);
}</code></pre>
<h2>请看下面的示例</h2>
<h4>效果图</h4>
<p><img src="http://www.skinui.cn/doc/img/3/5/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_SHOW5&quot; Animation=&quot;SizeChange&quot;&gt;
&lt;SkinButton Id=&quot;101&quot; LayoutWidth=&quot;WrapContent&quot; LayoutHeight=&quot;30&quot; ChildText1=&quot;Button&quot; Image=&quot;Button.png&quot; Layout=&quot;Button.xml&quot; AlignParentHorizontalCenter=&quot;0&quot; AlignParentTop=&quot;50&quot; PressDownOffset=&quot;1&quot;/&gt;
&lt;SkinButton Id=&quot;102&quot; LayoutWidth=&quot;WrapContent&quot; LayoutHeight=&quot;WrapContent&quot; ChildText2=&quot;&quot; ChildImage1=&quot;Icon.png&quot; Image=&quot;IconButton.png&quot; Layout=&quot;IconButton.xml&quot; AlignParentHorizontalCenter=&quot;0&quot; AlignParentTop=&quot;100&quot; PressDownOffset=&quot;1&quot;/&gt;
&lt;SkinButton Id=&quot;103&quot; LayoutWidth=&quot;WrapContent&quot; LayoutHeight=&quot;24&quot; ChildText2=&quot;IconTextButton&quot; ChildImage1=&quot;Icon.png&quot; Image=&quot;IconButton.png&quot; Layout=&quot;IconTextButton.xml&quot; AlignParentHorizontalCenter=&quot;0&quot; AlignParentTop=&quot;150&quot; PressDownOffset=&quot;1&quot;/&gt;
&lt;SkinButton Id=&quot;104&quot; LayoutWidth=&quot;WrapContent&quot; LayoutHeight=&quot;WrapContent&quot; Image=&quot;BitmapButton.png&quot; AlignParentHorizontalCenter=&quot;0&quot; AlignParentTop=&quot;200&quot; PressDownOffset=&quot;1&quot;/&gt;
&lt;/SkinDialog&gt;</code></pre>
<h4>h文件</h4>
<pre><code class="language-c">#pragma once
class CButtonDialog : public CSkinDialog
{
public:
enum
{
IDC_BUTTON1 = 101,
IDC_BUTTON2 = 102,
IDC_BUTTON3 = 103,
IDC_BUTTON4 = 104,
};
public:
CButtonDialog(const tstring&amp; strXml);
public:
virtual void OnInitDialog();
protected:
void OnButtonClicked(UINT uNotifyCode, int nID, CSkinView* pView);
SKINUI_DECLARE_MESSAGE_MAP()
};</code></pre>
<h4>cpp文件</h4>
<pre><code class="language-c">#include &quot;stdafx.h&quot;
#include &quot;ButtonDialog.h&quot;
SKINUI_BEGIN_MESSAGE_MAP(CButtonDialog, CSkinDialog)
ON_SKINUI_COMMAND(IDC_BUTTON1, OnButtonClicked)
ON_SKINUI_COMMAND(IDC_BUTTON2, OnButtonClicked)
ON_SKINUI_COMMAND(IDC_BUTTON3, OnButtonClicked)
ON_SKINUI_COMMAND(IDC_BUTTON4, OnButtonClicked)
SKINUI_END_MESSAGE_MAP()
CButtonDialog::CButtonDialog(const tstring&amp; strXml)
: CSkinDialog(strXml)
{
}
void CButtonDialog::OnInitDialog()
{
CSkinDialog::OnInitDialog();
}
void CButtonDialog::OnButtonClicked(UINT uNotifyCode, int nID, CSkinView* pView)
{
MsgBox(SkinUI::StringFormat(_T(&quot;OnButtonClicked,Id=%d!&quot;), nID));
}</code></pre>