3.3 超链
<p>超链由CSkinHyperlink类来代表,继承于CSkinTextView,支持CSkinTextView的所有属性和方法。</p>
<h2>1 属性和相关方法</h2>
<h4>1.1 设置超链激活状态的字体</h4>
<ul>
<li>通过XML属性控制如下:
<pre><code class="language-xml">HotFontStyle=&quot;ID_FONT_HYPERLINK&quot;</code></pre></li>
<li>通过C++程序代码调用方法控制如下:
<pre><code class="language-c">void SetHotFontStyle(const tstring&amp; strFontStyle);</code></pre></li>
</ul>
<h4>1.2 设置超链激活状态字体的颜色</h4>
<ul>
<li>通过XML属性控制如下:
<pre><code class="language-xml">HotFontColor=&quot;ID_COLOR_HYPERLINK&quot;</code></pre></li>
<li>通过C++程序代码调用方法控制如下:
<pre><code class="language-c">void SetHotFontColor(const tstring&amp; strFontColor);</code></pre></li>
</ul>
<h4>1.3 设置超链的链接URL</h4>
<ul>
<li>通过XML属性控制如下:
<pre><code class="language-xml">URL=&quot;www.baidu.com&quot;</code></pre></li>
<li>通过C++程序代码调用方法控制如下:
<pre><code class="language-c">void SetUrl(const tstring&amp; strUrl);</code></pre></li>
</ul>
<h2>2 消息处理</h2>
<h4>2.1 WM_COMMAND消息</h4>
<p>单击链接,鼠标左键抬起时,有两种情况:</p>
<ul>
<li>如果是URL,直接调用系统默认浏览器打开这个URL;</li>
<li>如果不是URL且Id不为0,会给链接所在的窗口发送WM_COMMAND消息。</li>
</ul>
<p>请参考下面的示例代码:</p>
<pre><code class="language-cpp">void CSkinHyperlink::HandleLButtonUp(CPoint point)
{
CSkinTextView::HandleLButtonUp(point);
if(GetState() == VS_PRESS_DOWN)
{
if(!m_strUrl.empty())
{
::ShellExecuteW(GetOwner()-&gt;GetHWND(), _T(&quot;open&quot;), m_strUrl.c_str(), NULL, NULL, SW_SHOWNORMAL);
}
else if(GetId() != 0)
{
GetOwner()-&gt;PostMessage(WM_COMMAND, GetId(), reinterpret_cast&lt;LPARAM&gt;(this));
}
}
SetState(VS_MOUSE_OVER);
RedrawView();
}</code></pre>
<h2>请看下面的示例</h2>
<h4>效果图</h4>
<p><img src="http://www.skinui.cn/doc/img/3/3/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_SHOW3&quot; Animation=&quot;SizeChange&quot;&gt;
&lt;SkinHyperlink Id=&quot;101&quot; LayoutWidth=&quot;WrapContent&quot; LayoutHeight=&quot;30&quot; Text=&quot;IDS_CONTROL_SHOW_TEXT4&quot; AlignParentHorizontalCenter=&quot;0&quot; AlignParentTop=&quot;50&quot;/&gt;
&lt;SkinHyperlink Id=&quot;102&quot; LayoutWidth=&quot;120&quot; LayoutHeight=&quot;30&quot; Text=&quot;IDS_CONTROL_SHOW_TEXT5&quot; AlignParentHorizontalCenter=&quot;0&quot; AlignParentTop=&quot;125&quot;/&gt;
&lt;SkinHyperlink Id=&quot;103&quot; LayoutWidth=&quot;WrapContent&quot; LayoutHeight=&quot;30&quot; Text=&quot;IDS_CONTROL_SHOW_TEXT6&quot; URL=&quot;www.baidu.com&quot; AlignParentHorizontalCenter=&quot;0&quot; AlignParentTop=&quot;200&quot;/&gt;
&lt;/SkinDialog&gt;</code></pre>
<h4>h文件</h4>
<pre><code class="language-cpp">#pragma once
class CHyperlinkDialog : public CSkinDialog
{
public:
enum
{
IDC_HYPERLINK1 = 101,
IDC_HYPERLINK2 = 102,
};
public:
CHyperlinkDialog(const tstring&amp; strXml);
public:
virtual void OnInitDialog();
protected:
void OnHyperlinkClicked(UINT uNotifyCode, int nID, CSkinView* pView);
SKINUI_DECLARE_MESSAGE_MAP()
};</code></pre>
<h4>cpp文件</h4>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &quot;HyperlinkDialog.h&quot;
SKINUI_BEGIN_MESSAGE_MAP(CHyperlinkDialog, CSkinDialog)
ON_SKINUI_COMMAND(IDC_HYPERLINK1, OnHyperlinkClicked)
ON_SKINUI_COMMAND(IDC_HYPERLINK2, OnHyperlinkClicked)
SKINUI_END_MESSAGE_MAP()
CHyperlinkDialog::CHyperlinkDialog(const tstring&amp; strXml)
: CSkinDialog(strXml)
{
}
void CHyperlinkDialog::OnInitDialog()
{
CSkinDialog::OnInitDialog();
}
void CHyperlinkDialog::OnHyperlinkClicked(UINT uNotifyCode, int nID, CSkinView* pView)
{
MsgBox(SkinUI::StringFormat(_T(&quot;OnHyperlinkClicked,Id=%d!&quot;), nID));
}</code></pre>