﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-万星星-随笔分类-ATL</title><link>http://www.cppblog.com/wlwlxj/category/610.html</link><description>&lt;div&gt;一个吃软饭的男人!!!!!我只想写程序####&lt;br&gt;师夷之技以制夷   吾尝终日而思矣,不如须臾之所学也&lt;br&gt;喝碗孟婆汤,踏过奈何桥,涅槃&lt;/div&gt;
I've been programming since I was 21. Started with C++, looked at Java, keen on Visual Basic and Visual C++, thinking about .NET and C#.^_^,very ridiculous.</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 12:34:47 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 12:34:47 GMT</pubDate><ttl>60</ttl><item><title>VC8中MFC集成ATL组件注册时注意的一个问题</title><link>http://www.cppblog.com/wlwlxj/archive/2008/02/26/43247.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Tue, 26 Feb 2008 03:49:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2008/02/26/43247.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/43247.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2008/02/26/43247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/43247.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/43247.html</trackback:ping><description><![CDATA[<br>由于VC8生成MFC程序时候如果选择创建solution，exe不在本目录的debug目录下，而是在solution的debug目录下。当加入atl支持时候，生成的tlb却在本目录的debug下。此时类型库注册需要手工执行：%exe路径% -RegServer。此时，如果tlb不在exe统一目录，注册是失败的。所以一定要拷贝到当前目录再注册。
<img src ="http://www.cppblog.com/wlwlxj/aggbug/43247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2008-02-26 11:49 <a href="http://www.cppblog.com/wlwlxj/archive/2008/02/26/43247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2005关于开发组件的一个Bug</title><link>http://www.cppblog.com/wlwlxj/archive/2007/11/14/36641.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Wed, 14 Nov 2007 15:32:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2007/11/14/36641.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/36641.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2007/11/14/36641.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/36641.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/36641.html</trackback:ping><description><![CDATA[<br>不清楚是中文版的问题还是我的盗版的问题，生成的atl工程无法注册，有如下错误：<br><em>error PRJ0050: 未能注册输出。请确保您有修改注册表的相应权限。</em><br><br>一开始很是无奈，因为之前VC6 VC2003一直未遇到此类问题。使用Dependcy观察缺少atl80.dll和msvcr80d.dll，为了解决此问题，我一直采取静态连接这两个库。直到今天才发现，VC6和VC2003安装的时候都会拷贝这些库到System32下，而唯独VC2005没有将次拷贝。在VS2005安装目录下找到缺少的库拷贝到System32下去就可以了。
<img src ="http://www.cppblog.com/wlwlxj/aggbug/36641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2007-11-14 23:32 <a href="http://www.cppblog.com/wlwlxj/archive/2007/11/14/36641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OLE容器之环境属性支持</title><link>http://www.cppblog.com/wlwlxj/archive/2007/05/13/24017.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sun, 13 May 2007 00:57:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2007/05/13/24017.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/24017.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2007/05/13/24017.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/24017.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/24017.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: OLE深入技术&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2007/05/13/24017.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/24017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2007-05-13 08:57 <a href="http://www.cppblog.com/wlwlxj/archive/2007/05/13/24017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图片预览控件</title><link>http://www.cppblog.com/wlwlxj/archive/2007/01/13/17601.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sat, 13 Jan 2007 14:36:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2007/01/13/17601.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/17601.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2007/01/13/17601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/17601.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/17601.html</trackback:ping><description><![CDATA[
		<p>记得以前使用acdsee看图片的时候，非常喜欢它的UI模式：一个树目录、一个预览视图、一个图片显示视图。由于以前处理所有的图片类型比较麻烦，所以没有花费时间去做。如今有了gidplus，做起来比较方便，闲暇时间就动了下手。顺便提一下，gdiplus说是支持几乎所有图像类型，但是对gif文件的写好像并不支持，不知道其他朋友是否用过。<br />用atl分别封装了3个控件，下面是在vb6 vc6 以及 .net里面使用情况。</p>
		<p>VB6设计时：<br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_vb6ds.JPG" /><br />通过事件、属性关联3个控件</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_8_154_Open_Image" onclick="this.style.display='none'; Codehighlighter1_8_154_Open_Text.style.display='none'; Codehighlighter1_8_154_Closed_Image.style.display='inline'; Codehighlighter1_8_154_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_8_154_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_8_154_Closed_Text.style.display='none'; Codehighlighter1_8_154_Open_Image.style.display='inline'; Codehighlighter1_8_154_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">Private</span>
				<span style="COLOR: #000000"> </span>
				<span id="Codehighlighter1_8_154_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">Sub FolderTree1_FolderSelChanged()</span>
				<span id="Codehighlighter1_8_154_Open_Text">
						<span style="COLOR: #0000ff">Sub</span>
						<span style="COLOR: #000000"> FolderTree1_FolderSelChanged()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    PreviewList1.FolderPath </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> FolderTree1.FolderPath<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    PreviewView1.ImagePath </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> PreviewList1.ImagePath<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span>
						<span style="COLOR: #0000ff">End Sub</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img id="Codehighlighter1_165_258_Open_Image" onclick="this.style.display='none'; Codehighlighter1_165_258_Open_Text.style.display='none'; Codehighlighter1_165_258_Closed_Image.style.display='inline'; Codehighlighter1_165_258_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_165_258_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_165_258_Closed_Text.style.display='none'; Codehighlighter1_165_258_Open_Image.style.display='inline'; Codehighlighter1_165_258_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">Private</span>
				<span style="COLOR: #000000"> </span>
				<span id="Codehighlighter1_165_258_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">Sub PreviewList1_ImageSelChanged()</span>
				<span id="Codehighlighter1_165_258_Open_Text">
						<span style="COLOR: #0000ff">Sub</span>
						<span style="COLOR: #000000"> PreviewList1_ImageSelChanged()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    PreviewView1.ImagePath </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> PreviewList1.ImagePath<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span>
						<span style="COLOR: #0000ff">End Sub</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>运行时：<br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_vb6r.JPG" /></p>
		<p>VC6设计时：<br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_vc6ds.JPG" /><br />通过事件、属性关联3个控件</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> CTestDlg::OnFolderSelChangedFoldertree1() <br /><img id="Codehighlighter1_48_279_Open_Image" onclick="this.style.display='none'; Codehighlighter1_48_279_Open_Text.style.display='none'; Codehighlighter1_48_279_Closed_Image.style.display='inline'; Codehighlighter1_48_279_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_48_279_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_48_279_Closed_Text.style.display='none'; Codehighlighter1_48_279_Open_Image.style.display='inline'; Codehighlighter1_48_279_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_48_279_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_48_279_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> TODO: Add your control notification handler code here</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(m_wndFolderSel.GetSafeHwnd())<br /><img id="Codehighlighter1_143_277_Open_Image" onclick="this.style.display='none'; Codehighlighter1_143_277_Open_Text.style.display='none'; Codehighlighter1_143_277_Closed_Image.style.display='inline'; Codehighlighter1_143_277_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_143_277_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_143_277_Closed_Text.style.display='none'; Codehighlighter1_143_277_Open_Image.style.display='inline'; Codehighlighter1_143_277_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span>
						<span id="Codehighlighter1_143_277_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_143_277_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  m_wndPreviewList.SetFolderPath(m_wndFolderSel.GetFolderPath());<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  m_wndPreviewView.SetImagePath(m_wndFolderSel.GetFolderPath());<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> CTestDlg::OnImageSelChangedPreviewlist1() <br /><img id="Codehighlighter1_330_455_Open_Image" onclick="this.style.display='none'; Codehighlighter1_330_455_Open_Text.style.display='none'; Codehighlighter1_330_455_Closed_Image.style.display='inline'; Codehighlighter1_330_455_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_330_455_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_330_455_Closed_Text.style.display='none'; Codehighlighter1_330_455_Open_Image.style.display='inline'; Codehighlighter1_330_455_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_330_455_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_330_455_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> TODO: Add your control notification handler code here</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000"> m_wndPreviewView.SetImagePath(m_wndPreviewList.GetImagePath());<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>运行时：<br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_vc6r.JPG" /></p>
		<p>.net设计时：<br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_netds.JPG" /><br />通过事件、属性关联3个控件</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> axFolderTree1_FolderSelChanged(</span>
				<span style="COLOR: #0000ff">object</span>
				<span style="COLOR: #000000"> sender, EventArgs e)<br /><img id="Codehighlighter1_72_197_Open_Image" onclick="this.style.display='none'; Codehighlighter1_72_197_Open_Text.style.display='none'; Codehighlighter1_72_197_Closed_Image.style.display='inline'; Codehighlighter1_72_197_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_72_197_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_72_197_Closed_Text.style.display='none'; Codehighlighter1_72_197_Open_Image.style.display='inline'; Codehighlighter1_72_197_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_72_197_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_72_197_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        axPreviewList1.FolderPath </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> axFolderTree1.FolderPath;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        axPreviewView1.ImagePath </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> axFolderTree1.FolderPath;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> axPreviewList1_ImageSelChanged(</span>
				<span style="COLOR: #0000ff">object</span>
				<span style="COLOR: #000000"> sender, EventArgs e)<br /><img id="Codehighlighter1_272_335_Open_Image" onclick="this.style.display='none'; Codehighlighter1_272_335_Open_Text.style.display='none'; Codehighlighter1_272_335_Closed_Image.style.display='inline'; Codehighlighter1_272_335_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_272_335_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_272_335_Closed_Text.style.display='none'; Codehighlighter1_272_335_Open_Image.style.display='inline'; Codehighlighter1_272_335_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_272_335_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_272_335_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        axPreviewView1.ImagePath </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> axPreviewList1.ImagePath;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>运行时：<br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_netr.JPG" /></p>
