<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>踽踽独行 &#124; IT tech,review and news - mopyman &#187; KWinUI</title>
	<atom:link href="http://blog.pcware.cn/tag/kwinui/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.pcware.cn</link>
	<description>Just for Freedom</description>
	<lastBuildDate>Wed, 08 Sep 2010 13:13:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>基于KWinUI的换肤框架KSkinX的简单Demo</title>
		<link>http://blog.pcware.cn/it/kwinui/skin_demo.html</link>
		<comments>http://blog.pcware.cn/it/kwinui/skin_demo.html#comments</comments>
		<pubDate>Fri, 14 Aug 2009 13:05:10 +0000</pubDate>
		<dc:creator>mopyman</dc:creator>
				<category><![CDATA[KWinUI]]></category>

		<guid isPermaLink="false">http://blog.pcware.cn/?p=434</guid>
		<description><![CDATA[KWinUI虽然很简洁，但仍然可以做不少事情。曾经有段时间，基于KWinUI写了一个换肤框架叫做KSkinX，现在就放出KSkinX的一个简单Demo。因为KSkinX还比较粗糙，比如滚动条的换肤尚未实现、标题栏按钮的处理还有待改进、实现的窗口组件还太少等原因，所以暂时还不开放源代码。 下面是这个换肤Demo的snapshots: Demo程序从此下载。]]></description>
			<content:encoded><![CDATA[<p>KWinUI虽然很简洁，但仍然可以做不少事情。曾经有段时间，基于KWinUI写了一个换肤框架叫做KSkinX，现在就放出KSkinX的一个简单Demo。因为KSkinX还比较粗糙，比如滚动条的换肤尚未实现、标题栏按钮的处理还有待改进、实现的窗口组件还太少等原因，所以暂时还不开放源代码。</p>
<p>下面是这个换肤Demo的snapshots:<br />

<a href='http://blog.pcware.cn/it/kwinui/skin_demo.html/attachment/normal' title='normal'><img width="150" height="150" src="http://blog.pcware.cn/wp-content/uploads/2009/08/normal-150x150.png" class="attachment-thumbnail" alt="normal" title="normal" /></a>
<a href='http://blog.pcware.cn/it/kwinui/skin_demo.html/attachment/skin' title='skin'><img width="150" height="150" src="http://blog.pcware.cn/wp-content/uploads/2009/08/skin-150x150.png" class="attachment-thumbnail" alt="skin" title="skin" /></a>
</p>
<p>Demo程序<a href="http://blog.pcware.cn/downloads/kwinui/skin_demo.zip">从此</a>下载。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pcware.cn/it/kwinui/skin_demo.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>KWinUI Sample:圆形滑动条(round slider)</title>
		<link>http://blog.pcware.cn/it/kwinui/kwinui_round_slider.html</link>
		<comments>http://blog.pcware.cn/it/kwinui/kwinui_round_slider.html#comments</comments>
		<pubDate>Tue, 14 Jul 2009 14:10:25 +0000</pubDate>
		<dc:creator>mopyman</dc:creator>
				<category><![CDATA[KWinUI]]></category>

		<guid isPermaLink="false">http://blog.pcware.cn/?p=386</guid>
		<description><![CDATA[这是早先发表于cppblog.com的一篇文章，现在稍作整理，迁移到此处。原文在此。 此sample主要是展示一个圆形的滑动条(Slider)组件，可以做播放器的音量按钮等此类的东西,还算比较酷。使用到的KRoundSlider类已经包含在KWinUI源代码中。 代码如下： &#160;1 #include &#34;kcstcmnctrls.h&#34; &#160;2 #include &#34;kapp.h&#34; &#160;3 #include &#34;resource.h&#34; &#160;4 &#160;5 using&#160;namespace&#160;kwinui; &#160;6 &#160;7 class&#160;KRndSliderDemoDlg : public&#160;KDialogBase&#60;KRndSliderDemoDlg&#62;{ &#160;8 public: &#160;9 &#160;&#160;&#160;&#160;BEGIN_MSG_MAP 10 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MSG_HANDLER(WM_INITDIALOG,OnInitDialog) 11 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;COMMAND_ID_HANDLER(IDOK,OnOK) 12 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;COMMAND_ID_HANDLER(IDCANCEL,OnOK) 13 &#160;&#160;&#160;&#160;END_MSG_MAP(KDialogBase&#60;KRndSliderDemoDlg&#62;) 14 15 &#160;&#160;&#160;&#160;enum{IDD=IDD_DLG_ROUND_SLIDER}; 16 &#160;&#160;&#160;&#160; 17 &#160;&#160;&#160;&#160;LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,bool&#38; bHandled){ 18 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_rscSlider1.SubclassDlgItem(IDC_SLIDER1,*this); 19 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_rscSlider2.SubclassDlgItem(IDC_SLIDER2,*this); 20 21 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_rscSlider1.SetRange(-179, 180, FALSE); 22 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_rscSlider1.SetPos(42); [...]]]></description>
			<content:encoded><![CDATA[<p>这是早先发表于cppblog.com的一篇文章，现在稍作整理，迁移到此处。<a href="http://www.cppblog.com/proguru/archive/2008/08/25/59932.html">原文在此</a>。<br />
此sample主要是展示一个圆形的滑动条(Slider)组件，可以做播放器的音量按钮等此类的东西,还算比较酷。使用到的KRoundSlider类已经包含在KWinUI源代码中。</p>
<p><span id="more-386"></span><br />
代码如下：<br />
<font color="#a52a2a">&nbsp;1 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;kcstcmnctrls.h&quot;</font><br />
<font color="#a52a2a">&nbsp;2 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;kapp.h&quot;</font><br />
<font color="#a52a2a">&nbsp;3 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;resource.h&quot;</font><br />
<font color="#a52a2a">&nbsp;4 </font><br />
<font color="#a52a2a">&nbsp;5 </font><font color="#a52a2a"><b>using</b></font>&nbsp;<font color="#2e8b57"><b>namespace</b></font>&nbsp;kwinui;<br />
<font color="#a52a2a">&nbsp;6 </font><br />
<font color="#a52a2a">&nbsp;7 </font><font color="#2e8b57"><b>class</b></font>&nbsp;KRndSliderDemoDlg : <font color="#a52a2a"><b>public</b></font>&nbsp;KDialogBase&lt;KRndSliderDemoDlg&gt;{<br />
<font color="#a52a2a">&nbsp;8 </font><font color="#a52a2a"><b>public</b></font>:<br />
<font color="#a52a2a">&nbsp;9 </font>&nbsp;&nbsp;&nbsp;&nbsp;BEGIN_MSG_MAP<br />
<font color="#a52a2a">10 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSG_HANDLER(WM_INITDIALOG,OnInitDialog)<br />
<font color="#a52a2a">11 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COMMAND_ID_HANDLER(IDOK,OnOK)<br />
<font color="#a52a2a">12 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COMMAND_ID_HANDLER(IDCANCEL,OnOK)<br />
<font color="#a52a2a">13 </font>&nbsp;&nbsp;&nbsp;&nbsp;END_MSG_MAP(KDialogBase&lt;KRndSliderDemoDlg&gt;)<br />
<font color="#a52a2a">14 </font><br />
<font color="#a52a2a">15 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>enum</b></font>{IDD=IDD_DLG_ROUND_SLIDER};<br />
<font color="#a52a2a">16 </font>&nbsp;&nbsp;&nbsp;&nbsp;<br />
<font color="#a52a2a">17 </font>&nbsp;&nbsp;&nbsp;&nbsp;LRESULT OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,<font color="#2e8b57"><b>bool</b></font>&amp; bHandled){<br />
<font color="#a52a2a">18 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider1.SubclassDlgItem(IDC_SLIDER1,*<font color="#a52a2a"><b>this</b></font>);<br />
<font color="#a52a2a">19 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider2.SubclassDlgItem(IDC_SLIDER2,*<font color="#a52a2a"><b>this</b></font>);<br />
<font color="#a52a2a">20 </font><br />
<font color="#a52a2a">21 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider1.SetRange(-<font color="#ff00ff">179</font>, <font color="#ff00ff">180</font>, FALSE);<br />
<font color="#a52a2a">22 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider1.SetPos(<font color="#ff00ff">42</font>);<br />
<font color="#a52a2a">23 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider1.SetZero(<font color="#ff00ff">90</font>);<br />
<font color="#a52a2a">24 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider1.SetInverted();<br />
<font color="#a52a2a">25 </font><br />
<font color="#a52a2a">26 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider1.SetDialColor(RGB(<font color="#ff00ff">255</font>, <font color="#ff00ff">255</font>, <font color="#ff00ff">0</font>));<br />
<font color="#a52a2a">27 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider1.SetKnobColor(RGB(<font color="#ff00ff">0</font>, <font color="#ff00ff">0</font>, <font color="#ff00ff">255</font>));<br />
<font color="#a52a2a">28 </font><br />
<font color="#a52a2a">29 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider2.SetRange(<font color="#ff00ff">875</font>, <font color="#ff00ff">1080</font>, FALSE);<br />
<font color="#a52a2a">30 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider2.SetPos(<font color="#ff00ff">948</font>);<br />
<font color="#a52a2a">31 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider2.SetZero(<font color="#ff00ff">180</font>);<br />
<font color="#a52a2a">32 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider2.SetRadioButtonStyle(); <br />
<font color="#a52a2a">33 </font><br />
<font color="#a52a2a">34 </font><br />
<font color="#a52a2a">35 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider2.SetFontName(_T(<font color="#ff00ff">&quot;Comic Sans MS&quot;</font>));<br />
<font color="#a52a2a">36 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider2.SetFontSize(<font color="#ff00ff">14</font>);<br />
<font color="#a52a2a">37 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider2.SetFontItalic();<br />
<font color="#a52a2a">38 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider2.SetTextColor(RGB(<font color="#ff00ff">0</font>, <font color="#ff00ff">0</font>, <font color="#ff00ff">255</font>));<br />
<font color="#a52a2a">39 </font><br />
<font color="#a52a2a">40 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CentralizeWindow();<br />
<font color="#a52a2a">41 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;TRUE;<br />
<font color="#a52a2a">42 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">43 </font>&nbsp;&nbsp;&nbsp;&nbsp;LRESULT OnOK(WORD wID,WORD wNotifyCode,HWND hWndCtrl,<font color="#2e8b57"><b>bool</b></font>&amp; bHandled){<br />
<font color="#a52a2a">44 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndDialog(wID);<br />
<font color="#a52a2a">45 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;<font color="#ff00ff">0</font>;<br />
<font color="#a52a2a">46 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">47 </font><font color="#a52a2a"><b>private</b></font>:<br />
<font color="#a52a2a">48 </font>&nbsp;&nbsp;&nbsp;&nbsp;KRoundSlider&nbsp;&nbsp;&nbsp;&nbsp;m_rscSlider1,m_rscSlider2;<br />
<font color="#a52a2a">49 </font>};<br />
<font color="#a52a2a">50 </font><br />
<font color="#a52a2a">51 </font><font color="#2e8b57"><b>class</b></font>&nbsp;KRndSliderDemo : <font color="#a52a2a"><b>public</b></font>&nbsp;KWinApp&lt;KRndSliderDemo&gt;{<br />
<font color="#a52a2a">52 </font><font color="#a52a2a"><b>public</b></font>:<br />
<font color="#a52a2a">53 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>bool</b></font>&nbsp;InitInstance(){<br />
<font color="#a52a2a">54 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KRndSliderDemoDlg dlg;<br />
<font color="#a52a2a">55 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dlg.DoModal();<br />
<font color="#a52a2a">56 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;<font color="#ff00ff">false</font>;<br />
<font color="#a52a2a">57 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">58 </font>};<br />
<font color="#a52a2a">59 </font><br />
<font color="#a52a2a">60 </font>KRndSliderDemo theApp;</p>
<p>程序主要是使用KRoundSlider类来子类化(subclass)两个标准的滑动条控制(slider control),其实这个类接管了WM_PAINT,WM_ERASEBKGROUND等绘制消息,所以两个标准控制只不过是充当占位符(placehold)而已,换成其他的标准控制也是一样。<br />
此程序编译需要用到kdc.cpp,kmisc.cpp和ktypes.cpp源文件。<br />
再次推荐ResEdit，很好的资源编辑器。<br />
Visual C++ 2008 Express sp1 win32 project默认设置静态链接Release版本生成的程序大小为108KB。<br />
截图：<a href="http://blog.pcware.cn/wp-content/uploads/2009/07/round_slider.png" rel="lightbox[386]"><img src="http://blog.pcware.cn/wp-content/uploads/2009/07/round_slider-300x209.png" alt="round_slider" title="round_slider" width="300" height="209" class="aligncenter size-medium wp-image-388" /></a><br />
<a href="http://blog.pcware.cn/downloads/kwinui/samples/round_slider.zip">代码下载</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pcware.cn/it/kwinui/kwinui_round_slider.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>KWinUI sample:工作线程(work thread)中的UI窗口</title>
		<link>http://blog.pcware.cn/it/kwinui/kwinui_work_thread_ui.html</link>
		<comments>http://blog.pcware.cn/it/kwinui/kwinui_work_thread_ui.html#comments</comments>
		<pubDate>Mon, 13 Jul 2009 11:34:11 +0000</pubDate>
		<dc:creator>mopyman</dc:creator>
				<category><![CDATA[KWinUI]]></category>

		<guid isPermaLink="false">http://blog.pcware.cn/?p=357</guid>
		<description><![CDATA[在一个多线程应用程序中，进程创建的第一个线程我们称之为主线程(main thread),而从主线程中通过系统调用派生的其他线程称之为工作线程(work thread)。虽然习惯上这么称呼，而在实际上这两种线程并没有本质的差别，他们的能力是完全一样的，唯一的区别就在于派生的先后顺序而已。 下面来演示一下KWinUI中如何使工作线程拥有窗口，代码如下： &#160;1 #include &#34;kwin.h&#34; &#160;2 #include &#34;kctrls.h&#34; &#160;3 #include &#34;kapp.h&#34; &#160;4 &#160;5 using&#160;namespace&#160;kwinui; &#160;6 &#160;7 class&#160;KMainWindow : public&#160;KWindowBase&#60;KMainWindow&#62;{ &#160;8 public: &#160;9 &#160;&#160;&#160;&#160;KMainWindow():KWindowBase&#60;KMainWindow&#62;(_T(&#34;MyClassName&#34;)){} 10 &#160;&#160;&#160;&#160;BEGIN_MSG_MAP 11 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MSG_HANDLER(WM_CREATE,OnCreate) 12 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;COMMAND_ID_HANDLER(1000,OnExit) 13 &#160;&#160;&#160;&#160;END_MSG_MAP(KWindowBase&#60;KMainWindow&#62;) 14 15 &#160;&#160;&#160;&#160;LRESULT OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,bool&#38; bHandled){ 16 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RECT rect1={30,30,90,60}; 17 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_btnExit.Create(*this,_T(&#34;exit&#34;),WS_CHILD&#124;WS_VISIBLE&#124;WS_TABSTOP,rect1,1000); 18 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;0; 19 &#160;&#160;&#160;&#160;} 20 &#160;&#160;&#160;&#160;LRESULT OnExit(WORD wID,WORD wNotifyCode,HWND [...]]]></description>
			<content:encoded><![CDATA[<p>在一个多线程应用程序中，进程创建的第一个线程我们称之为主线程(main thread),而从主线程中通过系统调用派生的其他线程称之为工作线程(work thread)。虽然习惯上这么称呼，而在实际上这两种线程并没有本质的差别，他们的能力是完全一样的，唯一的区别就在于派生的先后顺序而已。</p>
<p><span id="more-357"></span><br />
下面来演示一下KWinUI中如何使工作线程拥有窗口，代码如下：<br />
<font color="#a52a2a">&nbsp;1 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;kwin.h&quot;</font><br />
<font color="#a52a2a">&nbsp;2 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;kctrls.h&quot;</font><br />
<font color="#a52a2a">&nbsp;3 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;kapp.h&quot;</font><br />
<font color="#a52a2a">&nbsp;4 </font><br />
<font color="#a52a2a">&nbsp;5 </font><font color="#a52a2a"><b>using</b></font>&nbsp;<font color="#2e8b57"><b>namespace</b></font>&nbsp;kwinui;<br />
<font color="#a52a2a">&nbsp;6 </font><br />
<font color="#a52a2a">&nbsp;7 </font><font color="#2e8b57"><b>class</b></font>&nbsp;KMainWindow : <font color="#a52a2a"><b>public</b></font>&nbsp;KWindowBase&lt;KMainWindow&gt;{<br />
<font color="#a52a2a">&nbsp;8 </font><font color="#a52a2a"><b>public</b></font>:<br />
<font color="#a52a2a">&nbsp;9 </font>&nbsp;&nbsp;&nbsp;&nbsp;KMainWindow():KWindowBase&lt;KMainWindow&gt;(_T(<font color="#ff00ff">&quot;MyClassName&quot;</font>)){}<br />
<font color="#a52a2a">10 </font>&nbsp;&nbsp;&nbsp;&nbsp;BEGIN_MSG_MAP<br />
<font color="#a52a2a">11 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSG_HANDLER(WM_CREATE,OnCreate)<br />
<font color="#a52a2a">12 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COMMAND_ID_HANDLER(<font color="#ff00ff">1000</font>,OnExit)<br />
<font color="#a52a2a">13 </font>&nbsp;&nbsp;&nbsp;&nbsp;END_MSG_MAP(KWindowBase&lt;KMainWindow&gt;)<br />
<font color="#a52a2a">14 </font><br />
<font color="#a52a2a">15 </font>&nbsp;&nbsp;&nbsp;&nbsp;LRESULT OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,<font color="#2e8b57"><b>bool</b></font>&amp; bHandled){<br />
<font color="#a52a2a">16 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RECT rect1={<font color="#ff00ff">30</font>,<font color="#ff00ff">30</font>,<font color="#ff00ff">90</font>,<font color="#ff00ff">60</font>};<br />
<font color="#a52a2a">17 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_btnExit.Create(*<font color="#a52a2a"><b>this</b></font>,_T(<font color="#ff00ff">&quot;exit&quot;</font>),WS_CHILD|WS_VISIBLE|WS_TABSTOP,rect1,<font color="#ff00ff">1000</font>);<br />
<font color="#a52a2a">18 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;<font color="#ff00ff">0</font>;<br />
<font color="#a52a2a">19 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">20 </font>&nbsp;&nbsp;&nbsp;&nbsp;LRESULT OnExit(WORD wID,WORD wNotifyCode,HWND hWndCtrl,<font color="#2e8b57"><b>bool</b></font>&amp; bHandled){<br />
<font color="#a52a2a">21 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_nRetCode=wID;<br />
<font color="#a52a2a">22 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(WM_CLOSE);<br />
<font color="#a52a2a">23 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;<font color="#ff00ff">0</font>;<br />
<font color="#a52a2a">24 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">25 </font><font color="#a52a2a"><b>private</b></font>:<br />
<font color="#a52a2a">26 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>int</b></font>&nbsp;&nbsp;&nbsp;&nbsp; m_nRetCode;<br />
<font color="#a52a2a">27 </font>&nbsp;&nbsp;&nbsp;&nbsp;KButton m_btnExit;<br />
<font color="#a52a2a">28 </font>};<br />
<font color="#a52a2a">29 </font><br />
<font color="#a52a2a">30 </font><font color="#2e8b57"><b>class</b></font>&nbsp;KWorkThread : <font color="#a52a2a"><b>public</b></font>&nbsp;KThreadImpl&lt;KWorkThread&gt;{<br />
<font color="#a52a2a">31 </font><font color="#a52a2a"><b>public</b></font>:<br />
<font color="#a52a2a">32 </font>&nbsp;&nbsp;&nbsp;&nbsp;KWorkThread():KThreadImpl&lt;KWorkThread&gt;(CREATE_SUSPENDED){}<br />
<font color="#a52a2a">33 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>bool</b></font>&nbsp;InitInstance(){<br />
<font color="#a52a2a">34 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow=<font color="#a52a2a"><b>new</b></font>&nbsp;KMainWindow();<br />
<font color="#a52a2a">35 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow-&gt;CreateOverlappedWindow(_T(<font color="#ff00ff">&quot;work thread&#8217;s main window&quot;</font>));<br />
<font color="#a52a2a">36 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;<font color="#ff00ff">true</font>;<br />
<font color="#a52a2a">37 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">38 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>void</b></font>&nbsp;ExitInstance(){<br />
<font color="#a52a2a">39 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAFE_DEL_PTR(m_pMainWindow);<br />
<font color="#a52a2a">40 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">41 </font><font color="#a52a2a"><b>public</b></font>:<br />
<font color="#a52a2a">42 </font>&nbsp;&nbsp;&nbsp;&nbsp;KMainWindow* m_pMainWindow;<br />
<font color="#a52a2a">43 </font>};<br />
<font color="#a52a2a">44 </font><br />
<font color="#a52a2a">45 </font><font color="#2e8b57"><b>class</b></font>&nbsp;KThreadUIApp : <font color="#a52a2a"><b>public</b></font>&nbsp;KWinApp&lt;KThreadUIApp&gt;{<br />
<font color="#a52a2a">46 </font><font color="#a52a2a"><b>public</b></font>:<br />
<font color="#a52a2a">47 </font>&nbsp;&nbsp;&nbsp;&nbsp;KThreadUIApp():m_pMainWindow(<font color="#ff00ff">0</font>),m_pWorkThread(<font color="#ff00ff">0</font>){}<br />
<font color="#a52a2a">48 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>bool</b></font>&nbsp;InitInstance(){<br />
<font color="#a52a2a">49 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pWorkThread=<font color="#a52a2a"><b>new</b></font>&nbsp;KWorkThread();<br />
<font color="#a52a2a">50 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pWorkThread-&gt;ResumeThread();<br />
<font color="#a52a2a">51 </font><br />
<font color="#a52a2a">52 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow=<font color="#a52a2a"><b>new</b></font>&nbsp;KMainWindow();<br />
<font color="#a52a2a">53 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow-&gt;CreateOverlappedWindow(_T(<font color="#ff00ff">&quot;main thread&#8217;s main window&quot;</font>));<br />
<font color="#a52a2a">54 </font><br />
<font color="#a52a2a">55 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;<font color="#ff00ff">true</font>;<br />
<font color="#a52a2a">56 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">57 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>void</b></font>&nbsp;ExitInstance(){<br />
<font color="#a52a2a">58 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAFE_DEL_PTR(m_pMainWindow);<br />
<font color="#a52a2a">59 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAFE_DEL_PTR(m_pWorkThread);<br />
<font color="#a52a2a">60 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">61 </font>&nbsp;&nbsp;&nbsp;&nbsp;<br />
<font color="#a52a2a">62 </font><font color="#a52a2a"><b>private</b></font>:<br />
<font color="#a52a2a">63 </font>&nbsp;&nbsp;&nbsp;&nbsp;KMainWindow*&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow;<br />
<font color="#a52a2a">64 </font>&nbsp;&nbsp;&nbsp;&nbsp;KWorkThread*&nbsp;&nbsp;&nbsp;&nbsp;m_pWorkThread;<br />
<font color="#a52a2a">65 </font>};<br /> <br />
<font color="#a52a2a">66 </font><br />
<font color="#a52a2a">67 </font>KThreadUIApp theApp;</p>
<p>我们可以很清楚的看到，工作线程拥有UI窗口的方式与主线程是完全一样的，不过主线程多了一项简单的工作，创建工作线程而已。</p>
<p>我们甚至可以让主线程提前结束，而由工作线程继续显示窗口来与用户交互，这就更可以证明这两种线程是完全一样的。</p>
<p>用Visual C++ 2008 Express win32 project默认设置静态链接Release版本生成的程序大小为57KB。<br />
截图：<a href="http://blog.pcware.cn/wp-content/uploads/2009/07/threadui.png" rel="lightbox[357]"><img src="http://blog.pcware.cn/wp-content/uploads/2009/07/threadui-300x188.png" alt="threadui" title="threadui" width="300" height="188" class="aligncenter size-medium wp-image-361" /></a><br />
<a href="http://blog.pcware.cn/downloads/kwinui/samples/thread_ui.cpp">代码下载</a></p>
<p><font color="#FF0000">预告：近期会推出KWinUI换肤框架的Demo，敬请期待&#8230;</font></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pcware.cn/it/kwinui/kwinui_work_thread_ui.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>KWinUI:半透明窗口</title>
		<link>http://blog.pcware.cn/it/kwinui/transparent_window.html</link>
		<comments>http://blog.pcware.cn/it/kwinui/transparent_window.html#comments</comments>
		<pubDate>Sun, 05 Jul 2009 05:43:26 +0000</pubDate>
		<dc:creator>mopyman</dc:creator>
				<category><![CDATA[KWinUI]]></category>

		<guid isPermaLink="false">http://blog.pcware.cn/?p=320</guid>
		<description><![CDATA[KWinUI很轻松的就可以让我们拥有一个半透明窗口。 先贴代码 &#160;1 #include &#34;kwin.h&#34; &#160;2 #include &#34;kapp.h&#34; &#160;3 &#160;4 using&#160;namespace&#160;kwinui; &#160;5 &#160;6 class&#160;KMainWindow : public&#160;KWindowBase&#60;KMainWindow&#62;{ &#160;7 public: &#160;8 &#160;&#160;&#160;&#160;KMainWindow():KWindowBase&#60;KMainWindow&#62;(_T(&#34;transparent&#34;)){} &#160;9 10 &#160;&#160;&#160;&#160;BEGIN_MSG_MAP 11 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MSG_HANDLER(WM_CREATE,OnCreate) 12 &#160;&#160;&#160;&#160;END_MSG_MAP(KWindowBase&#60;KMainWindow&#62;) 13 &#160;&#160;&#160;&#160; 14 &#160;&#160;&#160;&#160;bool&#160;PreCreateWindow(CREATESTRUCT&#38; cs){ 15 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cs.dwExStyle&#124;=WS_EX_LAYERED; 16 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;true; 17 &#160;&#160;&#160;&#160;} 18 19 &#160;&#160;&#160;&#160;LRESULT OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,bool&#38; bHandled){ 20 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SetLayeredWindowAttributes(); 21 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;0; 22 &#160;&#160;&#160;&#160;} 23 }; 24 [...]]]></description>
			<content:encoded><![CDATA[<p>KWinUI很轻松的就可以让我们拥有一个半透明窗口。<br />
先贴代码<br />
<span id="more-320"></span><br />
<font color="#a52a2a">&nbsp;1 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;kwin.h&quot;</font><br />
<font color="#a52a2a">&nbsp;2 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;kapp.h&quot;</font><br />
<font color="#a52a2a">&nbsp;3 </font><br />
<font color="#a52a2a">&nbsp;4 </font><font color="#a52a2a"><b>using</b></font>&nbsp;<font color="#2e8b57"><b>namespace</b></font>&nbsp;kwinui;<br />
<font color="#a52a2a">&nbsp;5 </font><br />
<font color="#a52a2a">&nbsp;6 </font><font color="#2e8b57"><b>class</b></font>&nbsp;KMainWindow : <font color="#a52a2a"><b>public</b></font>&nbsp;KWindowBase&lt;KMainWindow&gt;{<br />
<font color="#a52a2a">&nbsp;7 </font><font color="#a52a2a"><b>public</b></font>:<br />
<font color="#a52a2a">&nbsp;8 </font>&nbsp;&nbsp;&nbsp;&nbsp;KMainWindow():KWindowBase&lt;KMainWindow&gt;(_T(<font color="#ff00ff">&quot;transparent&quot;</font>)){}<br />
<font color="#a52a2a">&nbsp;9 </font><br />
<font color="#a52a2a">10 </font>&nbsp;&nbsp;&nbsp;&nbsp;BEGIN_MSG_MAP<br />
<font color="#a52a2a">11 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSG_HANDLER(WM_CREATE,OnCreate)<br />
<font color="#a52a2a">12 </font>&nbsp;&nbsp;&nbsp;&nbsp;END_MSG_MAP(KWindowBase&lt;KMainWindow&gt;)<br />
<font color="#a52a2a">13 </font>&nbsp;&nbsp;&nbsp;&nbsp;<br />
<font color="#a52a2a">14 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>bool</b></font>&nbsp;PreCreateWindow(CREATESTRUCT&amp; cs){<br />
<font color="#a52a2a">15 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cs.dwExStyle|=WS_EX_LAYERED;<br />
<font color="#a52a2a">16 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;<font color="#ff00ff">true</font>;<br />
<font color="#a52a2a">17 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">18 </font><br />
<font color="#a52a2a">19 </font>&nbsp;&nbsp;&nbsp;&nbsp;LRESULT OnCreate(UINT uMsg,WPARAM wParam,LPARAM lParam,<font color="#2e8b57"><b>bool</b></font>&amp; bHandled){<br />
<font color="#a52a2a">20 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetLayeredWindowAttributes();<br />
<font color="#a52a2a">21 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;<font color="#ff00ff">0</font>;<br />
<font color="#a52a2a">22 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">23 </font>};<br />
<font color="#a52a2a">24 </font><br />
<font color="#a52a2a">25 </font><font color="#2e8b57"><b>class</b></font>&nbsp;KHelloApp : <font color="#a52a2a"><b>public</b></font>&nbsp;KWinApp&lt;KHelloApp&gt;{<br />
<font color="#a52a2a">26 </font><font color="#a52a2a"><b>public</b></font>:<br />
<font color="#a52a2a">27 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>bool</b></font>&nbsp;InitInstance(){<br />
<font color="#a52a2a">28 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow=<font color="#a52a2a"><b>new</b></font>&nbsp;KMainWindow();<br />
<font color="#a52a2a">29 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow-&gt;CreateOverlappedWindow(_T(<font color="#ff00ff">&quot;transparent window&quot;</font>));<br />
<font color="#a52a2a">30 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow-&gt;ShowWindow(m_nCmdShow);<br />
<font color="#a52a2a">31 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow-&gt;UpdateWindow();<br />
<font color="#a52a2a">32 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<font color="#a52a2a">33 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;<font color="#ff00ff">true</font>;<br />
<font color="#a52a2a">34 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">35 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>void</b></font>&nbsp;ExitInstance(){<br />
<font color="#a52a2a">36 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAFE_DEL_PTR(m_pMainWindow);<br />
<font color="#a52a2a">37 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">38 </font>&nbsp;&nbsp;&nbsp;&nbsp;<br />
<font color="#a52a2a">39 </font><font color="#a52a2a"><b>private</b></font>:<br />
<font color="#a52a2a">40 </font>&nbsp;&nbsp;&nbsp;&nbsp;KMainWindow* m_pMainWindow;<br />
<font color="#a52a2a">41 </font>};<br />
<font color="#a52a2a">42 </font><br />
<font color="#a52a2a">43 </font>KHelloApp hello;<br />
<br />
这个半透明窗口的实现主要是利用了随windows 2000 ship而来的分层窗口特性,代码14-17行在窗口建立之前为窗口增加扩展风格WS_EX_LAYERED,这样窗口就成为一个分层窗口。然后在WM_CREATE消息处理函数中调用SetLayeredWindowAttributes(0,128); 其中SetLayeredWindowAttributes是对windows同名函数的简单包装,SetLayeredWindowAttributes的函数原型为bool SetLayeredWindowAttributes(COLORREF crKey=(COLORREF)0,BYTE bAlpha=128,DWORD dwFlags=LWA_ALPHA);<br />
接受的参数如下：</p>
<ol>
<li>参数crKey是透明颜色,默认为0</li>
<li>参数bAlpha是透明度，取值0~255,0为完全透明，255为完全不透明,默认为128</li>
<li>参数dwFlags为透明模式，如果取值LWA_COLORKEY则使用第一个参数设置的透明颜色来使窗口透明，如果取值LWA_ALPHA则使用第二个参数设置的alpha值来透明化窗口,默认为LWA_ALPHA</li>
</ol>
<p>这里使用了默认参数。<br />
用Visual C++ 2008 Express win32 project默认设置静态链接Release版本生成的程序大小为54KB。<br />
截图:<a href="http://blog.pcware.cn/wp-content/uploads/2009/07/transparent_window.png" rel="lightbox[320]"><img src="http://blog.pcware.cn/wp-content/uploads/2009/07/transparent_window-300x226.png" alt="transparent_window" title="transparent_window" width="300" height="226" class="aligncenter size-medium wp-image-327" /></a><br />
<a href="http://blog.pcware.cn/downloads/kwinui/samples/transparent_window.cpp">代码下载</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pcware.cn/it/kwinui/transparent_window.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KWinUI sample 2: Dialog based应用程序</title>
		<link>http://blog.pcware.cn/it/kwinui/kwinui_sample_2_dialog_based_application.html</link>
		<comments>http://blog.pcware.cn/it/kwinui/kwinui_sample_2_dialog_based_application.html#comments</comments>
		<pubDate>Mon, 08 Jun 2009 05:50:27 +0000</pubDate>
		<dc:creator>mopyman</dc:creator>
				<category><![CDATA[KWinUI]]></category>

		<guid isPermaLink="false">http://blog.pcware.cn/?p=169</guid>
		<description><![CDATA[KWinUI配合ResEdit来开发Dialog Based Application还是比较轻松的。 启动ResEdit添加一个简单的dialog资源，ResEdit为你生成两个文件，一个是资源文件，一个包含资源ID的头文件resource.h。我这里简单的把这两个文件的内容贴出来。 resource.h 1 #ifndef IDC_STATIC 2 #define IDC_STATIC (-1) 3 #endif 4 5 #define IDD_DLG_MAIN&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;100 dlgmain.rc &#160;1 // Generated by ResEdit 1.4.4.19 &#160;2 // Copyright (C) 2006-2008 &#160;3 // http://www.resedit.net &#160;4 &#160;5 #include &#34;resource.h&#34; &#160;6 #include &#60;windows.h&#62; &#160;7 #include &#60;commctrl.h&#62; &#160;8 #include &#60;richedit.h&#62; &#160;9 10 11 // 12 // Dialog resources 13 [...]]]></description>
			<content:encoded><![CDATA[<p>KWinUI配合ResEdit来开发Dialog Based Application还是比较轻松的。</p>
<p>启动ResEdit添加一个简单的dialog资源，ResEdit为你生成两个文件，一个是资源文件，一个包含资源ID的头文件resource.h。我这里简单的把这两个文件的内容贴出来。<br />
<span id="more-169"></span><br />
resource.h<br />
<font color="#804040">1 </font><font color="#a020f0">#ifndef IDC_STATIC</font><br />
<font color="#804040">2 </font><font color="#a020f0">#define IDC_STATIC (-</font><font color="#ff00ff">1</font><font color="#a020f0">)</font><br />
<font color="#804040">3 </font><font color="#a020f0">#endif</font><br />
<font color="#804040">4 </font><br />
<font color="#804040">5 </font><font color="#a020f0">#define IDD_DLG_MAIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff00ff">100</font></p>
<p>dlgmain.rc<br />
<font color="#804040">&nbsp;1 </font><font color="#0000ff">// Generated by ResEdit 1.4.4.19</font><br />
<font color="#804040">&nbsp;2 </font><font color="#0000ff">// Copyright (C) 2006-2008</font><br />
<font color="#804040">&nbsp;3 </font><font color="#0000ff">// <a href="http://www.resedit.net">http://www.resedit.net</a></font><br />
<font color="#804040">&nbsp;4 </font><br />
<font color="#804040">&nbsp;5 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;resource.h&quot;</font><br />
<font color="#804040">&nbsp;6 </font><font color="#a020f0">#include </font><font color="#ff00ff">&lt;windows.h&gt;</font><br />
<font color="#804040">&nbsp;7 </font><font color="#a020f0">#include </font><font color="#ff00ff">&lt;commctrl.h&gt;</font><br />
<font color="#804040">&nbsp;8 </font><font color="#a020f0">#include </font><font color="#ff00ff">&lt;richedit.h&gt;</font><br />
<font color="#804040">&nbsp;9 </font><br />
<font color="#804040">10 </font><br />
<font color="#804040">11 </font><font color="#0000ff">//</font><br />
<font color="#804040">12 </font><font color="#0000ff">// Dialog resources</font><br />
<font color="#804040">13 </font><font color="#0000ff">//</font><br />
<font color="#804040">14 </font>IDD_DLG_MAIN <font color="#0000ff">DIALOG</font>&nbsp;<font color="#ff00ff">0</font>, <font color="#ff00ff">0</font>, <font color="#ff00ff">186</font>, <font color="#ff00ff">95</font><br />
<font color="#804040">15 </font><font color="#008000">STYLE</font>&nbsp;<font color="#804040">DS_3DLOOK</font>&nbsp;| <font color="#804040">DS_CENTER</font>&nbsp;| <font color="#804040">DS_MODALFRAME</font>&nbsp;| DS_SHELLFONT | <font color="#804040">WS_VISIBLE</font>&nbsp;| <font color="#804040">WS_BORDER</font>&nbsp;| <font color="#804040">WS_CAPTION</font>&nbsp;| <font color="#804040">WS_DLGFRAME</font>&nbsp;| <font color="#804040">WS_POPUP</font>&nbsp;| <font color="#804040">WS_SYSMENU</font><br />
<font color="#804040">16 </font><font color="#00ff00">CAPTION</font>&nbsp;<font color="#ff00ff">&quot;Dialog&quot;</font><br />
<font color="#804040">17 </font><font color="#008000">FONT</font>&nbsp;<font color="#ff00ff">8</font>, <font color="#ff00ff">&quot;Ms Shell Dlg 2&quot;</font><br />
<font color="#804040">18 </font>{<br />
<font color="#804040">19 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#00ff00">DEFPUSHBUTTON</font>&nbsp;&nbsp; <font color="#ff00ff">&quot;OK&quot;</font>, IDOK, <font color="#ff00ff">129</font>, <font color="#ff00ff">7</font>, <font color="#ff00ff">50</font>, <font color="#ff00ff">14</font>, <font color="#804040">BS_DEFPUSHBUTTON</font><br />
<font color="#804040">20 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#00ff00">PUSHBUTTON</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff00ff">&quot;Cancel&quot;</font>, <font color="#804040"><b>IDCANCEL</b></font>, <font color="#ff00ff">129</font>, <font color="#ff00ff">24</font>, <font color="#ff00ff">50</font>, <font color="#ff00ff">14</font>, <font color="#804040">BS_PUSHBUTTON</font><br />
<font color="#804040">21 </font>}</p>
<p>然后就是我们的KWinUI主程序了，内容如下：<br />
<font color="#804040">&nbsp;1 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;resource.h&quot;</font><br />
<font color="#804040">&nbsp;2 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;kapp.h&quot;</font><br />
<font color="#804040">&nbsp;3 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;kwin.h&quot;</font><br />
<font color="#804040">&nbsp;4 </font><br />
<font color="#804040">&nbsp;5 </font><font color="#804040"><b>using</b></font>&nbsp;<font color="#2e8b57"><b>namespace</b></font>&nbsp;kwinui;<br />
<font color="#804040">&nbsp;6 </font><br />
<font color="#804040">&nbsp;7 </font><font color="#2e8b57"><b>class</b></font>&nbsp;KDlgMain : <font color="#804040"><b>public</b></font>&nbsp;KDialogBase&lt;KDlgMain&gt;{<br />
<font color="#804040">&nbsp;8 </font><font color="#804040"><b>public</b></font>:<br />
<font color="#804040">&nbsp;9 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>typedef</b></font>&nbsp;KDialogBase&lt;KDlgMain&gt; __base;<br />
<font color="#804040">10 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>enum</b></font>{IDD=IDD_DLG_MAIN};<br />
<font color="#804040">11 </font><br />
<font color="#804040">12 </font>&nbsp;&nbsp;&nbsp;&nbsp;BEGIN_MSG_MAP<br />
<font color="#804040">13 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COMMAND_ID_HANDLER(IDOK,OnOK)<br />
<font color="#804040">14 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COMMAND_ID_HANDLER(IDCANCEL,OnCancel)<br />
<font color="#804040">15 </font>&nbsp;&nbsp;&nbsp;&nbsp;END_MSG_MAP(__base)<br />
<font color="#804040">16 </font><br />
<font color="#804040">17 </font>&nbsp;&nbsp;&nbsp;&nbsp;LRESULT OnOK(WORD wID,WORD wNotifyCode,HWND hWndCtrl,<font color="#2e8b57"><b>bool</b></font>&amp; bHandled){<br />
<font color="#804040">18 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage(_T(<font color="#ff00ff">&quot;KWinUI dialog based program sample!&quot;</font>));<br />
<font color="#804040">19 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>return</b></font>&nbsp;TRUE;<br />
<font color="#804040">20 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#804040">21 </font><br />
<font color="#804040">22 </font>&nbsp;&nbsp;&nbsp;&nbsp;LRESULT OnCancel(WORD wID,WORD wNotifyCode,HWND hWndCtrl,<font color="#2e8b57"><b>bool</b></font>&amp; bHandled){<br />
<font color="#804040">23 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndDialog(wID);<br />
<font color="#804040">24 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::PostQuitMessage(<font color="#ff00ff">0</font>);<br />
<font color="#804040">25 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>return</b></font>&nbsp;TRUE;<br />
<font color="#804040">26 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#804040">27 </font>};<br />
<font color="#804040">28 </font><br />
<font color="#804040">29 </font><font color="#2e8b57"><b>class</b></font>&nbsp;KDlgApp : <font color="#804040"><b>public</b></font>&nbsp;KWinApp&lt;KDlgApp&gt;{<br />
<font color="#804040">30 </font><font color="#804040"><b>public</b></font>:<br />
<font color="#804040">31 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>bool</b></font>&nbsp;InitInstance(){<br />
<font color="#804040">32 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow=<font color="#804040"><b>new</b></font>&nbsp;KDlgMain();<br />
<font color="#804040">33 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow-&gt;Create(<font color="#ff00ff">NULL</font>);<br />
<font color="#804040">34 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>return</b></font>&nbsp;<font color="#ff00ff">true</font>;<br />
<font color="#804040">35 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#804040">36 </font><font color="#804040"><b>private</b></font>:<br />
<font color="#804040">37 </font>&nbsp;&nbsp;&nbsp;&nbsp;KDlgMain* m_pMainWindow;<br />
<font color="#804040">38 </font>};<br />
<font color="#804040">39 </font><br />
<font color="#804040">40 </font>KDlgApp theApp;</p>
<p>当然，我这里创建的是一个无模式对话框，使用了KWinUI的消息循环，你也可以把第33、34行改为<br />
m_pMainWindow->DoModal();<br />
return false;<br />
这样的话会创建一个模式对话框，使用对话框自己提供的消息循环。<br />
使用模式对话框时，可以将程序的第24行注释掉，但是对于无模式对话框，此行代码必须存在才能正确的结束程序。</p>
<p>实际上KWinUI程序的风格和WTL是很相似的，有WTL开发经历的童鞋看到这段代码应该感觉比较亲切。<br />
用Visual C++ 2008 Express win32 project默认设置静态链接Release版本生成的程序大小为47KB。<br />
<a href="http://blog.pcware.cn/downloads/kwinui/samples/dialog_based.zip">代码下载</a><br />
截图：<a href="http://blog.pcware.cn/wp-content/uploads/2009/06/dialog.png" rel="lightbox[169]"><img src="http://blog.pcware.cn/wp-content/uploads/2009/06/dialog.png" alt="dialog" title="dialog" width="285" height="220" class="aligncenter size-full wp-image-170" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pcware.cn/it/kwinui/kwinui_sample_2_dialog_based_application.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于KWinUI的一些说明</title>
		<link>http://blog.pcware.cn/it/kwinui/kwinui_explain.html</link>
		<comments>http://blog.pcware.cn/it/kwinui/kwinui_explain.html#comments</comments>
		<pubDate>Sat, 06 Jun 2009 15:24:06 +0000</pubDate>
		<dc:creator>mopyman</dc:creator>
				<category><![CDATA[KWinUI]]></category>

		<guid isPermaLink="false">http://blog.pcware.cn/?p=160</guid>
		<description><![CDATA[在KWinUI发布的文章中有些事情没有说清楚，现在补充一下。 首先是KWinUI的开发和测试环境。在开发KWinUI的最初是用的Visual C++ 2005 Express和windows platform sdk,sdk的版本记不清楚了。对于开发工具，我是有新的不用旧的。后来换到了Visual C++ 2008 Express,sdk更新到了windows sdk 6.0。为什么要用Express版本，自然是因为它是免费的，而且相当的好用，运行速度飞快。VC的编辑器我是不用的，我还是习惯用vim，所以其实主要用到的还是它的Debugger，编译、链接的话用命令行也是一样的方便。KWinUI还特别考虑到了C++ Builder系列的兼容性，因为我早年用过一段时间C++ Builder，相当不错的工具。不过我只在Turbo C++ Explore下面做过测试，除了它生成的程序体积比VC大一些以外，其他都还正常。甚至KWinUI可以与VCL混合编程，我试过。所以使用VC 2005/2008 Express加上最新的windows sdk或者Turbo C++ Explore以上版本的C++ Builder,来使用KWinUI应该都是没有问题的。 其次是关于界面设计。KWinUI是没有可视化界面设计器的，不过对于Dialog Based应用来说，这也不是很大的问题，我习惯用ResEdit来设计界面，也是很方便的，ResEdit是一个很不错的资源编辑器，现在完全支持UNICODE，使用很简单。后面会放出几个这样的samples。后面的samples会尽量带上截图，可以更直观的看到用KWinUI做出来的程序长啥样子:)，其实不过就是标准的windows程序界面。KWinUI的程序支持系统的视觉样式也是很简单的，增加个manifest资源就可以了，关于这个网上介绍的不少。我也基于KWinUI做了一个支持程序换肤的库，不过还不太成熟，有机会可以展示一下。]]></description>
			<content:encoded><![CDATA[<p>在KWinUI发布的文章中有些事情没有说清楚，现在补充一下。</p>
<p>首先是KWinUI的开发和测试环境。在开发KWinUI的最初是用的Visual C++ 2005 Express和windows platform sdk,sdk的版本记不清楚了。对于开发工具，我是有新的不用旧的。后来换到了Visual C++ 2008 Express,sdk更新到了windows sdk 6.0。为什么要用Express版本，自然是因为它是免费的，而且相当的好用，运行速度飞快。VC的编辑器我是不用的，我还是习惯用vim，所以其实主要用到的还是它的Debugger，编译、链接的话用命令行也是一样的方便。KWinUI还特别考虑到了C++ Builder系列的兼容性，因为我早年用过一段时间C++ Builder，相当不错的工具。不过我只在Turbo C++ Explore下面做过测试，除了它生成的程序体积比VC大一些以外，其他都还正常。甚至KWinUI可以与VCL混合编程，我试过。所以使用VC 2005/2008 Express加上最新的windows sdk或者Turbo C++ Explore以上版本的C++ Builder,来使用KWinUI应该都是没有问题的。</p>
<p>其次是关于界面设计。KWinUI是没有可视化界面设计器的，不过对于Dialog Based应用来说，这也不是很大的问题，我习惯用<a href="http://www.resedit.net/">ResEdit</a>来设计界面，也是很方便的，ResEdit是一个很不错的资源编辑器，现在完全支持UNICODE，使用很简单。后面会放出几个这样的samples。后面的samples会尽量带上截图，可以更直观的看到用KWinUI做出来的程序长啥样子:)，其实不过就是标准的windows程序界面。KWinUI的程序支持系统的视觉样式也是很简单的，增加个manifest资源就可以了，关于这个网上介绍的不少。我也基于KWinUI做了一个支持程序换肤的库，不过还不太成熟，有机会可以展示一下。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pcware.cn/it/kwinui/kwinui_explain.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>KWinUI sample 1: Hello World</title>
		<link>http://blog.pcware.cn/it/kwinui/kwinui_first_sample.html</link>
		<comments>http://blog.pcware.cn/it/kwinui/kwinui_first_sample.html#comments</comments>
		<pubDate>Fri, 05 Jun 2009 09:27:37 +0000</pubDate>
		<dc:creator>mopyman</dc:creator>
				<category><![CDATA[KWinUI]]></category>

		<guid isPermaLink="false">http://blog.pcware.cn/?p=90</guid>
		<description><![CDATA[可能没有比Hello World更适合做第一个sample了。 下面就是KWinUI的Hello World程序。 &#160;1 #include &#34;kwin.h&#34; &#160;2 #include &#34;kapp.h&#34; &#160;3 &#160;4 using&#160;namespace&#160;kwinui; &#160;5 &#160;6 class&#160;KMainWindow : public&#160;KWindowBase&#60;KMainWindow&#62;{ &#160;7 public: &#160;8 &#160;&#160;&#160;&#160;KMainWindow():KWindowBase&#60;KMainWindow&#62;(_T(&#34;MyClassName&#34;)){} &#160;9 10 &#160;&#160;&#160;&#160;BEGIN_MSG_MAP 11 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MSG_HANDLER(WM_PAINT,OnPaint) 12 &#160;&#160;&#160;&#160;END_MSG_MAP(KWindowBase&#60;KMainWindow&#62;) 13 14 &#160;&#160;&#160;&#160;LRESULT OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,bool&#38; bHandled){ 15 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PAINTSTRUCT ps; 16 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;HDC hDC; 17 18 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RECT rect; 19 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;::GetClientRect(m_hWnd,&#38;rect); 20 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 21 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;hDC=::BeginPaint(m_hWnd,&#38;ps); 22 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;::SetBkMode(hDC,TRANSPARENT); [...]]]></description>
			<content:encoded><![CDATA[<p>可能没有比Hello World更适合做第一个sample了。</p>
<p>下面就是KWinUI的Hello World程序。<br />
<span id="more-90"></span><br />
<font color="#a52a2a">&nbsp;1 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;kwin.h&quot;</font><br />
<font color="#a52a2a">&nbsp;2 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;kapp.h&quot;</font><br />
<font color="#a52a2a">&nbsp;3 </font><br />
<font color="#a52a2a">&nbsp;4 </font><font color="#a52a2a"><b>using</b></font>&nbsp;<font color="#2e8b57"><b>namespace</b></font>&nbsp;kwinui;<br />
<font color="#a52a2a">&nbsp;5 </font><br />
<font color="#a52a2a">&nbsp;6 </font><font color="#2e8b57"><b>class</b></font>&nbsp;KMainWindow : <font color="#a52a2a"><b>public</b></font>&nbsp;KWindowBase&lt;KMainWindow&gt;{<br />
<font color="#a52a2a">&nbsp;7 </font><font color="#a52a2a"><b>public</b></font>:<br />
<font color="#a52a2a">&nbsp;8 </font>&nbsp;&nbsp;&nbsp;&nbsp;KMainWindow():KWindowBase&lt;KMainWindow&gt;(_T(<font color="#ff00ff">&quot;MyClassName&quot;</font>)){}<br />
<font color="#a52a2a">&nbsp;9 </font><br />
<font color="#a52a2a">10 </font>&nbsp;&nbsp;&nbsp;&nbsp;BEGIN_MSG_MAP<br />
<font color="#a52a2a">11 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSG_HANDLER(WM_PAINT,OnPaint)<br />
<font color="#a52a2a">12 </font>&nbsp;&nbsp;&nbsp;&nbsp;END_MSG_MAP(KWindowBase&lt;KMainWindow&gt;)<br />
<font color="#a52a2a">13 </font><br />
<font color="#a52a2a">14 </font>&nbsp;&nbsp;&nbsp;&nbsp;LRESULT OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam,<font color="#2e8b57"><b>bool</b></font>&amp; bHandled){<br />
<font color="#a52a2a">15 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PAINTSTRUCT ps;<br />
<font color="#a52a2a">16 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HDC hDC;<br />
<font color="#a52a2a">17 </font><br />
<font color="#a52a2a">18 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RECT rect;<br />
<font color="#a52a2a">19 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::GetClientRect(m_hWnd,&amp;rect);<br />
<font color="#a52a2a">20 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<font color="#a52a2a">21 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hDC=::BeginPaint(m_hWnd,&amp;ps);<br />
<font color="#a52a2a">22 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::SetBkMode(hDC,TRANSPARENT);<br />
<font color="#a52a2a">23 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::DrawText(hDC,_T(<font color="#ff00ff">&quot;Hell World!&quot;</font>),-<font color="#ff00ff">1</font>,&amp;rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);<br />
<font color="#a52a2a">24 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::EndPaint(m_hWnd,&amp;ps);<br />
<font color="#a52a2a">25 </font><br />
<font color="#a52a2a">26 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;<font color="#ff00ff">0</font>;<br />
<font color="#a52a2a">27 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">28 </font>};<br />
<font color="#a52a2a">29 </font><br />
<font color="#a52a2a">30 </font><font color="#2e8b57"><b>class</b></font>&nbsp;KUIThreadApp : <font color="#a52a2a"><b>public</b></font>&nbsp;KWinApp&lt;KUIThreadApp&gt;{<br />
<font color="#a52a2a">31 </font><font color="#a52a2a"><b>public</b></font>:<br />
<font color="#a52a2a">32 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>bool</b></font>&nbsp;InitInstance(){<br />
<font color="#a52a2a">33 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow=<font color="#a52a2a"><b>new</b></font>&nbsp;KMainWindow();<br />
<font color="#a52a2a">34 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow-&gt;CreateOverlappedWindow(_T(<font color="#ff00ff">&quot;Hello World!&quot;</font>));<br />
<font color="#a52a2a">35 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow-&gt;ShowWindow(m_nCmdShow);<br />
<font color="#a52a2a">36 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWindow-&gt;UpdateWindow();<br />
<font color="#a52a2a">37 </font><br />
<font color="#a52a2a">38 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;<font color="#ff00ff">true</font>;<br />
<font color="#a52a2a">39 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">40 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>void</b></font>&nbsp;ExitInstance(){<br />
<font color="#a52a2a">41 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAFE_DEL_PTR(m_pMainWindow);<br />
<font color="#a52a2a">42 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">43 </font>&nbsp;&nbsp;&nbsp;&nbsp;<br />
<font color="#a52a2a">44 </font><font color="#a52a2a"><b>private</b></font>:<br />
<font color="#a52a2a">45 </font>&nbsp;&nbsp;&nbsp;&nbsp;KMainWindow* m_pMainWindow;<br />
<font color="#a52a2a">46 </font>};<br />
<font color="#a52a2a">47 </font><br />
<font color="#a52a2a">48 </font>KUIThreadApp theApp;</p>
<p><a href="http://blog.pcware.cn/downloads/kwinui/samples/hello.cpp">代码下载</a><br />
用Visual C++ 2008 Express win32 project默认设置静态链接Release版本生成的程序大小为54KB。<br />
截图：<a href="http://blog.pcware.cn/wp-content/uploads/2009/06/hello.png" rel="lightbox[90]"><img src="http://blog.pcware.cn/wp-content/uploads/2009/06/hello-300x173.png" alt="hello" title="hello" width="300" height="173" class="aligncenter size-medium wp-image-167" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pcware.cn/it/kwinui/kwinui_first_sample.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>轻量级开源C++ GUI开发框架KWinUI发布</title>
		<link>http://blog.pcware.cn/it/kwinui/kwinui_0_1_0_release.html</link>
		<comments>http://blog.pcware.cn/it/kwinui/kwinui_0_1_0_release.html#comments</comments>
		<pubDate>Fri, 05 Jun 2009 09:04:54 +0000</pubDate>
		<dc:creator>mopyman</dc:creator>
				<category><![CDATA[KWinUI]]></category>

		<guid isPermaLink="false">http://blog.pcware.cn/?p=86</guid>
		<description><![CDATA[windows平台上的GUI框架已经有很多了，为什么还会有KWinUI? 答案就是轻量，高效，线程安全，并且可以完全掌控。 比较各种GUI Framework的优劣是没有太多意义的，存在的东西都有它存在的合理性和适用的范围。从来没有能满足所有需求的东西，C++亦如是，虽然它是如此的强大。KWinUI来源自开发实践，是做一个项目过程中产生的。对于一个界面并不算复杂的小项目来说，那些重量级的framework太过沉重了,而每次用SDK来写界面，显然又过于繁琐了，所以有了KWinUI。KWinUI使用C++来包装windows SDK,并没有使用太复杂的技术，太复杂的我也不会:)，主要使用了thunk技术和C++模板的静多态特性，并且仔细考虑了线程安全，毕竟在这个多核的时代，如果不是线程安全的就显得不那么in。 跨平台不是KWinUI的诉求，现在不是、将来也不是，现在就有很多十分优秀的跨平台GUI开发框架，比如VCF,wxWidget,gtk+,QT等。KWinUI更像是一个自娱自乐的产物，只是觉得它可能对其他一些人也有用处，所有采用lgpl协议将它公布于众，如果能对其他人有些微的帮助，那么开放它的目的就达到了。采用lgpl的好处就是你可以放心的使用KWinUI,就是在商业程序中使用也没有问题。但是如果你对KWinUI做了更好的修改，最好公布一下修改的代码，以便给其他人以帮助。就算KWinUI真的没啥价值，这样发布应该也不会对别人造成什么伤害，权当娱乐一回吧，呵呵。 KWinUI的主要特性如下： 轻量、高效、资源占用少、线程安全、使用简单，差不多就这些了。 KWinUI因为使用了模板技术，所以就是一堆头文件和几个cpp文件，使用起来相当简单，后面我会继续发几个简单的sample来演示如何使用KWinUI。 如果非要有一个版本号的话，那么就定为 0.1.0吧，因为KWinUI实在是挺稚嫩的。 如果有人对KWinUI有兴趣，欢迎对它进行进一步的修改。 KWinUI的全部源程序从此下载，很小的，我保证你瞬间就能下载下来:)]]></description>
			<content:encoded><![CDATA[<p>windows平台上的GUI框架已经有很多了，为什么还会有KWinUI?<br />
答案就是轻量，高效，线程安全，并且可以完全掌控。</p>
<p>比较各种GUI Framework的优劣是没有太多意义的，存在的东西都有它存在的合理性和适用的范围。从来没有能满足所有需求的东西，C++亦如是，虽然它是如此的强大。KWinUI来源自开发实践，是做一个项目过程中产生的。对于一个界面并不算复杂的小项目来说，那些重量级的framework太过沉重了,而每次用SDK来写界面，显然又过于繁琐了，所以有了KWinUI。KWinUI使用C++来包装windows SDK,并没有使用太复杂的技术，太复杂的我也不会:)，主要使用了<a href="http://blog.pcware.cn/it/kwinui/gui_wndproc_thunk.html" target="_blank">thunk技术</a>和C++模板的静多态特性，并且仔细考虑了线程安全，毕竟在这个多核的时代，如果不是线程安全的就显得不那么in。</p>
<p>跨平台不是KWinUI的诉求，现在不是、将来也不是，现在就有很多十分优秀的跨平台GUI开发框架，比如<a href="http://vcf-online.org/" target="_blank">VCF</a>,wxWidget,<a href="http://www.gtk.org" target="_blank">gtk+</a>,QT等。KWinUI更像是一个自娱自乐的产物，只是觉得它可能对其他一些人也有用处，所有采用lgpl协议将它公布于众，如果能对其他人有些微的帮助，那么开放它的目的就达到了。采用lgpl的好处就是你可以放心的使用KWinUI,就是在商业程序中使用也没有问题。但是如果你对KWinUI做了更好的修改，最好公布一下修改的代码，以便给其他人以帮助。就算KWinUI真的没啥价值，这样发布应该也不会对别人造成什么伤害，权当娱乐一回吧，呵呵。</p>
<p>KWinUI的主要特性如下：<br />
轻量、高效、资源占用少、线程安全、使用简单，差不多就这些了。</p>
<p>KWinUI因为使用了模板技术，所以就是一堆头文件和几个cpp文件，使用起来相当简单，后面我会继续发几个简单的sample来演示如何使用KWinUI。</p>
<p>如果非要有一个版本号的话，那么就定为 0.1.0吧，因为KWinUI实在是挺稚嫩的。</p>
<p>如果有人对KWinUI有兴趣，欢迎对它进行进一步的修改。</p>
<p>KWinUI的全部源程序<a href="http://blog.pcware.cn/downloads/kwinui/kwinui-0.1.0.zip">从此</a>下载，很小的，我保证你瞬间就能下载下来:)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pcware.cn/it/kwinui/kwinui_0_1_0_release.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>GUI之窗口过程thunk</title>
		<link>http://blog.pcware.cn/it/kwinui/gui_wndproc_thunk.html</link>
		<comments>http://blog.pcware.cn/it/kwinui/gui_wndproc_thunk.html#comments</comments>
		<pubDate>Thu, 04 Jun 2009 13:50:20 +0000</pubDate>
		<dc:creator>mopyman</dc:creator>
				<category><![CDATA[KWinUI]]></category>

		<guid isPermaLink="false">http://blog.pcware.cn/?p=65</guid>
		<description><![CDATA[thunk是什么？查字典只能让人一头雾水。thunk是一段插入程序中实现特定功能的二进制代码，这个定义是我下的，对不对各位看官请自己斟酌，呵呵。 我这里要讲的是窗口回调专用thunk，thunk的核心是调用栈动态修改技术。地球人都知道，windows的窗口回调函数是一个全局函数，类成员函数 是不可以作为窗口回调函数的，因为它有this指针，这给我们用C++来包装窗口带来不小的麻烦。你说什么？用一个全局函数或类的静态成员函数来做窗口回 调函数？这肯定没问题。但是这样带来的麻烦也许比你想象的要多，想想我们的GUI Framework不会只有一个类，而是一个类层级结构，会有许许多许多、形形色色的widget，每个都是一个窗口。对象与窗口之间的映射可能就是个不 小的问题，像MFC那样搞？太落伍了吧！用thunk就要简单的多。WTL用了thunk，但是不够彻底。 废话少说，先贴出thunk核心代码。 &#160;20 /* &#160;21 &#160;*&#160;&#160;thunk with DEP support &#160;22 &#160;* &#160;23 &#160;*&#160;&#160;author:proguru &#160;24 &#160;*&#160;&#160;July 9,2008 &#160;25 &#160;*/ &#160;26 /* &#160;27 &#160;*&#160;&#160;modify x64 thunk code according to the feedback from Loaden &#160;28 &#160;*&#160;&#160;&#34;http://topic.csdn.net/u/20090322/08/b6bf82ca-8ba2-452b-92f8-bb2adb05a1ef.html&#34; &#160;29 &#160;*&#160;&#160;maybe also &#34;http://www.qpsoft.com/blog/x64-thunk-callback-conversion/&#34; &#160;30 &#160;*&#160;&#160; &#160;31 &#160;*&#160;&#160;proguru &#160;32 &#160;*&#160;&#160;June 04,2009 &#160;33 &#160;*/ &#160;34 &#160;35 #ifndef __KTHUNK_H__ [...]]]></description>
			<content:encoded><![CDATA[<p>thunk是什么？查字典只能让人一头雾水。thunk是一段插入程序中实现特定功能的二进制代码，这个定义是我下的，对不对各位看官请自己斟酌，呵呵。</p>
<p>我这里要讲的是窗口回调专用thunk，thunk的核心是调用栈动态修改技术。地球人都知道，windows的窗口回调函数是一个全局函数，类成员函数 是不可以作为窗口回调函数的，因为它有this指针，这给我们用C++来包装窗口带来不小的麻烦。你说什么？用一个全局函数或类的静态成员函数来做窗口回 调函数？这肯定没问题。但是这样带来的麻烦也许比你想象的要多，想想我们的GUI Framework不会只有一个类，而是一个类层级结构，会有许许多许多、形形色色的widget，每个都是一个窗口。对象与窗口之间的映射可能就是个不 小的问题，像MFC那样搞？太落伍了吧！用thunk就要简单的多。WTL用了thunk，但是不够彻底。<br />
废话少说，先贴出thunk核心代码。</p>
<p><span id="more-65"></span><br />
<font color="#a52a2a">&nbsp;20 </font><font color="#0000ff">/*</font><br />
<font color="#a52a2a">&nbsp;21 </font><font color="#0000ff">&nbsp;*&nbsp;&nbsp;thunk with DEP support</font><br />
<font color="#a52a2a">&nbsp;22 </font><font color="#0000ff">&nbsp;*</font><br />
<font color="#a52a2a">&nbsp;23 </font><font color="#0000ff">&nbsp;*&nbsp;&nbsp;author:proguru</font><br />
<font color="#a52a2a">&nbsp;24 </font><font color="#0000ff">&nbsp;*&nbsp;&nbsp;July 9,2008</font><br />
<font color="#a52a2a">&nbsp;25 </font><font color="#0000ff">&nbsp;</font><font color="#0000ff">*/</font><br />
<font color="#a52a2a">&nbsp;26 </font><font color="#0000ff">/*</font><br />
<font color="#a52a2a">&nbsp;27 </font><font color="#0000ff">&nbsp;*&nbsp;&nbsp;modify x64 thunk code according to the feedback from Loaden </font><br />
<font color="#a52a2a">&nbsp;28 </font><font color="#0000ff">&nbsp;*&nbsp;&nbsp;&quot;<a href="http://topic.csdn.net/u/20090322/08/b6bf82ca-8ba2-452b-92f8-bb2adb05a1ef.html">http://topic.csdn.net/u/20090322/08/b6bf82ca-8ba2-452b-92f8-bb2adb05a1ef.html</a>&quot;</font><br />
<font color="#a52a2a">&nbsp;29 </font><font color="#0000ff">&nbsp;*&nbsp;&nbsp;maybe also &quot;<a href="http://www.qpsoft.com/blog/x64-thunk-callback-conversion/">http://www.qpsoft.com/blog/x64-thunk-callback-conversion/</a>&quot;</font><br />
<font color="#a52a2a">&nbsp;30 </font><font color="#0000ff">&nbsp;*&nbsp;&nbsp;</font><br />
<font color="#a52a2a">&nbsp;31 </font><font color="#0000ff">&nbsp;*&nbsp;&nbsp;proguru </font><br />
<font color="#a52a2a">&nbsp;32 </font><font color="#0000ff">&nbsp;*&nbsp;&nbsp;June 04,2009</font><br />
<font color="#a52a2a">&nbsp;33 </font><font color="#0000ff">&nbsp;</font><font color="#0000ff">*/</font><br />
<font color="#a52a2a">&nbsp;34 </font><br />
<font color="#a52a2a">&nbsp;35 </font><font color="#a020f0">#ifndef __KTHUNK_H__</font><br />
<font color="#a52a2a">&nbsp;36 </font><font color="#a020f0">#define __KTHUNK_H__</font><br />
<font color="#a52a2a">&nbsp;37 </font><font color="#a020f0">#include </font><font color="#ff00ff">&quot;windows.h&quot;</font><br />
<font color="#a52a2a">&nbsp;38 </font>&nbsp;<br />
<font color="#a52a2a">&nbsp;39 </font><font color="#2e8b57"><b>namespace</b></font>&nbsp;kwinui{<br />
<font color="#a52a2a">&nbsp;40 </font><br />
<font color="#a52a2a">&nbsp;41 </font><font color="#0000ff">//#define USE_THISCALL_CONVENTION&nbsp;&nbsp; //turn it off for c++ builder compatibility</font><br />
<font color="#a52a2a">&nbsp;42 </font><br />
<font color="#a52a2a">&nbsp;43 </font><font color="#a020f0">#ifdef USE_THISCALL_CONVENTION</font><br />
<font color="#a52a2a">&nbsp;44 </font><font color="#a020f0">&nbsp;&nbsp;&nbsp;&nbsp;#define WNDPROC_THUNK_LENGTH&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff00ff">29</font><font color="#a020f0">&nbsp;&nbsp;</font><font color="#0000ff">//For __thiscall calling convention ONLY,assign m_hWnd by thunk</font><br />
<font color="#a52a2a">&nbsp;45 </font><font color="#a020f0">&nbsp;&nbsp;&nbsp;&nbsp;#define GENERAL_THUNK_LENGTH&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff00ff">10</font><br />
<font color="#a52a2a">&nbsp;46 </font><font color="#a020f0">&nbsp;&nbsp;&nbsp;&nbsp;#define KCALLBACK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#0000ff">//__thiscall is default</font><br />
<font color="#a52a2a">&nbsp;47 </font><font color="#a020f0">#else</font><br />
<font color="#a52a2a">&nbsp;48 </font><font color="#a020f0">&nbsp;&nbsp;&nbsp;&nbsp;#define WNDPROC_THUNK_LENGTH&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff00ff">22</font><font color="#a020f0">&nbsp;</font><font color="#0000ff">//__stdcall calling convention ONLY,assign m_hWnd by thunk</font><br />
<font color="#a52a2a">&nbsp;49 </font><font color="#a020f0">&nbsp;&nbsp;&nbsp;&nbsp;#define GENERAL_THUNK_LENGTH&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff00ff">16</font><br />
<font color="#a52a2a">&nbsp;50 </font><font color="#a020f0">&nbsp;&nbsp;&nbsp;&nbsp;#define KCALLBACK __stdcall</font><br />
<font color="#a52a2a">&nbsp;51 </font><font color="#a020f0">#endif</font><br />
<font color="#a52a2a">&nbsp;52 </font><br />
<font color="#a52a2a">&nbsp;53 </font><font color="#a020f0">#define WNDPROC_THUNK_LENGTH_X64&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff00ff">28</font><br />
<font color="#a52a2a">&nbsp;54 </font><font color="#a020f0">#define GENERAL_THUNK_LENGTH_X64&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#ff00ff">34</font><br />
<font color="#a52a2a">&nbsp;55 </font><br />
<font color="#a52a2a">&nbsp;56 </font><font color="#2e8b57"><b>static</b></font>&nbsp;HANDLE g_hHeapExecutable;<br />
<font color="#a52a2a">&nbsp;57 </font><br />
<font color="#a52a2a">&nbsp;58 </font><font color="#2e8b57"><b>class</b></font>&nbsp;KThunkBase{<br />
<font color="#a52a2a">&nbsp;59 </font><font color="#a52a2a"><b>public</b></font>:<br />
<font color="#a52a2a">&nbsp;60 </font>&nbsp;&nbsp;&nbsp;&nbsp;KThunkBase(SIZE_T size){<br />
<font color="#a52a2a">&nbsp;61 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>if</b></font>(!g_hHeapExecutable){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">//first thunk,create the executable heap</font><br />
<font color="#a52a2a">&nbsp;62 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_hHeapExecutable=::HeapCreate(HEAP_CREATE_ENABLE_EXECUTE,<font color="#ff00ff">0</font>,<font color="#ff00ff">0</font>);<br />
<font color="#a52a2a">&nbsp;63 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">//if (!g_hHeapExecutable) abort</font><br />
<font color="#a52a2a">&nbsp;64 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">&nbsp;65 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_szMachineCode=(<font color="#2e8b57"><b>unsigned</b></font>&nbsp;<font color="#2e8b57"><b>char</b></font>*)::HeapAlloc(g_hHeapExecutable,HEAP_ZERO_MEMORY,size);<br />
<font color="#a52a2a">&nbsp;66 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">&nbsp;67 </font>&nbsp;&nbsp;&nbsp;&nbsp;~KThunkBase(){<br />
<font color="#a52a2a">&nbsp;68 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>if</b></font>(g_hHeapExecutable)<br />
<font color="#a52a2a">&nbsp;69 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::HeapFree(g_hHeapExecutable,<font color="#ff00ff">0</font>,(<font color="#2e8b57"><b>void</b></font>*)m_szMachineCode);<br />
<font color="#a52a2a">&nbsp;70 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">&nbsp;71 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>inline</b></font>&nbsp;<font color="#2e8b57"><b>void</b></font>* GetThunkedCodePtr(){<font color="#a52a2a"><b>return</b></font>&nbsp;&amp;m_szMachineCode[<font color="#ff00ff">0</font>];}<br />
<font color="#a52a2a">&nbsp;72 </font><font color="#a52a2a"><b>protected</b></font>:<br />
<font color="#a52a2a">&nbsp;73 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>unsigned</b></font>&nbsp;<font color="#2e8b57"><b>char</b></font>* m_szMachineCode;<br />
<font color="#a52a2a">&nbsp;74 </font>};<br />
<font color="#a52a2a">&nbsp;75 </font><br />
<font color="#a52a2a">&nbsp;76 </font><font color="#2e8b57"><b>class</b></font>&nbsp;KWndProcThunk : <font color="#a52a2a"><b>public</b></font>&nbsp;KThunkBase{<br />
<font color="#a52a2a">&nbsp;77 </font><font color="#a52a2a"><b>public</b></font>:<br />
<font color="#a52a2a">&nbsp;78 </font><font color="#a020f0">#ifndef _WIN64</font><br />
<font color="#a52a2a">&nbsp;79 </font>&nbsp;&nbsp;&nbsp;&nbsp;KWndProcThunk():KThunkBase(WNDPROC_THUNK_LENGTH){}<br />
<font color="#a52a2a">&nbsp;80 </font><font color="#a020f0">#else</font>&nbsp;&nbsp; <font color="#0000ff">//_WIN64</font><br />
<font color="#a52a2a">&nbsp;81 </font>&nbsp;&nbsp;&nbsp;&nbsp;KWndProcThunk():KThunkBase(WNDPROC_THUNK_LENGTH_X64){}<br />
<font color="#a52a2a">&nbsp;82 </font><font color="#a020f0">#endif</font><br />
<font color="#a52a2a">&nbsp;83 </font><br />
<font color="#a52a2a">&nbsp;84 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>void</b></font>&nbsp;Init(INT_PTR pThis, INT_PTR ProcPtr){<br />
<font color="#a52a2a">&nbsp;85 </font><font color="#a020f0">#ifndef _WIN64</font><br />
<font color="#a52a2a">&nbsp;86 </font><font color="#a020f0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#pragma warning(disable: </font><font color="#ff00ff">4311</font><font color="#a020f0">)</font><br />
<font color="#a52a2a">&nbsp;87 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwDistance =(DWORD)(ProcPtr) &#8211; (DWORD)(&amp;m_szMachineCode[<font color="#ff00ff">0</font>]) &#8211; WNDPROC_THUNK_LENGTH;<br />
<font color="#a52a2a">&nbsp;88 </font><font color="#a020f0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#pragma warning(</font><font color="#a52a2a"><b>default</b></font><font color="#a020f0">: </font><font color="#ff00ff">4311</font><font color="#a020f0">)</font><br />
<font color="#a52a2a">&nbsp;89 </font><br />
<font color="#a52a2a">&nbsp;90 </font><font color="#a020f0">&nbsp;&nbsp;&nbsp;&nbsp;#ifdef USE_THISCALL_CONVENTION</font><br />
<font color="#a52a2a">&nbsp;91 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">/*</font><br />
<font color="#a52a2a">&nbsp;92 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For __thiscall, the default calling convention used by Microsoft VC++, The thing needed is</font><br />
<font color="#a52a2a">&nbsp;93 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;just set ECX with the value of &#8216;this pointer&#8217;</font><br />
<font color="#a52a2a">&nbsp;94 </font><br />
<font color="#a52a2a">&nbsp;95 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;machine code&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assembly instruction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comment</font><br />
<font color="#a52a2a">&nbsp;96 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-&nbsp;&nbsp; &#8212;&#8212;&#8212;-</font><br />
<font color="#a52a2a">&nbsp;97 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B9 ?? ?? ?? ??&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov ecx, pThis&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;Load ecx with this pointer</font><br />
<font color="#a52a2a">&nbsp;98 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUSH EAX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#a52a2a">&nbsp;99 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8B 44 24 08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV EAX, DWORD PTR[ESP+8]&nbsp;&nbsp; ;EAX=hWnd</font><br />
<font color="#a52a2a">100 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;89 01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV DWORD PTR [ECX], EAX&nbsp;&nbsp;&nbsp;&nbsp;;[pThis]=[ECX]=hWnd</font><br />
<font color="#a52a2a">101 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8B 44 24 04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax,DWORD PTR [ESP+04H] ;eax=(return address)</font><br />
<font color="#a52a2a">102 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;89 44 24 08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov DWORD PTR [ESP+08h],eax ;hWnd=(return address)</font><br />
<font color="#a52a2a">103 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;58&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POP EAX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><br />
<font color="#a52a2a">104 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;83 C4 04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add ESP,04h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><br />
<font color="#a52a2a">105 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#a52a2a">106 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E9 ?? ?? ?? ??&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp ProcPtr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;Jump to target message handler</font><br />
<font color="#a52a2a">107 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000ff">*/</font><br />
<font color="#a52a2a">108 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_szMachineCode[<font color="#ff00ff">0</font>]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= <font color="#ff00ff">0xB9</font>;<br />
<font color="#a52a2a">109 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((DWORD*)&amp;m_szMachineCode[<font color="#ff00ff">1</font>] ) =(DWORD)pThis;<br />
<font color="#a52a2a">110 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((DWORD*)&amp;m_szMachineCode[<font color="#ff00ff">5</font>] )&nbsp;&nbsp; =<font color="#ff00ff">0x24448B50</font>;&nbsp;&nbsp;<br />
<font color="#a52a2a">111 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((DWORD*)&amp;m_szMachineCode[<font color="#ff00ff">9</font>] )&nbsp;&nbsp; =<font color="#ff00ff">0x8B018908</font>;<br />
<font color="#a52a2a">112 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((DWORD*)&amp;m_szMachineCode[<font color="#ff00ff">13</font>])&nbsp;&nbsp; =<font color="#ff00ff">0&#215;89042444</font>;<br />
<font color="#a52a2a">113 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((DWORD*)&amp;m_szMachineCode[<font color="#ff00ff">17</font>])&nbsp;&nbsp; =<font color="#ff00ff">0&#215;58082444</font>;<br />
<font color="#a52a2a">114 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((DWORD*)&amp;m_szMachineCode[<font color="#ff00ff">21</font>])&nbsp;&nbsp; =<font color="#ff00ff">0xE904C483</font>;<br />
<font color="#a52a2a">115 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((DWORD*)&amp;m_szMachineCode[<font color="#ff00ff">25</font>]) =dwDistance;&nbsp;&nbsp;<br />
<font color="#a52a2a">116 </font><font color="#a020f0">&nbsp;&nbsp;&nbsp;&nbsp;#else</font>&nbsp;&nbsp;<br />
<font color="#a52a2a">117 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">/*</font><br />
<font color="#a52a2a">118 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 01/26/2008 modify</font><br />
<font color="#a52a2a">119 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For __stdcall calling convention, replace &#8216;HWND&#8217; with &#8216;this pointer&#8217;</font><br />
<font color="#a52a2a">120 </font><br />
<font color="#a52a2a">121 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stack frame before inserting&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stack frame after inserting</font><br />
<font color="#a52a2a">122 </font><br />
<font color="#a52a2a">123 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</font><br />
<font color="#a52a2a">124 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8212;&#8212;&#8212;&#8212;&#8212;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&#8212;&#8212;&#8212;&#8212;&#8212;-|</font><br />
<font color="#a52a2a">125 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp; lParam&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; lParam&nbsp;&nbsp;&nbsp;&nbsp; |</font><br />
<font color="#a52a2a">126 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8212;&#8212;&#8212;&#8212;&#8212;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&#8212;&#8212;&#8212;&#8212;&#8212;-|</font><br />
<font color="#a52a2a">127 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp; wParam&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; wParam&nbsp;&nbsp;&nbsp;&nbsp; |</font><br />
<font color="#a52a2a">128 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8212;&#8212;&#8212;&#8212;&#8212;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&#8212;&#8212;&#8212;&#8212;&#8212;-|</font><br />
<font color="#a52a2a">129 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp; uMsg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; uMsg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |</font><br />
<font color="#a52a2a">130 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8212;&#8212;&#8212;&#8212;&#8212;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&#8212;&#8212;&#8212;&#8212;&#8212;-|</font><br />
<font color="#a52a2a">131 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp; hWnd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &lt;this pointer&gt; |</font><br />
<font color="#a52a2a">132 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8212;&#8212;&#8212;&#8212;&#8212;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&#8212;&#8212;&#8212;&#8212;&#8212;-|</font><br />
<font color="#a52a2a">133 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| (Return Addr) | &lt;- ESP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| (Return Addr)&nbsp;&nbsp;| &lt;-ESP</font><br />
<font color="#a52a2a">134 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8212;&#8212;&#8212;&#8212;&#8212;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&#8212;&#8212;&#8212;&#8212;&#8212;-|</font><br />
<font color="#a52a2a">135 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| </font><br />
<font color="#a52a2a">136 </font><br />
<font color="#a52a2a">137 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;machine code&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assembly instruction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comment </font><br />
<font color="#a52a2a">138 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&#8212;&#8212;&#8212;&#8212;&#8211;</font><br />
<font color="#a52a2a">139 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push ecx</font><br />
<font color="#a52a2a">140 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B8 ?? ?? ?? ??&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;eax,pThis&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;eax=this;</font><br />
<font color="#a52a2a">141 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8B 4C 24 08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;ecx,dword ptr [esp+08H]&nbsp;&nbsp;&nbsp;&nbsp;;ecx=hWnd;</font><br />
<font color="#a52a2a">142 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;89 08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;dword ptr [eax],ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;[this]=hWnd,if has vftbl shound [this+4]=hWnd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#a52a2a">143 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;89 44 24 08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;dword ptr [esp+08H], eax&nbsp;&nbsp; ;Overwite the &#8216;hWnd&#8217; with &#8216;this pointer&#8217;</font><br />
<font color="#a52a2a">144 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;59&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;ecx</font><br />
<font color="#a52a2a">145 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E9 ?? ?? ?? ??&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;&nbsp;ProcPtr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; Jump to target message handler</font><br />
<font color="#a52a2a">146 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000ff">*/</font><br />
<font color="#a52a2a">147 </font><br />
<font color="#a52a2a">148 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((WORD&nbsp;&nbsp;*) &amp;m_szMachineCode[ <font color="#ff00ff">0</font>]) = <font color="#ff00ff">0xB851</font>;<br />
<font color="#a52a2a">149 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((DWORD *) &amp;m_szMachineCode[ <font color="#ff00ff">2</font>]) = (DWORD)pThis;<br />
<font color="#a52a2a">150 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((DWORD *) &amp;m_szMachineCode[ <font color="#ff00ff">6</font>]) = <font color="#ff00ff">0x08244C8B</font>;<br />
<font color="#a52a2a">151 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((DWORD *) &amp;m_szMachineCode[<font color="#ff00ff">10</font>]) = <font color="#ff00ff">0&#215;44890889</font>;<br />
<font color="#a52a2a">152 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((DWORD *) &amp;m_szMachineCode[<font color="#ff00ff">14</font>]) = <font color="#ff00ff">0xE9590824</font>;<br />
<font color="#a52a2a">153 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((DWORD *) &amp;m_szMachineCode[<font color="#ff00ff">18</font>]) = (DWORD)dwDistance;<br />
<font color="#a52a2a">154 </font><font color="#a020f0">&nbsp;&nbsp;&nbsp;&nbsp;#endif</font>&nbsp;<font color="#0000ff">//USE_THISCALL_CONVENTION</font><br />
<font color="#a52a2a">155 </font><font color="#a020f0">#else</font>&nbsp;&nbsp; <font color="#0000ff">//_WIN64</font><br />
<font color="#a52a2a">156 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">/*</font><font color="#0000ff">&nbsp;</font><br />
<font color="#a52a2a">157 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For x64 calling convention, RCX hold the &#8216;HWND&#8217;,copy the &#8216;HWND&#8217; to Window object,</font><br />
<font color="#a52a2a">158 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then insert &#8216;this pointer&#8217; into RCX,so perfectly!!!&nbsp;&nbsp;&nbsp;&nbsp; </font><br />
<font color="#a52a2a">159 </font><br />
<font color="#a52a2a">160 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stack frame before modify&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Stack frame after modify</font><br />
<font color="#a52a2a">161 </font><br />
<font color="#a52a2a">162 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</font><br />
<font color="#a52a2a">163 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8212;&#8212;&#8212;&#8212;&#8212;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&#8212;&#8212;&#8212;&#8212;&#8212;-|</font><br />
<font color="#a52a2a">164 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &lt;-R9(lParam)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| &lt;-R9(lParam)</font><br />
<font color="#a52a2a">165 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8212;&#8212;&#8212;&#8212;&#8212;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&#8212;&#8212;&#8212;&#8212;&#8212;-|</font><br />
<font color="#a52a2a">166 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &lt;-R8(wParam)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| &lt;-R8(wParam)</font><br />
<font color="#a52a2a">167 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8212;&#8212;&#8212;&#8212;&#8212;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&#8212;&#8212;&#8212;&#8212;&#8212;-|</font><br />
<font color="#a52a2a">168 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &lt;-RDX(msg)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| &lt;-RDX(msg)</font><br />
<font color="#a52a2a">169 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8212;&#8212;&#8212;&#8212;&#8212;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&#8212;&#8212;&#8212;&#8212;&#8212;-|</font><br />
<font color="#a52a2a">170 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &lt;-RCX(hWnd)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| &lt;-RCX(this)</font><br />
<font color="#a52a2a">171 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8212;&#8212;&#8212;&#8212;&#8212;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&#8212;&#8212;&#8212;&#8212;&#8212;-|</font><br />
<font color="#a52a2a">172 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| (Return Addr) | &lt;-RSP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | (Return Addr)&nbsp;&nbsp;| &lt;-RSP</font><br />
<font color="#a52a2a">173 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&#8212;&#8212;&#8212;&#8212;&#8212;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&#8212;&#8212;&#8212;&#8212;&#8212;-|</font><br />
<font color="#a52a2a">174 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp;&nbsp; &#8230;&nbsp;&nbsp;:</font><br />
<font color="#a52a2a">175 </font><br />
<font color="#a52a2a">176 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;machine code&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assembly instruction&nbsp;&nbsp;&nbsp;&nbsp;comment</font><br />
<font color="#a52a2a">177 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;-</font><br />
<font color="#a52a2a">178 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;48B8 ????????????????&nbsp;&nbsp; mov RAX,pThis</font><br />
<font color="#a52a2a">179 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#4808&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov qword ptr [RAX],RCX ;m_hWnd=[this]=RCX</font><br />
<font color="#a52a2a">180 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;488908&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov qword ptr [RAX],RCX ;m_hWnd=[this]=RCX //feedback from Loaden</font><br />
<font color="#a52a2a">181 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4889C1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov RCX,RAX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;RCX=pThis (488BC8 ?)</font><br />
<font color="#a52a2a">182 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;48B8 ????????????????&nbsp;&nbsp; mov RAX,ProcPtr </font><br />
<font color="#a52a2a">183 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FFE0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp RAX&nbsp;&nbsp;&nbsp;&nbsp; </font><br />
<font color="#a52a2a">184 </font><font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000ff">*/</font><br />
<font color="#a52a2a">185 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((WORD&nbsp;&nbsp; *)&amp;m_szMachineCode[<font color="#ff00ff">0</font>] ) =<font color="#ff00ff">0xB848</font>;<br />
<font color="#a52a2a">186 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((INT_PTR*)&amp;m_szMachineCode[<font color="#ff00ff">2</font>] ) =pThis;<br />
<font color="#a52a2a">187 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">//*((DWORD&nbsp;&nbsp;*)&amp;m_szMachineCode[10])&nbsp;&nbsp; =0&#215;89480848;</font><br />
<font color="#a52a2a">188 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((DWORD&nbsp;&nbsp;*)&amp;m_szMachineCode[<font color="#ff00ff">10</font>]) =<font color="#ff00ff">0&#215;48088948</font>;<br />
<font color="#a52a2a">189 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">//*((DWORD&nbsp;&nbsp;*)&amp;m_szMachineCode[14])&nbsp;&nbsp; =0x00B848C1;</font><br />
<font color="#a52a2a">190 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((DWORD&nbsp;&nbsp;*)&amp;m_szMachineCode[<font color="#ff00ff">14</font>]) =<font color="#ff00ff">0xB848C189</font>;<br />
<font color="#a52a2a">191 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">//*((INT_PTR*)&amp;m_szMachineCode[17])&nbsp;&nbsp; =ProcPtr;</font><br />
<font color="#a52a2a">192 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((INT_PTR*)&amp;m_szMachineCode[<font color="#ff00ff">18</font>]) =ProcPtr;<br />
<font color="#a52a2a">193 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">//*((WORD&nbsp;&nbsp; *)&amp;m_szMachineCode[25])&nbsp;&nbsp; =0xE0FF;</font><br />
<font color="#a52a2a">194 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((WORD&nbsp;&nbsp; *)&amp;m_szMachineCode[<font color="#ff00ff">26</font>]) =<font color="#ff00ff">0xE0FF</font>;<br />
<font color="#a52a2a">195 </font><font color="#a020f0">#endif</font><br />
<font color="#a52a2a">196 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">197 </font>};</p>
<p>是不是有些头晕？且待我慢慢分解。<br />
类成员函数有两种调用约定，MS VC++默认采用thiscall调用约定，而Borland C++默认采用stdcall调用约定。thiscall采用ECX寄存器来传递this指针，而stdcall则通过栈来传递this指针，this指 针是成员函数隐藏的第一个参数。而到了x64平台，则问题有了新的变化。为了充分利用寄存器，提高效率，函数的前四个参数默认用寄存器传递，分别是 RCX,RDX,R8和R9。对于成员函数，其this指针通过RCX传递。x64 thunk代码我并未测试过，因为一直未使用x64平台，不过应该不会有太大问题。</p>
<p>在这里，我只分析x86平台上使用stdcall调用习惯的thunk代码。因为这段代码将窗口回调函数调用栈上的HWND直接修改this指针，所以有两个问题需要提前了解一下。<br />
第一、我将回调函数的signature修改为如下形式：<br />
LRESULT KCALLBACK KWndProc(UINT uMsg, WPARAM wParam, LPARAM lParam) ;<br />
请注意这是个成员函数，而且没有HWND hWnd这个参数。<br />
第二、窗口类的第一个数据成员必须是窗口句柄变量，我的是HWND m_hWnd.至于为什么要这样，后面会有提及。<br />
现在请看代码第85行开始的图形，前一个是修改前windows调用我们提供的回调函数的栈结构，后一个则是为了适应我们的需求修改过后的调用栈。首先， 我们的回调函数需要一个this指针，而且要放到栈上第一个参数的位置上，这是通过第46行的thunk初始化函数Init传递进来的。其次我们的窗口对象必须要得到自己所对应的窗口句柄，不然一切都是空谈。</p>
<p>那么我们可以用thunk来修改调用栈。首先用初始栈上的第一个参数，也就是实际的窗口句柄，传递给窗口对象。如何传递呢？因为m_hWnd成员是对象的 第一个数据成员，那么很简单，如果没有虚函数的存在，那么这个m_hWnd就静静地待在对象的最开始处，就是this指针所指向的位置。如果有虚函数的存 在，那么事情也不是太复杂，对象的起始处现在是VPTR,m_hWnd紧随其后，代码略作调整即可。其次用this指针覆盖栈上的第一个参数，也就是窗口 句柄HWND。下面是逐条注释的汇编格式指令：<br />
<font color="#a52a2a">1 </font><font color="#008b8b">push</font>&nbsp;<font color="#008b8b">ecx</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<font color="#0000ff">保护ecx，后面会用到</font><br />
<font color="#a52a2a">2 </font><font color="#008b8b">mov</font>&nbsp;&nbsp;<font color="#008b8b">eax</font>,<font color="#008b8b">pThis</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<font color="#0000ff">传送this指针到eax. eax=this; </font><br />
<font color="#a52a2a">3 </font><font color="#008b8b">mov</font>&nbsp;&nbsp;<font color="#008b8b">ecx</font>,<font color="#008b8b">dword</font>&nbsp;<font color="#008b8b">ptr</font>&nbsp;[<font color="#008b8b">esp</font>+0<font color="#ff00ff">8</font><font color="#008b8b">H</font>]&nbsp;&nbsp;&nbsp;&nbsp;;<font color="#0000ff">把调用栈上的第一个参数送ecx. ecx=hWnd</font><br />
<font color="#a52a2a">4 </font><font color="#008b8b">mov</font>&nbsp;&nbsp;<font color="#008b8b">dword</font>&nbsp;<font color="#008b8b">ptr</font>&nbsp;[<font color="#008b8b">eax</font>],<font color="#008b8b">ecx</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<font color="#0000ff">把窗口句柄赋予窗口对象数据成员m_hWnd.</font><br />
<font color="#a52a2a">5 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<font color="#0000ff">[this]=hWnd,if has vftbl shound [this+4]=hWnd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#a52a2a">6 </font><font color="#008b8b">mov</font>&nbsp;&nbsp;<font color="#008b8b">dword</font>&nbsp;<font color="#008b8b">ptr</font>&nbsp;[<font color="#008b8b">esp</font>+0<font color="#ff00ff">8</font><font color="#008b8b">H</font>], <font color="#008b8b">eax</font>&nbsp;&nbsp; ;<font color="#0000ff">用this指针覆盖调用栈上的第一个参数即窗口句柄</font><br />
<font color="#a52a2a">7 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<font color="#0000ff">Overwite the &#8216;hWnd&#8217; with &#8216;this pointer&#8217;</font><br />
<font color="#a52a2a">8 </font><font color="#008b8b">pop</font>&nbsp;&nbsp;<font color="#008b8b">ecx</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<font color="#0000ff">弹出先前ecx</font><br />
<font color="#a52a2a">9 </font><font color="#008b8b">jmp</font>&nbsp;&nbsp;<font color="#008b8b">ProcPtr</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<font color="#0000ff">跳转到消息处理函数.Jump to target message handler</font></p>
<p>这样就把窗口(句柄)和窗口对象完美的绑定到一起，不需要一个对应查找表，不使用任何全局或静态的数据，满足thread safe。</p>
<p>至于汇编格式指令翻译到机器码的问题，下载intel的指令手册，查查表就可以了。<br />
下面的代码展示了thunk的使用(删除了不相干的代码)：<br />
<font color="#a52a2a">&nbsp;1 </font><font color="#2e8b57"><b>template</b></font>&nbsp;&lt;<font color="#2e8b57"><b>typename</b></font>&nbsp;T,<font color="#2e8b57"><b>typename</b></font>&nbsp;TBase=KWindow&gt;<br />
<font color="#a52a2a">&nbsp;2 </font><font color="#2e8b57"><b>class</b></font>&nbsp;KWindowRoot : <font color="#a52a2a"><b>public</b></font>&nbsp;TBase{<br />
<font color="#a52a2a">&nbsp;3 </font><font color="#a52a2a"><b>public</b></font>:<br />
<font color="#a52a2a">&nbsp;4 </font>&nbsp;&nbsp;&nbsp;&nbsp;KWindowRoot():TBase(){<br />
<font color="#a52a2a">&nbsp;5 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T* pT=<font color="#a52a2a"><b>static_cast</b></font>&lt;T*&gt;(<font color="#a52a2a"><b>this</b></font>);<br />
<font color="#a52a2a">&nbsp;6 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_thunk.Init((INT_PTR)pT, pT-&gt;GetMessageProcPtr());<br />
<font color="#a52a2a">&nbsp;7 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">&nbsp;8 </font>&nbsp;<br />
<font color="#a52a2a">&nbsp;9 </font>&nbsp;&nbsp;&nbsp;&nbsp;INT_PTR GetMessageProcPtr(){<br />
<font color="#a52a2a">10 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>typedef</b></font>&nbsp;LRESULT (KCALLBACK T::*KWndProc_t)(UINT,WPARAM,LPARAM);<br />
<font color="#a52a2a">11 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<font color="#a52a2a">12 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>union</b></font>{<br />
<font color="#a52a2a">13 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KWndProc_t&nbsp;&nbsp;&nbsp;&nbsp; wndproc;<br />
<font color="#a52a2a">14 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT_PTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwProcAddr;<br />
<font color="#a52a2a">15 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}u;<br />
<font color="#a52a2a">16 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.wndproc=&amp;T::KWndProc;<br />
<font color="#a52a2a">17 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;u.dwProcAddr;<br />
<font color="#a52a2a">18 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">19 </font>&nbsp;<br />
<font color="#a52a2a">20 </font>&nbsp;&nbsp;&nbsp;&nbsp;LRESULT KCALLBACK KWndProc(UINT uMsg, WPARAM wParam, LPARAM lParam){<br />
<font color="#a52a2a">21 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T* pT=<font color="#a52a2a"><b>static_cast</b></font>&lt;T*&gt;(<font color="#a52a2a"><b>this</b></font>);<br />
<font color="#a52a2a">22 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>return</b></font>&nbsp;pT-&gt;ProcessWindowMessage(uMsg,wParam,lParam);<br />
<font color="#a52a2a">23 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">24 </font>&nbsp;<br />
<font color="#a52a2a">25 </font><font color="#a52a2a"><b>protected</b></font>:<br />
<font color="#a52a2a">26 </font>&nbsp;&nbsp;&nbsp;&nbsp;KWndProcThunk&nbsp;&nbsp; m_thunk;<br />
<font color="#a52a2a">27 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>inline</b></font>&nbsp;INT_PTR GetThunkedProcPtr(){<font color="#a52a2a"><b>return</b></font>&nbsp;(INT_PTR)m_thunk.GetThunkedCodePtr();}<br />
<font color="#a52a2a">28 </font>};</p>
<p>在基类KWindow中HWND m_hWnd是其第一个数据成员。因为使用了模板的静态多态特性，故对象没有VPTR指针。<br />
到了这里事情还没有结束。既然使用thunk就不得不面对DEP。DEP会阻止没有执行权限的内存执行代码。如果我们的thunk分配在栈上或new出来的堆上，则会被DEP阻止，程序执行失败。因此可以申请一个具有执行权限的堆来解决这个问题：<br />
<font color="#a52a2a">1 </font>KThunkBase(SIZE_T size){<br />
<font color="#a52a2a">2 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a52a2a"><b>if</b></font>(!g_hHeapExecutable){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">//first thunk,create the executable heap</font><br />
<font color="#a52a2a">3 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_hHeapExecutable=::HeapCreate(HEAP_CREATE_ENABLE_EXECUTE,<font color="#ff00ff">0</font>,<font color="#ff00ff">0</font>);<br />
<font color="#a52a2a">4 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">//if (!g_hHeapExecutable) abort</font><br />
<font color="#a52a2a">5 </font>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<font color="#a52a2a">6 </font>&nbsp;&nbsp;&nbsp;&nbsp;m_szMachineCode=(<font color="#2e8b57"><b>unsigned</b></font>&nbsp;<font color="#2e8b57"><b>char</b></font>*)::HeapAlloc(g_hHeapExecutable,HEAP_ZERO_MEMORY,size);<br />
<font color="#a52a2a">7 </font>}</p>
<p>总的来讲thunk的空间和时间开销都是足够小的，甚至可以忽略不计。但是却带来了极大的便利。<br />
thunk只是开了一个头。</p>
<p>PS:<a href="http://www.cppblog.com/proguru/archive/2008/08/24/59831.html" target="_blank">原文</a>早先发表于cppblog。根据 Loaden的反馈做了关于x64的修订。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.pcware.cn/it/kwinui/gui_wndproc_thunk.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
