消息处理
<h2>命令消息处理</h2>
<h3>单命令消息处理</h3>
<p>一个控件Id绑定一个消息处理函数,如下所示:</p>
<ul>
<li>头文件</li>
</ul>
<pre><code class="language-c">void OnBtnClickedCommand(UINT uNotifyCode, int nID, CView* pView);
SKINUI_DECLARE_MESSAGE_MAP()</code></pre>
<ul>
<li>源文件</li>
</ul>
<pre><code class="language-c">SKINUI_BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
ON_SKINUI_COMMAND(IDC_BUTTON, OnBtnClickedCommand)
SKINUI_END_MESSAGE_MAP()
void CMainDialog::OnBtnClickedCommand(UINT uNotifyCode, int nID, CView* pView)
{
}</code></pre>
<h3>范围命令消息处理</h3>
<p>一个控件Id范围绑定一个消息处理函数,如下所示:</p>
<ul>
<li>头文件</li>
</ul>
<pre><code class="language-c">void OnBtnClickedCommand(UINT uNotifyCode, int nID, CView* pView);
SKINUI_DECLARE_MESSAGE_MAP()</code></pre>
<ul>
<li>源文件</li>
</ul>
<pre><code class="language-c">SKINUI_BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
ON_SKINUI_COMMAND_RANGE(IDC_BUTTON1, IDC_BUTTON2, OnBtnClickedCommand)
SKINUI_END_MESSAGE_MAP()
void CMainDialog::OnBtnClickedCommand(UINT uNotifyCode, int nID, CView* pView)
{
}</code></pre>
<h3>更新UI命令消息处理</h3>
<p>SkinUI会在需要的时候发送更新UI命令消息用来更新UI组件的状态。主要存在以下几种情况:</p>
<ul>
<li>按钮的禁用;</li>
<li>菜单的禁用;</li>
<li>菜单的选中;</li>
</ul>
<h4>按钮的禁用:</h4>
<ul>
<li>头文件</li>
</ul>
<pre><code class="language-c">void OnUpdateCommandUI(CView* pView);
SKINUI_DECLARE_MESSAGE_MAP()</code></pre>
<ul>
<li>源文件</li>
</ul>
<pre><code class="language-c">SKINUI_BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
ON_SKINUI_UPDATE_COMMAND_UI(IDC_BUTTON, OnUpdateCommandUI)
SKINUI_END_MESSAGE_MAP()
void CMainDialog::OnUpdateCommandUI(CView* pView)
{
pView->SetEnable(FALSE);
}</code></pre>
<h4>菜单的禁用:</h4>
<ul>
<li>头文件</li>
</ul>
<pre><code class="language-c">void OnUpdateCommandUI(CView* pView);
SKINUI_DECLARE_MESSAGE_MAP()</code></pre>
<ul>
<li>源文件</li>
</ul>
<pre><code class="language-c">SKINUI_BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
ON_SKINUI_UPDATE_COMMAND_UI(IDC_MENU, OnUpdateCommandUI)
SKINUI_END_MESSAGE_MAP()
void CMainDialog::OnUpdateCommandUI(CView* pView)
{
pView->SetEnable(FALSE);
}</code></pre>
<h4>菜单的选中:</h4>
<ul>
<li>头文件</li>
</ul>
<pre><code class="language-c">void OnUpdateCommandUI(CView* pView);
SKINUI_DECLARE_MESSAGE_MAP()</code></pre>
<ul>
<li>源文件</li>
</ul>
<pre><code class="language-c">SKINUI_BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
ON_SKINUI_UPDATE_COMMAND_UI(IDC_MENU, OnUpdateCommandUI)
SKINUI_END_MESSAGE_MAP()
void CMainDialog::OnUpdateCommandUI(CView* pView)
{
pView->SetSelected(TRUE);
}</code></pre>
<h3>系统消息处理</h3>
<p>SkinUI内置了一些系统消息,可以自动解析消息的参数。</p>
<ul>
<li>参考下面的消息映射宏:</li>
</ul>
<pre><code class="language-c">ON_SKINUI_WM_CREATE()
ON_SKINUI_WM_PAINT()
ON_SKINUI_WM_NCPAINT()
ON_SKINUI_WM_NCACTIVATE()
ON_SKINUI_WM_ERASEBKGND()
ON_SKINUI_WM_SETCURSOR()
ON_SKINUI_WM_DESTROY()
ON_SKINUI_WM_SETFOCUS()
ON_SKINUI_WM_NCDESTROY()
ON_SKINUI_WM_NCLBUTTONDOWN()
ON_SKINUI_WM_NCCALCSIZE()
ON_SKINUI_WM_NCLBUTTONUP()
ON_SKINUI_WM_PARENTNOTIFY()
ON_SKINUI_WM_KILLFOCUS()
ON_SKINUI_WM_SIZE()
ON_SKINUI_WM_SYSKEYDOWN()
ON_SKINUI_WM_SYSKEYUP()
ON_SKINUI_WM_KEYDOWN()
ON_SKINUI_WM_KEYUP()
ON_SKINUI_WM_CHAR()
ON_SKINUI_WM_SIZING()
ON_SKINUI_WM_LBUTTONDOWN()
ON_SKINUI_WM_LBUTTONUP()
ON_SKINUI_WM_RBUTTONDOWN()
ON_SKINUI_WM_RBUTTONUP()
ON_SKINUI_WM_LBUTTONDBLCLK()
ON_SKINUI_WM_MOUSEMOVE()
ON_SKINUI_WM_MOUSEHOVER()
ON_SKINUI_WM_MOUSELEAVE()
ON_SKINUI_WM_MOUSEWHEEL()
ON_SKINUI_WM_NCHITTEST()
ON_SKINUI_WM_GETMINMAXINFO()
ON_SKINUI_WM_TIMER()
ON_SKINUI_WM_SYSCOMMAND()
ON_SKINUI_WM_CLOSE()
ON_SKINUI_WM_MOVE()
ON_SKINUI_WM_MOVING()
ON_SKINUI_WM_COPYDATA()
ON_SKINUI_WM_WINDOWPOSCHANGED()
ON_SKINUI_WM_ACTIVATE()
ON_SKINUI_WM_HOTKEY()
ON_SKINUI_WM_QUERYENDSESSION()
ON_SKINUI_WM_IME_STARTCOMPOSITION()
ON_SKINUI_WM_IME_ENDCOMPOSITION()
ON_SKINUI_WM_IME_COMPOSITION()
ON_SKINUI_WM_DISPLAYCHANGE()</code></pre>
<p>参考下面的示例:</p>
<ul>
<li>头文件</li>
</ul>
<pre><code class="language-c">void OnLButtonDown(UINT nFlags, CPoint point, BOOL& bHandle);
SKINUI_DECLARE_MESSAGE_MAP()</code></pre>
<ul>
<li>源文件</li>
</ul>
<pre><code class="language-c">SKINUI_BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
ON_SKINUI_WM_RBUTTONDOWN()
SKINUI_END_MESSAGE_MAP()
void CMainDialog::OnLButtonDown(UINT nFlags, CPoint point, BOOL& bHandle)
{
}</code></pre>
<h3>SkinUI消息处理</h3>
<p>SkinUI内置了一些系统消息,可以自动解析消息的参数。</p>
<ul>
<li>参考下面的消息映射宏:</li>
</ul>
<pre><code class="language-c">ON_SKINUI_WM_DROP_TEXT()
ON_SKINUI_WM_DROP_BITMAP()
ON_SKINUI_WM_DROP_FILE()
ON_SKINUI_WM_DROP_VIEW()
ON_SKINUI_WM_LOAD_START()
ON_SKINUI_WM_LOAD_END()
ON_SKINUI_WM_LOAD_ERROR()
ON_SKINUI_WM_SCROLL_TOP()
ON_SKINUI_WM_SCROLL_BOTTOM()
ON_SKINUI_WM_DATE_VIEW_CHANGE()
ON_SKINUI_WM_DATE_LAYOUT_CHANGE()
ON_SKINUI_WM_HOTKEY_CHANGE()
ON_SKINUI_WM_COMBOBOX_CHANGE()
ON_SKINUI_WM_EDIT_TEXT_CHANGE()
ON_SKINUI_WM_SCROLL_POS_CHANGE()
ON_SKINUI_WM_SLIDER_POS_CHANGE()
ON_SKINUI_WM_SPLITTER_POS_CHANGE()
ON_SKINUI_WM_WEBVIEW_TITLE_CHANGE()
ON_SKINUI_WM_CHECKBOX_CHECKED_CHANGE()
ON_SKINUI_WM_LISTVIEW_CHECKED_CHANGE()
ON_SKINUI_WM_RADIO_GROUP_CHECKED_CHANGE()
ON_SKINUI_WM_RADIO_BUTTON_CHECKED_CHANGE()
ON_SKINUI_WM_LISTITEM_DOUBLE_CLICKED()</code></pre>
<p>参考下面的示例:</p>
<ul>
<li>头文件</li>
</ul>
<pre><code class="language-c">void OnComboBoxChange(LONG nId, CComboBox* pComboBox, BOOL& bHandle);
SKINUI_DECLARE_MESSAGE_MAP()</code></pre>
<ul>
<li>源文件</li>
</ul>
<pre><code class="language-c">SKINUI_BEGIN_MESSAGE_MAP(CDemoComboBoxLayout, CScrollLayout)
ON_SKINUI_WM_COMBOBOX_CHANGE()
SKINUI_END_MESSAGE_MAP()
void CDemoComboBoxLayout::OnComboBoxChange(LONG nId, CComboBox* pComboBox, BOOL& bHandle)
{
bHandle = TRUE;
}</code></pre>
<h3>其他消息处理</h3>
<p>处理其他系统消息或者自定义消息,需要自己手动解析消息的参数,参考下面的示例:</p>
<ul>
<li>头文件</li>
</ul>
<pre><code class="language-c">enum
{
WM_THREAD_NOTIFY = WM_USER + 20000,
WM_START_LOAD,
WM_RESOURCE_RELOAD,
};</code></pre>
<pre><code class="language-cpp">LRESULT OnResourceReload(WPARAM wParam, LPARAM lParam);
LRESULT OnThreadNotify(WPARAM wParam, LPARAM lParam);
LRESULT OnStartLoad(WPARAM wParam, LPARAM lParam);
SKINUI_DECLARE_MESSAGE_MAP()</code></pre>
<ul>
<li>源文件</li>
</ul>
<pre><code class="language-c">SKINUI_BEGIN_MESSAGE_MAP(CDemoComboBoxLayout, CScrollLayout)
ON_SKINUI_MESSAGE(WM_RESOURCE_RELOAD, OnResourceReload)
ON_SKINUI_MESSAGE(WM_THREAD_NOTIFY, OnThreadNotify)
ON_SKINUI_MESSAGE(WM_START_LOAD, OnStartLoad)
SKINUI_END_MESSAGE_MAP()
LRESULT CMainDialog::OnResourceReload(WPARAM wParam, LPARAM lParam)
{
return 1L;
}
LRESULT CMainDialog::OnThreadNotify(WPARAM wParam, LPARAM lParam)
{
return 1L;
}
LRESULT CMainDialog::OnStartLoad(WPARAM wParam, LPARAM lParam)
{
return 1L;
}</code></pre>