<img src ="http://www.cppblog.com/wlwlxj/aggbug/17601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2007-01-13 22:36 <a href="http://www.cppblog.com/wlwlxj/archive/2007/01/13/17601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>activex控件加速键消息处理不完全方案</title><link>http://www.cppblog.com/wlwlxj/archive/2006/11/17/15319.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Fri, 17 Nov 2006 13:40:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/11/17/15319.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/15319.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/11/17/15319.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/15319.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/15319.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 关于activex控件加速键消息(tab up down left right home end ...)问题处理&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/11/17/15319.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/15319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-11-17 21:40 <a href="http://www.cppblog.com/wlwlxj/archive/2006/11/17/15319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过编程获取COM dll中Type和Function</title><link>http://www.cppblog.com/wlwlxj/archive/2006/09/06/12104.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Wed, 06 Sep 2006 14:21:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/09/06/12104.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/12104.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/09/06/12104.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/12104.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/12104.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 曾经有一位csdn朋友问过我这个问题（当时自己很自大，以为知道很多），由于孤陋寡闻没能够帮助解决，并且告诉他不可能实现。&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/09/06/12104.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/12104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-09-06 22:21 <a href="http://www.cppblog.com/wlwlxj/archive/2006/09/06/12104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分布式设计之DCOM实现</title><link>http://www.cppblog.com/wlwlxj/archive/2006/07/10/9633.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Mon, 10 Jul 2006 03:25:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/07/10/9633.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/9633.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/07/10/9633.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/9633.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/9633.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 眼看着分布式软件设计这么流行，.NET、J2EE大行其道，横下心先把DCOM拿下。&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/07/10/9633.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/9633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-07-10 11:25 <a href="http://www.cppblog.com/wlwlxj/archive/2006/07/10/9633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的平台+插件观</title><link>http://www.cppblog.com/wlwlxj/archive/2006/07/05/9454.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Wed, 05 Jul 2006 12:44:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/07/05/9454.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/9454.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/07/05/9454.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/9454.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/9454.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 什么叫台呢？台,观四方而高者——《说文》。&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/07/05/9454.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/9454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-07-05 20:44 <a href="http://www.cppblog.com/wlwlxj/archive/2006/07/05/9454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC与ATL的男女关系</title><link>http://www.cppblog.com/wlwlxj/archive/2006/07/03/9297.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Mon, 03 Jul 2006 00:21:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/07/03/9297.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/9297.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/07/03/9297.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/9297.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/9297.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: MFC是一个男人,ATL是一个女人&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/07/03/9297.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/9297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-07-03 08:21 <a href="http://www.cppblog.com/wlwlxj/archive/2006/07/03/9297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ATL窗口添加功能的5种方法</title><link>http://www.cppblog.com/wlwlxj/archive/2006/01/02/2358.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Mon, 02 Jan 2006 07:29:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/01/02/2358.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/2358.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/01/02/2358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/2358.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/2358.html</trackback:ping><description><![CDATA[<P>1、消息映射的链接<BR><BR>如果这个类是ATL窗口类，我们可以从这个窗口类派生自己的类，就象Base Class Chaining中描述的一样。<BR>class CBase : public CWindowImpl&lt;CBase&gt;&nbsp; <BR>{<BR>public:<BR>&nbsp;BEGIN_MSG_MAP(CBase)<BR>&nbsp;&nbsp;MESSAGE_HANDLER(WM_DESTROY, OnDestroy)<BR>&nbsp;&nbsp;MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown)<BR>&nbsp;&nbsp;ALT_MSG_MAP(100)<BR>&nbsp;&nbsp;MESSAGE_HANDLER(WM_DESTROY, OnDestroy)<BR>&nbsp;&nbsp;MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown2)<BR>&nbsp;END_MSG_MAP()<BR>public:<BR>&nbsp;CBase();<BR>&nbsp;virtual ~CBase();<BR>&nbsp;<BR>&nbsp;LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&amp;)<BR>&nbsp;{<BR>&nbsp;&nbsp;PostQuitMessage(0);<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;LRESULT OnButtonDown(UINT, WPARAM, LPARAM, BOOL&amp;)<BR>&nbsp;{<BR>&nbsp;&nbsp;MessageBox("baseclass : button down\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;LRESULT OnButtonDown2(UINT, WPARAM, LPARAM, BOOL&amp;)<BR>&nbsp;{<BR>&nbsp;&nbsp;MessageBox("baseclass : button down2\n");<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>};<BR><BR>class CDerived: public CBase<BR>{<BR>&nbsp;BEGIN_MSG_MAP(CDerived)<BR>&nbsp;&nbsp;MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown)<BR>&nbsp;&nbsp;CHAIN_MSG_MAP_ALT(CBase, 100)&nbsp;//链接到基类<BR>&nbsp;END_MSG_MAP()<BR>&nbsp;<BR>&nbsp;LRESULT OnButtonDown(UINT, WPARAM, LPARAM, BOOL&amp; bHandle)<BR>&nbsp;{<BR>&nbsp;&nbsp;MessageBox("derivedclass : button down\n");<BR>&nbsp;&nbsp;bHandle = FALSE;&nbsp;//决定是否继续传消息<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>};<BR><BR>2、超类化<BR><BR>如果我们想扩展一个预定义的窗口类（如按纽类或列表框类）的功能，我们可以超类化它。就是创建一个基于这个预定义类的新类，并在消息映射表中添加消息映射以增强它的功能。这个在使用MFC开发使用最多。<BR>class CBeepButton : public CWindowImpl&lt;CBeepButton&gt;&nbsp; <BR>{<BR>public:<BR>&nbsp;CBeepButton();<BR>&nbsp;virtual ~CBeepButton();<BR>&nbsp;<BR>&nbsp;DECLARE_WND_SUPERCLASS(_T("BeepButton"), _T("Button"))<BR>&nbsp;&nbsp;BEGIN_MSG_MAP(CBeepButton)<BR>&nbsp;&nbsp;MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)<BR>&nbsp;END_MSG_MAP()</P>
<P><BR>&nbsp;LRESULT OnLButtonDown(UINT, WPARAM, LPARAM, BOOL&amp; bHandled)<BR>&nbsp;{<BR>&nbsp;&nbsp;MessageBeep(MB_ICONASTERISK);<BR>&nbsp;&nbsp;bHandled = FALSE; //继续调用基类的函数<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;&nbsp; }<BR>};</P>
<P>3、子类化<BR><BR>有些时候，我们需要改变一个已经存在的窗口实例的行为，而不是一个窗口类——或许我们要让一个对话框上的编辑框做点什么特别的事情。在这种情况下，我们可以写一个新的ATL窗口类，并子类化这个已经存在的编辑框。任何本该发送到这个编辑框的消息都会先被发送到这个子类的对象。<BR><BR>class CNoNumEdit : public CWindowImpl&lt;CNoNumEdit&gt;<BR>{<BR>public:<BR>&nbsp;CNoNumEdit();<BR>&nbsp;virtual ~CNoNumEdit();<BR>&nbsp;<BR>&nbsp;BEGIN_MSG_MAP(CNoNumEdit)<BR>&nbsp;&nbsp;MESSAGE_HANDLER(WM_CHAR, OnChar)<BR>&nbsp;END_MSG_MAP()</P>
<P>&nbsp;LRESULT OnChar(UINT, WPARAM wParam, LPARAM, BOOL&amp; bHandled)<BR>&nbsp;{<BR>&nbsp;&nbsp;TCHAR ch = wParam;<BR>&nbsp;&nbsp;if(_T('0')&lt;=ch &amp;&amp; ch&lt;=_T('9'))<BR>&nbsp;&nbsp;&nbsp;MessageBeep(0);<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;bHandled = FALSE;&nbsp;&nbsp;&nbsp;//不处理，交给编辑框自己处理<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;&nbsp; }<BR>};<BR>4、容器窗口<BR><BR>另外一种可选的方法：我们也可以让这个编辑框成为一个被包含的窗口，所有发送到这个编辑框的消息都会经过它的容器窗口；我们可以在这个容器窗口中为这个被包含的窗口实现特殊的消息处理。<BR><BR>class CMyWindow : public CWindowImpl&lt;CMyWindow&gt;<BR>{<BR>public:<BR>&nbsp;CMyWindow();<BR>&nbsp;virtual ~CMyWindow();</P>
<P>&nbsp;BEGIN_MSG_MAP( CMyWindow )<BR>&nbsp;&nbsp;MESSAGE_HANDLER(WM_CREATE, OnCreate)<BR>&nbsp;&nbsp;MESSAGE_HANDLER(WM_DESTROY, OnDestroy)<BR>&nbsp;&nbsp;ALT_MSG_MAP(99) //contained window's messages come here...<BR>&nbsp;&nbsp;MESSAGE_HANDLER(WM_CHAR, OnChar)<BR>&nbsp;END_MSG_MAP()</P>
<P>&nbsp;LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL&amp;)<BR>&nbsp;{<BR>&nbsp;&nbsp;RECT rc = { 10, 10, 200, 35 };<BR>&nbsp;&nbsp;m_wndContained.Create(m_hWnd, rc, _T("non-numeric edit"),<BR>&nbsp;&nbsp;&nbsp;WS_CHILD|WS_VISIBLE|WS_BORDER, 0, 666);<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}</P>
<P>&nbsp;LRESULT OnChar(UINT, WPARAM wParam, LPARAM, BOOL&amp; bHandled)<BR>&nbsp;{<BR>&nbsp;&nbsp;TCHAR ch = wParam;<BR>&nbsp;&nbsp;if(_T('0')&lt;=ch &amp;&amp; ch&lt;=_T('9'))<BR>&nbsp;&nbsp;&nbsp;MessageBeep( 0 );<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;bHandled = FALSE;&nbsp;&nbsp;&nbsp;//不处理，交给编辑框自己处理<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&amp;)<BR>&nbsp;{<BR>&nbsp;&nbsp;PostQuitMessage( 0 );<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}</P>
<P>private:<BR>&nbsp;CContainedWindow&nbsp;m_wndContained;<BR>};<BR><BR>CMyWindow::CMyWindow() : m_wndContained(_T("edit"), this, 99)<BR>{</P>
<P>}<BR><BR>5、消息反射<BR><BR>最后的一种方法就是消息反射，当一个窗口收到一个消息后不处理它，而是反射给发送这个消息的窗口自己处理，这种技术可以用来创建自包含的控件。<BR><BR>class CStaticLink : public CWindowImpl&lt;CStaticLink&gt;&nbsp; <BR>{<BR>public:<BR>&nbsp;DECLARE_WND_SUPERCLASS(_T("StaticLink"), _T("Static"))</P>
<P>&nbsp;CStaticLink();<BR>&nbsp;virtual ~CStaticLink();</P>
<P>&nbsp;void SetLinkText(LPCTSTR szLink)<BR>&nbsp;{<BR>&nbsp;&nbsp;USES_CONVERSION;<BR>&nbsp;&nbsp;m_bstrLink = T2OLE(szLink);<BR>&nbsp;}</P>
<P>&nbsp;BEGIN_MSG_MAP(CStaticLink)<BR>&nbsp;&nbsp;//uses message reflection: WM_* comes back as OCM_*<BR>&nbsp;&nbsp;MESSAGE_HANDLER(OCM_COMMAND, OnCommand)<BR>&nbsp;&nbsp;MESSAGE_HANDLER(OCM_CTLCOLORSTATIC, OnCtlColor)<BR>&nbsp;&nbsp;MESSAGE_HANDLER(WM_DESTROY, OnDestroy)&nbsp;//not a reflected message<BR>&nbsp;&nbsp;DEFAULT_REFLECTION_HANDLER()<BR>&nbsp;END_MSG_MAP()</P>
<P>&nbsp;LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&amp;)<BR>&nbsp;{<BR>&nbsp;&nbsp;if(m_hFont)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;DeleteObject(m_hFont);<BR>&nbsp;&nbsp;&nbsp;m_hFont = NULL;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}</P>
<P>&nbsp;&nbsp; LRESULT OnCommand(UINT, WPARAM wParam, LPARAM, BOOL&amp;)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; USES_CONVERSION;<BR>&nbsp;&nbsp;&nbsp; int&nbsp;code&nbsp;= HIWORD(wParam);<BR>&nbsp;&nbsp;&nbsp; if(code==STN_CLICKED || code==STN_DBLCLK)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(m_bstrLink.Length() == 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetWindowText(&amp;m_bstrLink);<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; if((int)ShellExecute(m_hWnd, _T("open"),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OLE2T(m_bstrLink), NULL, NULL, SW_SHOWNORMAL) &gt; 32)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_bVisited = TRUE;&nbsp;&nbsp; //return codes&gt;32 =&gt; success<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Invalidate();<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBeep(0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ATLTRACE(_T("Error: CStaticLink couldn't open file"));<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; return 0;<BR>&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; LRESULT OnCtlColor(UINT, WPARAM wParam, LPARAM, BOOL&amp;)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; // notify bit must be set to get STN_* notifications<BR>&nbsp;&nbsp;&nbsp; ModifyStyle(0, SS_NOTIFY);<BR>&nbsp;&nbsp;&nbsp; HBRUSH hBr = NULL;<BR>&nbsp;&nbsp;&nbsp; if((GetStyle()&amp;0xff) &lt;= SS_RIGHT)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; // it's a text control: set up font and colors<BR>&nbsp;&nbsp;&nbsp;&nbsp; if(!m_hFont)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOGFONT lf;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetObject(GetFont(), sizeof(lf), &amp;lf);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lf.lfUnderline = TRUE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_hFont = CreateFontIndirect(&amp;lf);<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; HDC hDC = (HDC)wParam;<BR>&nbsp;&nbsp;&nbsp;&nbsp; SelectObject(hDC, m_hFont);<BR>&nbsp;&nbsp;&nbsp;&nbsp; SetTextColor(hDC, m_bVisited?m_clrVisited:m_clrUnvisited);<BR>&nbsp;&nbsp;&nbsp;&nbsp; SetBkMode(hDC, TRANSPARENT);<BR>&nbsp;&nbsp;&nbsp;&nbsp; hBr = (HBRUSH)GetStockObject(HOLLOW_BRUSH);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; return (LRESULT)hBr;<BR>&nbsp;&nbsp; }</P>
<P>private:<BR>&nbsp;COLORREF&nbsp;m_clrUnvisited;<BR>&nbsp;COLORREF&nbsp;m_clrVisited;<BR>&nbsp;BOOL&nbsp;&nbsp;m_bVisited;<BR>&nbsp;HFONT&nbsp;&nbsp;m_hFont;<BR>&nbsp;CComBSTR&nbsp;m_bstrLink;<BR>};</P>
<P>&nbsp;</P>
<P>class CReflectDlg : public CDialogImpl&lt;CReflectDlg&gt;<BR>{<BR>public:<BR>&nbsp;enum { IDD = IDD_DIALOG1 };</P>
<P>&nbsp;BEGIN_MSG_MAP(CReflectDlg)<BR>&nbsp;&nbsp;COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnClose)<BR>&nbsp;&nbsp;MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)<BR>&nbsp;&nbsp;REFLECT_NOTIFICATIONS()&nbsp;&nbsp;//reflect messages back to static links<BR>&nbsp;END_MSG_MAP()</P>
<P>&nbsp;LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&amp;)<BR>&nbsp;{<BR>&nbsp;&nbsp;CenterWindow( GetParent() );<BR>&nbsp;&nbsp;//a textual static control:<BR>&nbsp;&nbsp;s1.SubclassWindow(GetDlgItem(IDS_TEST1));<BR>&nbsp;&nbsp;//a static control displaying an icon<BR>&nbsp;&nbsp;s2.SubclassWindow(GetDlgItem(IDS_TEST2));<BR>&nbsp;&nbsp;//set the icon's link<BR>&nbsp;&nbsp;s2.SetLinkText(_T("<A href="http://www.microsoft.com">http://www.microsoft.com</A>"));<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}</P>
<P>&nbsp;LRESULT OnClose(UINT, WPARAM wID, HWND, BOOL&amp;)<BR>&nbsp;{<BR>&nbsp;&nbsp;EndDialog(wID);<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}</P>
<P>private:<BR>&nbsp;CStaticLink s1, s2;<BR>}; <BR><BR>以上便是这5种方法，在软件设计时有时候达到一个目的的方法很多，这时候最重要的就是选择最适合的方法，使项目改动更小，扩展最好。<BR><BR><A href="/Files/wlwlxj/ATLWindow.rar">下载所有演示例子</A></P><img src ="http://www.cppblog.com/wlwlxj/aggbug/2358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-01-02 15:29 <a href="http://www.cppblog.com/wlwlxj/archive/2006/01/02/2358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ATL窗口继承实现机制</title><link>http://www.cppblog.com/wlwlxj/archive/2005/12/20/1905.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Tue, 20 Dec 2005 08:32:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2005/12/20/1905.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/1905.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2005/12/20/1905.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/1905.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/1905.html</trackback:ping><description><![CDATA[
		<div>学习WTL时，发现其窗口实现模式采用ATL窗口实现方式，于是对ATL窗口实现机制研究一下。</div>
		<div>其主要思想还是继承和模板，避免需函数导致运行时类结构增大。利用控制台程序模拟如下：</div>
		<div>#include &lt;iostream&gt;</div>
		<div>template&lt;class T&gt;<br />class A<br />{<br />public:<br /> A()<br /> {<br /> }<br /> virtual ~A()<br /> {<br /> }<br /> void Say()<br /> {<br />  (static_cast&lt;T*&gt;(this))-&gt;Say();<br /> }<br />};</div>
		<div>class DeriveA : public A&lt;DeriveA&gt;<br />{<br />public:<br /> DeriveA() : A&lt;DeriveA&gt;()<br /> {<br /> }<br /> void Say()<br /> {<br />  std::cout &lt;&lt; "Hello, World!" &lt;&lt; std::endl;<br /> }<br />};</div>
		<div>int main(int argc, char* argv[])<br />{<br /> A&lt;DeriveA&gt;*  pA = new DeriveA();<br /> pA-&gt;Say();<br />delete pA;<br /> return 0;<br />}</div>
		<div>主要通过基类的this指针识别对象。<br /></div>
<img src ="http://www.cppblog.com/wlwlxj/aggbug/1905.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2005-12-20 16:32 <a href="http://www.cppblog.com/wlwlxj/archive/2005/12/20/1905.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>