﻿<?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++ .NET WPF Android</title><link>http://www.cnblogs.com/YilingLai/</link><description>如果您发现任何问题，欢迎指正交流！</description><language>zh-cn</language><lastBuildDate>Wed, 10 Feb 2010 06:37:01 GMT</lastBuildDate><pubDate>Wed, 10 Feb 2010 06:37:01 GMT</pubDate><ttl>60</ttl><item><title>分享几个简单的WPF控件（代码）</title><link>http://www.cnblogs.com/YilingLai/archive/2009/06/15/1503635.html</link><dc:creator>赖仪灵</dc:creator><author>赖仪灵</author><pubDate>Mon, 15 Jun 2009 07:08:00 GMT</pubDate><guid>http://www.cnblogs.com/YilingLai/archive/2009/06/15/1503635.html</guid><description><![CDATA[<p>阅读: 2240 评论: 11 作者: <a href="http://www.cnblogs.com/YilingLai/" target="_blank">赖仪灵</a> 发表于 2009-06-15 15:08 <a href="http://www.cnblogs.com/YilingLai/archive/2009/06/15/1503635.html" target="_blank">原文链接</a></p><p>这几个控件写的时间很长了，由于时间关系一直没有做完。但是不知道什么时候才能做完，现在放出来，有兴趣的可以自己拿去看看。包括源代码。基本效果如下。</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/yilinglai/195643/r_Controls.jpg" width="480" height="480" alt="" />&nbsp;</p>
<p>只有这个主窗口设计了两种基本的颜色方案，鄙人不是美工效果肯定不是很如意，凑合看吧。</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/yilinglai/195643/o_Controls2.jpg" border="0" alt="" />&nbsp;</p>
<p>话不多说，代码在这里：</p>
<p><a href="http://files.cnblogs.com/YilingLai/WPFControls.zip">http://files.cnblogs.com/YilingLai/WPFControls.zip</a></p>
<p>不管首页是否合适，不合适的就撤了吧！&nbsp;</p><img src="http://www.cnblogs.com/YilingLai/aggbug/1503635.html?type=1" width="1" height="1" alt=""/><p>评论: 11　<a href="http://www.cnblogs.com/YilingLai/archive/2009/06/15/1503635.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/YilingLai/archive/2009/06/15/1503635.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56838/" target="_blank">谷歌联合创始人谈Buzz：可以分享实时位置</a><span style="color:gray">(2010-02-10 14:28)</span><br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>捕捉WPF应用程序中XAML代码解析异常</title><link>http://www.cnblogs.com/YilingLai/archive/2007/05/28/762324.html</link><dc:creator>赖仪灵</dc:creator><author>赖仪灵</author><pubDate>Mon, 28 May 2007 04:27:00 GMT</pubDate><guid>http://www.cnblogs.com/YilingLai/archive/2007/05/28/762324.html</guid><description><![CDATA[<p>阅读: 3420 评论: 18 作者: <a href="http://www.cnblogs.com/YilingLai/" target="_blank">赖仪灵</a> 发表于 2007-05-28 12:27 <a href="http://www.cnblogs.com/YilingLai/archive/2007/05/28/762324.html" target="_blank">原文链接</a></p><p>由于WPF应用程序中XAML代码在很多时候是运行时加载处理的。比如DynamicResource，但是在编译或者运行的过程中，编写的XAML代码很可能有错误，此时XAML代码解析器通常会抛出称为XamlParseException的异常。但是抛出的XamlParseException异常提供的信息非常简单，或者是很不准确。此时我们关于通过对变通的方法来获取更多的异常信息：</p>
<p>我们知道，WPF应用程序中的XAML代码是在InitializeComponent方法中解析的。而这个方法通常位于窗口对象的构造函数之中。因此，我们利用.NET的异常机制来调用方法InitializeComponent：<br><br></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"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;partial&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Window1&nbsp;:&nbsp;System.Windows.Window&nbsp;<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">{&nbsp;<br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Window1()&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(&nbsp;Exception&nbsp;ex&nbsp;)<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;异常处理（InnerExceptions）</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">}</span></div>
<br>如此调用InitializeComponent能帮助我们在调试时获得更准确的异常信息。<br><br>除了上面的异常捕捉机制，另一种方案是利用Visual Studio的异常对话框。在菜单调试（Debug）下的异常（Exception...）对话框中，通过右下的添加按钮把System.Markup.XamlParseException加入到异常捕捉列表中。并选中Thrown复选框。如此也能获取更多的关于XamlParseException的信息。<br><br><img height=368 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yilinglai/Exception.png" width=716 border=0> 
<img src="http://www.cnblogs.com/YilingLai/aggbug/762324.html?type=1" width="1" height="1" alt=""/><p>评论: 18　<a href="http://www.cnblogs.com/YilingLai/archive/2007/05/28/762324.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/YilingLai/archive/2007/05/28/762324.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56838/" target="_blank">谷歌联合创始人谈Buzz：可以分享实时位置</a><span style="color:gray">(2010-02-10 14:28)</span><br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>设置WPF窗口相对于非WPF窗口的位置 </title><link>http://www.cnblogs.com/YilingLai/archive/2007/05/15/746706.html</link><dc:creator>赖仪灵</dc:creator><author>赖仪灵</author><pubDate>Tue, 15 May 2007 01:21:00 GMT</pubDate><guid>http://www.cnblogs.com/YilingLai/archive/2007/05/15/746706.html</guid><description><![CDATA[<p>阅读: 3648 评论: 5 作者: <a href="http://www.cnblogs.com/YilingLai/" target="_blank">赖仪灵</a> 发表于 2007-05-15 09:21 <a href="http://www.cnblogs.com/YilingLai/archive/2007/05/15/746706.html" target="_blank">原文链接</a></p><p>在前一个Post当中，指出了在WPF的WindowInteropHelper类中的一个BUG：通过WindowInteropHelper的Owner属性不能实现把WPF窗口的Owner属性设置为一个非WPF窗口的句柄。</p>
<p>在我的Post帖出后不到一天，在WPF SDK的Blog上，<a href="http://blogs.msdn.com/wpfsdk/archive/2007/04/03/centering-wpf-windows-with-wpf-and-non-wpf-owner-windows.aspx">就针对这个BUG给出了一个非常完美的解决方案</a>。既然不同通过设置WindowStartupLocation.CenterOwner来改变窗口的位置。那么我们就用WindowStartupLocation.Manual来手动计算设置窗口的位置。大致的代码如下：</p>
<p>using System.Windows;<br>using System.Windows.Interop; // WindowInteropHelper</p>
<p>...</p>
<p>// Instantiate the owned WPF window<br>Window cw = new Window();</p>
<p>// Set the owned WPF window&#8217;s owner with the non-WPF owner window<br>IntPtr ownerWindowHandle = ...;<br>&nbsp;<br>// Set the owned WPF window&#8217;s owner with the non-WPF owner window</p>
<p>WindowInteropHelper helper = new WindowInteropHelper(cw);<br>helper.Owner = ownerWindowHandle;</p>
<p>// Manually calculate Top/Left to appear centered<br>int nonWPFOwnerLeft = ...; &nbsp;// Get non-WPF owner&#8217;s Left<br>int nonWPFOwnerWidth = ...; &nbsp;// Get non-WPF owner&#8217;s Width<br>int nonWPFOwnerTop = ...; &nbsp;// Get non-WPF owner&#8217;s Top<br>int nonWPFOwnerHeight = ...; &nbsp;// Get non-WPF owner&#8217;s Height</p>
<p>cw.WindowStartupLocation = WindowStartupLocation.Manual;<br>cw.Left = nonWPFOwnerLeft + (nonWPFOwnerWidth - cw.Width) / 2;<br>cw.Top = nonWPFOwnerTop + (nonWPFOwnerHeight - cw.Height) / 2; </p>
<p>// Show the owned WPF window<br>cw.Show();</p>
<p>这段代码理论上没有什么问题呢？但是WPF是支持设备独立的。因此，在非WPF Owner窗口的某些情况下可能会因为DPI的而不能正常工作。解决这个问题，可以利用HwndSource类进行窗口位置的设备独立计算：</p>
<p>using System.Windows; // Window, WindowStartupLocation, Point<br>using System.Windows.Interop; // WindowInteropHelper, HwndSource<br>using System.Windows.Media; // Matrix</p>
<p>...</p>
<p>// Instantiate the owned WPF window<br>CenteredWindow cw = new CenteredWindow();</p>
<p>// Get the handle to the non-WPF owner window<br>IntPtr ownerWindowHandle = ...; // Get hWnd for non-WPF window<br>&nbsp;<br>// Set the owned WPF window&#8217;s owner with the non-WPF owner window<br>WindowInteropHelper helper = new WindowInteropHelper(cw);<br>helper.Owner = ownerWindowHandle;<br>&nbsp;</p>
<p>// Center window<br>// Note - Need to use HwndSource to get handle to WPF owned window,<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and the handle only exists when SourceInitialized has been<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raised</p>
<p>cw.SourceInitialized += delegate<br>{<br>&nbsp;&nbsp;&nbsp; // Get WPF size and location for non-WPF owner window<br>&nbsp;&nbsp;&nbsp; int nonWPFOwnerLeft = ...; // Get non-WPF owner&#8217;s Left<br>&nbsp;&nbsp;&nbsp; int nonWPFOwnerWidth = ...; // Get non-WPF owner&#8217;s Width<br>&nbsp;&nbsp;&nbsp; int nonWPFOwnerTop = ...; // Get non-WPF owner&#8217;s Top<br>&nbsp;&nbsp;&nbsp; int nonWPFOwnerHeight = ...; // Get non-WPF owner&#8217;s Height </p>
<p>&nbsp;&nbsp;&nbsp; // Get transform matrix to transform non-WPF owner window<br>&nbsp;&nbsp;&nbsp; // size and location units into device-independent WPF <br>&nbsp;&nbsp;&nbsp; // size and location units</p>
<p>&nbsp;&nbsp;&nbsp; HwndSource source = HwndSource.FromHwnd(helper.Handle);<br>&nbsp;&nbsp;&nbsp; if (source == null) return;<br>&nbsp;&nbsp;&nbsp; Matrix matrix = source.CompositionTarget.TransformFromDevice;<br>&nbsp;&nbsp;&nbsp; Point ownerWPFSize = matrix.Transform(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Point(nonWPFOwnerWidth, nonWPFOwnerHeight));<br>&nbsp;&nbsp;&nbsp; Point ownerWPFPosition = matrix.Transform(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Point(nonWPFOwnerLeft, nonWPFOwnerTop));</p>
<p>&nbsp;&nbsp;&nbsp; // Center WPF window<br>&nbsp;&nbsp;&nbsp; cw.WindowStartupLocation = WindowStartupLocation.Manual;<br>&nbsp;&nbsp;&nbsp; cw.Left = ownerWPFPosition.X + (ownerWPFSize.X - cw.Width) / 2;<br>&nbsp;&nbsp;&nbsp; cw.Top = ownerWPFPosition.Y + (ownerWPFSize.Y - cw.Height) / 2;</p>
<p>};</p>
<p>// Show WPF owned window<br>cw.Show();</p>
<p>在上面的代码中需要注意的是HwndSource的使用。这个类需要一个窗口句柄，因此它的代码被放在一个SourceInitialized的事件委派函数中执行。</p>
<p>最后，除了上面这种方法，其实我们还可以用Win32 API函数来实现，在ATL的CWindow类中，就有这样的一个函数，我直接把放在下面，有兴趣的朋友参考其中的实现原理：&nbsp;</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">BOOL&nbsp;CenterWindow(HWND&nbsp;hWndCenter&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL)&nbsp;</span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000">()<br><img id=_50_1982_Open_Image onclick="this.style.display='none'; document.getElementById('_50_1982_Open_Text').style.display='none'; document.getElementById('_50_1982_Closed_Image').style.display='inline'; document.getElementById('_50_1982_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_50_1982_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_50_1982_Closed_Text').style.display='none'; document.getElementById('_50_1982_Open_Image').style.display='inline'; document.getElementById('_50_1982_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=_50_1982_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">...</span><span id=_50_1982_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ATLASSERT(::IsWindow(m_hWnd));<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;determine&nbsp;owner&nbsp;window&nbsp;to&nbsp;center&nbsp;against</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwStyle&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GetStyle();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(hWndCenter&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL)<br><img id=_184_303_Open_Image onclick="this.style.display='none'; document.getElementById('_184_303_Open_Text').style.display='none'; document.getElementById('_184_303_Closed_Image').style.display='inline'; document.getElementById('_184_303_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_184_303_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_184_303_Closed_Text').style.display='none'; document.getElementById('_184_303_Open_Image').style.display='inline'; document.getElementById('_184_303_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_184_303_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">...</span><span id=_184_303_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(dwStyle&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;WS_CHILD)<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hWndCenter&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;::GetParent(m_hWnd);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hWndCenter&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;::GetWindow(m_hWnd,&nbsp;GW_OWNER);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;get&nbsp;coordinates&nbsp;of&nbsp;the&nbsp;window&nbsp;relative&nbsp;to&nbsp;its&nbsp;parent</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;RECT&nbsp;rcDlg;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;::GetWindowRect(m_hWnd,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rcDlg);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RECT&nbsp;rcArea;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RECT&nbsp;rcCenter;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HWND&nbsp;hWndParent;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">(dwStyle&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;WS_CHILD))<br><img id=_486_937_Open_Image onclick="this.style.display='none'; document.getElementById('_486_937_Open_Text').style.display='none'; document.getElementById('_486_937_Closed_Image').style.display='inline'; document.getElementById('_486_937_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_486_937_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_486_937_Closed_Text').style.display='none'; document.getElementById('_486_937_Open_Image').style.display='inline'; document.getElementById('_486_937_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_486_937_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">...</span><span id=_486_937_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;don't&nbsp;center&nbsp;against&nbsp;invisible&nbsp;or&nbsp;minimized&nbsp;windows</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(hWndCenter&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;NULL)<br><img id=_572_734_Open_Image onclick="this.style.display='none'; document.getElementById('_572_734_Open_Text').style.display='none'; document.getElementById('_572_734_Closed_Image').style.display='inline'; document.getElementById('_572_734_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_572_734_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_572_734_Closed_Text').style.display='none'; document.getElementById('_572_734_Open_Image').style.display='inline'; document.getElementById('_572_734_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_572_734_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">...</span><span id=_572_734_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwStyleCenter&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;::GetWindowLong(hWndCenter,&nbsp;GWL_STYLE);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">(dwStyleCenter&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;WS_VISIBLE)&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;(dwStyleCenter&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;WS_MINIMIZE))<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hWndCenter&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;center&nbsp;within&nbsp;screen&nbsp;coordinates</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::SystemParametersInfo(SPI_GETWORKAREA,&nbsp;NULL,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rcArea,&nbsp;NULL);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(hWndCenter&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL)<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcCenter&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;rcArea;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::GetWindowRect(hWndCenter,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rcCenter);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=_946_1254_Open_Image onclick="this.style.display='none'; document.getElementById('_946_1254_Open_Text').style.display='none'; document.getElementById('_946_1254_Closed_Image').style.display='inline'; document.getElementById('_946_1254_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_946_1254_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_946_1254_Closed_Text').style.display='none'; document.getElementById('_946_1254_Open_Image').style.display='inline'; document.getElementById('_946_1254_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_946_1254_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">...</span><span id=_946_1254_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;center&nbsp;within&nbsp;parent&nbsp;client&nbsp;coordinates</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hWndParent&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;::GetParent(m_hWnd);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ATLASSERT(::IsWindow(hWndParent));<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::GetClientRect(hWndParent,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rcArea);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ATLASSERT(::IsWindow(hWndCenter));<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::GetClientRect(hWndCenter,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rcCenter);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::MapWindowPoints(hWndCenter,&nbsp;hWndParent,&nbsp;(POINT</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rcCenter,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;DlgWidth&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;rcDlg.right&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;rcDlg.left;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;DlgHeight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;rcDlg.bottom&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;rcDlg.top;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;find&nbsp;dialog's&nbsp;upper&nbsp;left&nbsp;based&nbsp;on&nbsp;rcCenter</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;xLeft&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(rcCenter.left&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;rcCenter.right)&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;DlgWidth&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;yTop&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(rcCenter.top&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;rcCenter.bottom)&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;DlgHeight&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;if&nbsp;the&nbsp;dialog&nbsp;is&nbsp;outside&nbsp;the&nbsp;screen,&nbsp;move&nbsp;it&nbsp;inside</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(xLeft&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;rcArea.left)<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xLeft&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;rcArea.left;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(xLeft&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;DlgWidth&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;rcArea.right)<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xLeft&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;rcArea.right&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;DlgWidth;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(yTop&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;rcArea.top)<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yTop&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;rcArea.top;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(yTop&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;DlgHeight&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;rcArea.bottom)<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yTop&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;rcArea.bottom&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;DlgHeight;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;map&nbsp;screen&nbsp;coordinates&nbsp;to&nbsp;child&nbsp;coordinates</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;::SetWindowPos(m_hWnd,&nbsp;NULL,&nbsp;xLeft,&nbsp;yTop,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SWP_NOSIZE&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;SWP_NOZORDER&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;SWP_NOACTIVATE);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
</div>
<img src="http://www.cnblogs.com/YilingLai/aggbug/746706.html?type=1" width="1" height="1" alt=""/><p>评论: 5　<a href="http://www.cnblogs.com/YilingLai/archive/2007/05/15/746706.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/YilingLai/archive/2007/05/15/746706.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56838/" target="_blank">谷歌联合创始人谈Buzz：可以分享实时位置</a><span style="color:gray">(2010-02-10 14:28)</span><br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>上海.NET俱乐部--微软社区巡展VSTS上海专题活动</title><link>http://www.cnblogs.com/YilingLai/archive/2007/04/17/716691.html</link><dc:creator>赖仪灵</dc:creator><author>赖仪灵</author><pubDate>Tue, 17 Apr 2007 05:59:00 GMT</pubDate><guid>http://www.cnblogs.com/YilingLai/archive/2007/04/17/716691.html</guid><description><![CDATA[<p>阅读: 2837 评论: 6 作者: <a href="http://www.cnblogs.com/YilingLai/" target="_blank">赖仪灵</a> 发表于 2007-04-17 13:59 <a href="http://www.cnblogs.com/YilingLai/archive/2007/04/17/716691.html" target="_blank">原文链接</a></p><p><span>2005</span><span>年</span><span>12</span><span>月</span><span>2</span><span>日，随着微软正式在中国发布了</span><span> Visual Studio 2005 </span><span>产品系列，越来越多的企业客户以及独立软件开发商开始使用</span><span> Visual Studio 2005 </span><span>构建其企业应用程序。做为微软旗舰级平台工具，</span><strong><span>Visual Studio Team System</span></strong><span> </span><span>提供了对软件开发全生命周期的支持与管理，整合了微软三十多年的软件开发经验，让企业客户以及软件开发商可以<strong>站在巨人的肩膀上，打造成功软件。</strong></span><span> </span></p>
<span><span>&nbsp;&nbsp;&nbsp; </span></span><span>为了帮助国内众多使用微软技术进行软件开发的企业和个人大幅提高软件开发的生产力，微软近期与各地<strong>微软</strong></span><strong><span>.NET</span><span>俱乐部</span></strong><span>一起合作，推出</span><span> Visual Studio 2005 Team System </span><span>专场巡展活动，展示</span><span> VSTS </span><span>是怎么进一步为开发人员提高开发生产力以及它又怎么帮助软件团队构建强壮和可靠软件的。希望俱乐部的会员和非会员都能通过本次活动对</span><span> VSTS </span><span>有进一步的认识。&nbsp;&nbsp;
<p><strong><span><br>活动的内容将基本涵括：</span></strong></p>
<p><strong></strong><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></strong><span>基于</span><span>Visual Studio Team System</span><span>的解决方案概述</span><strong></strong></p>
<p><strong></strong><span>&nbsp;&nbsp;<strong>&nbsp;&nbsp;&nbsp;&nbsp;</strong></span><span>基于</span><span>MSF4.0</span><span>的方法论及</span><span>VSTS</span><span>支撑环境</span><span> </span><span>软件生命周期简介</span><strong></strong></p>
<p><strong></strong><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></strong><span>如何组建软件团队及在</span><span>TFS</span><span>上定义团队的角色和责任</span><strong><span> </span></strong><strong></strong></p>
<p><strong></strong><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></strong><span>企业级源代码管理和</span><span>BUG</span><span>管理</span><strong><span> </span></strong><strong></strong></p>
<p><strong></strong><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></strong><span>介绍</span><span>Team Architect</span><span>设计理念、</span><span>Team Architect</span><span>设计方案</span><strong><span> </span></strong><strong></strong></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>测试相关内容</span></p>
<p><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></strong><span>VSTS DEMO</span></p>
<p><strong><span>网上注册：</span></strong><span><a href="http://www.techjie.com/usermodules/register.aspx"><span>http://www.techjie.com/usermodules/register.aspx</span></a></span></p>
<p><strong><span>注：为了控制参会人数，以前注册过俱乐部活动的朋友需要再次注册，才能受邀参加此次活动。</span></strong><strong></strong></p>
<p><strong><span>活动时间</span></strong><strong><span>:</span></strong><strong><span>　</span></strong><span>4<span>月</span>21<span>日</span>(<span>周六</span>)<span>&nbsp;&nbsp;&nbsp; </span>14:00<span>—</span>17:30</span><strong></strong></p>
<p><strong><span>联系电话</span></strong><span>：</span><span>021-64389621</span></p>
<p><strong><span>Email:</span></strong><strong><span>　</span></strong><span><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#84;&#101;&#99;&#104;&#106;&#105;&#101;&#64;&#84;&#101;&#99;&#104;&#106;&#105;&#101;&#46;&#99;&#111;&#109;">Techjie@Techjie.com</a></span></p>
<p><strong><span>活动地点：</span></strong><span> 上海市淮海中路</span><span>1555<span>号 上海图书馆</span></span></p>
<p><strong><span>坐车路线</span></strong><span>:<span>　</span>26<span>、</span>911<span>、</span>926<span>、</span>945<span>、</span>920<span>、</span>830<span>、</span>96<span>、</span>93<span>、</span>15<span>、</span>548<span>等高安路或上海图书馆站；地铁一号线衡山路站</span></span><span> </span></p>
<p><img height=329 alt="" src="http://www.cnblogs.com/images/cnblogs_com/yilinglai/NetClut.png" width=466 border=0></p>
</span>
<img src="http://www.cnblogs.com/YilingLai/aggbug/716691.html?type=1" width="1" height="1" alt=""/><p>评论: 6　<a href="http://www.cnblogs.com/YilingLai/archive/2007/04/17/716691.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/YilingLai/archive/2007/04/17/716691.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56838/" target="_blank">谷歌联合创始人谈Buzz：可以分享实时位置</a><span style="color:gray">(2010-02-10 14:28)</span><br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>WPF关于WindowInteropHelper的一个BUG</title><link>http://www.cnblogs.com/YilingLai/archive/2007/04/03/698064.html</link><dc:creator>赖仪灵</dc:creator><author>赖仪灵</author><pubDate>Tue, 03 Apr 2007 04:16:00 GMT</pubDate><guid>http://www.cnblogs.com/YilingLai/archive/2007/04/03/698064.html</guid><description><![CDATA[<p>阅读: 1570 评论: 2 作者: <a href="http://www.cnblogs.com/YilingLai/" target="_blank">赖仪灵</a> 发表于 2007-04-03 12:16 <a href="http://www.cnblogs.com/YilingLai/archive/2007/04/03/698064.html" target="_blank">原文链接</a></p><p>在Windows SDK中关于<a href="http://msdn2.microsoft.com/en-us/library/system.windows.interop.windowinterophelper.aspx" target=_blank>WindowInteropHelper类</a>的介绍中，关于其Owner属性的说明和实现有些问题。</p>
<p>原文是：An example scenario is if you need to host a WPF dialog box in a Win32 application. Initialize the WindowInteropHelper with a WPF window object for the dialog. You can then get the WPF window's handle (HWND) from the Handle property and specify the owner for the WPF window with the Owner property. The following code example shows how to use WindowInteropHelper when hosting a WPF dialog box in a Win32 application.</p>
<p>大意是通过WindowInteropHelper的Owner属性可以把WPF窗口的Owner属性设置为一个Win32的窗口句柄HWND。但是这个功能的实现是有问题的。有兴趣的朋友可以通过下面的代码进行测试：</p>
<p>Window myDialog = new Window();<br>myDialog.WindowStartupLocation = WindowStartupLocation.CenterOwner;<br>WindowInteropHelper wih = new WindowInteropHelper(myDialog);<br>wih.Owner = ownerHwnd;<br>myDialog.ShowDialog();</p>
<p>这段代码最后显示的窗口不会位于Owner窗口的中心。事实上，WindowInteropHelper.Owner属性设置的是Window类的_ownerHandle成员。这个成员和Window.Owner设置的成员不是同一个。因此，文档中的说明和WPF的实际实现不相符的。这个问题基本已经确认是WPF的一个BUG。</p>
<img src="http://www.cnblogs.com/YilingLai/aggbug/698064.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/YilingLai/archive/2007/04/03/698064.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/YilingLai/archive/2007/04/03/698064.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56838/" target="_blank">谷歌联合创始人谈Buzz：可以分享实时位置</a><span style="color:gray">(2010-02-10 14:28)</span><br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>WPF全景体验</title><link>http://www.cnblogs.com/YilingLai/archive/2007/03/07/667041.html</link><dc:creator>赖仪灵</dc:creator><author>赖仪灵</author><pubDate>Wed, 07 Mar 2007 09:14:00 GMT</pubDate><guid>http://www.cnblogs.com/YilingLai/archive/2007/03/07/667041.html</guid><description><![CDATA[<p>阅读: 6236 评论: 16 作者: <a href="http://www.cnblogs.com/YilingLai/" target="_blank">赖仪灵</a> 发表于 2007-03-07 17:14 <a href="http://www.cnblogs.com/YilingLai/archive/2007/03/07/667041.html" target="_blank">原文链接</a></p><h2 align=center>WPF<span>全景体验</span></h2>
<p><st2:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="30" Month="1" Year="2007">2007<span>年</span>1<span>月</span>30<span>日</span></st2:chsdate><span>，</span>Windows Vista<span>正式全球同步发布。此举标志着</span>Windows Vista<span>已经旋风般地吹向了整个网络世界。比尔盖茨预言：只需要三分钟时间就能让用户接受</span>Windows Vista<span>。但是，微软如何才能做到这一点呢？其中最关键的一点就是</span>Windows Presentation Foundation<span>（</span>WPF<span>），她依赖于</span>WPF<span>所带来的震撼视觉效果和用户体验。<br><br></span><u><font color=#800080><a href="http://www.cnblogs.com/YilingLai/articles/667023.html" target=_blank><u><font color=#800080>请在这里查看全部文章</font></u></a></font></u></p>
<img src="http://www.cnblogs.com/YilingLai/aggbug/667041.html?type=1" width="1" height="1" alt=""/><p>评论: 16　<a href="http://www.cnblogs.com/YilingLai/archive/2007/03/07/667041.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/YilingLai/archive/2007/03/07/667041.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56838/" target="_blank">谷歌联合创始人谈Buzz：可以分享实时位置</a><span style="color:gray">(2010-02-10 14:28)</span><br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>最优化WPF 3D性能（基于“Tier-2”硬件）</title><link>http://www.cnblogs.com/YilingLai/archive/2007/02/09/645536.html</link><dc:creator>赖仪灵</dc:creator><author>赖仪灵</author><pubDate>Fri, 09 Feb 2007 01:02:00 GMT</pubDate><guid>http://www.cnblogs.com/YilingLai/archive/2007/02/09/645536.html</guid><description><![CDATA[<p>阅读: 4339 评论: 7 作者: <a href="http://www.cnblogs.com/YilingLai/" target="_blank">赖仪灵</a> 发表于 2007-02-09 09:02 <a href="http://www.cnblogs.com/YilingLai/archive/2007/02/09/645536.html" target="_blank">原文链接</a></p><h2>原文地址：<a href="http://blogs.msdn.com/wpfsdk/archive/2007/01/15/maximizing-wpf-3d-performance-on-tier-2-hardware.aspx">Maximizing WPF 3D Performance on Tier-2 Hardware</a></h2>
<p><span>开发人员在应用程序中使用</span>Windows Presentation Foundation<span>来构建大量的</span>3D<span>控件、包含</span>3D<span>场景时，常常会遇到如何优化其性能的问题。</span>WPF 3D<span>组的几个成员提供了一个影响应用程序性能的</span>3D<span>类和属性的列表。当我们使用她们来优化应用程序性能时应该遵从这些建议。</span></p>
<p><span>本随笔假定你深刻的理解了</span>WPF 3D API<span>。不熟悉这些</span>API<span>的用户在使用这些建议之前应该首先阅读</span>WPF SDK<span>文档。本随笔中提出的建议只适用于&#8220;</span>Tier-2<span>&#8221;的视频硬件（通常是指支持象素</span>Shader 2.0<span>和顶点</span>Shader 2.0<span>的硬件）。为了简洁，本随笔进行适当的总结，因此真正理解掌握她们并不简单。<br>&nbsp; </p>
<h3><span>性能影响级：高</span></h3>
<p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td width=175>
            <p align=center><strong><span>属性</span></strong></p>
            </td>
            <td width=482>
            <p align=center><strong><span>建议</span></strong></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>Brush</p>
            </td>
            <td width=482>
            <p>Brush<span>速度（从快到慢）：</span></p>
            <p>SolidColorBrush</p>
            <p>LinearGradientBrush</p>
            <p>ImageBrush</p>
            <p>DrawingBrush(<span>缓存的</span>)</p>
            <p>VisualBrush(<span>缓存的</span>)</p>
            <p>RadialGradientBrush</p>
            <p>DrawingBrush(<span>未缓存的</span>)</p>
            <p>VisualBrush(<span>未缓存的</span>)</p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>Viewport3D.ClipToBounds</p>
            </td>
            <td width=482>
            <p><span>在明确不需要把</span>Viewport3D<span>的内容剪切到</span>Viewport3D<span>的矩形范围内时，应该把</span>Viewport3D.ClipToBounds<span>设置为</span>false<span>。</span>WPF<span>的反走样剪切非常慢，而且</span>ClipToBounds<span>默认是为</span>true<span>的。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>Viewport3D.IsHitTestVisible</p>
            </td>
            <td width=482>
            <p><span>如果鼠标点击时不需要考虑</span>Viewport3D<span>的内容，</span>Viewport3D.IsHitTestVisible<span>应该设置为</span>false<span>。</span>3D<span>内容的点击测试是由软件实现的，在大的网格中非常慢。</span>Viewport3D<span>的</span>IsHitTestVisible<span>默认是为</span>true<span>的。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>GeometryModel3D</p>
            </td>
            <td width=482>
            <p><span>只有在需要不同的</span>Materials<span>或者</span>Transforms<span>时，才建立不同的模型。否则应该把多个</span>GeometryModel3D<span>实例用相同的</span>Materials<span>和</span>Transforms<span>组合到一个更大的</span>GeometryModel3D<span>和</span>MeshGeometry3D<span>实例之中。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>MeshGeometry3D</p>
            </td>
            <td width=482>
            <p><span>基于每帧来改变网格的不同顶点形成的网格动画在</span>WPF<span>不是很高效。在修改顶点时，为了减少对性能的影响，在执行每个顶点的修改之前应该从</span>Visual<span>树中</span>Detach<span>网格。在修改完成后，重新</span>Attach<span>到</span>Visual<span>树。同样，构建这样的动画时应该减小网格的大小。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>3D<span>反走样</span></p>
            </td>
            <td width=482>
            <p><span>为了尽可能增加提交速度，可通过设置</span>Attached<span>属性</span>RenderOptions.EdgeMode<span>为</span>Aliased<span>来禁用</span>Multisampling<span>。默认时，</span>3D<span>反走样在</span>Windows XP<span>被禁用，而在</span>Windows Vista<span>被启用，每个象素</span>4<span>个</span>Samples<span>。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>Text</p>
            </td>
            <td width=482>
            <p>3D<span>场景中的实时文本（比较在</span>DrawingBrush<span>或者</span>VisualBrush<span>中的文本就是实时的）通常非常缓慢。尝试使用文本的图像（通过</span>RenderTargetBitmap<span>）来代替她，除非你需要修改文本。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>TileBrush</p>
            </td>
            <td width=482>
            <p><span>如果你必须要在</span>3D<span>场景中使用</span>VisualBrush<span>或者</span>DrawingBrush<span>（因为这种</span>Brush<span>的内容不是静态的），应该尝试缓存</span>Brush<span>（通过设置</span>Attached<span>属性</span>RenderOptions.CachingHint<span>为</span>Cache<span>实现）。</span></p>
            <p><span>用</span>CacheInvalidationThresholdMinimum<span>、</span>CacheInvalidationThresholdMaximum<span>设置无效放缩的最大、最小阀值。她能在场景中减小</span>Brush<span>重新生成的次数（甚至是避免），同时保持我们需要的质量。默认时，</span>DrawingBrush<span>和</span>VisualBrush<span>都没有缓存，表示每次重画都必须重新生成画刷，而且整个内容是被画到一个临时的</span>Surface<span>，最后再复制到目标</span>Surface<span>。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>BitmapEffect</p>
            </td>
            <td width=482>
            <p>BitmapEffect<span>强制其影响的所有内容都不能使用硬件加速来提交。如果需要最好的性能，请不要使用</span>BitmapEffect<span>。</span></p>
            </td>
        </tr>
    </tbody>
</table>
<span lang=ZH-CN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><strong style="FONT-SIZE: 14pt"><br>&nbsp; </p>
<h3><span>性能影响级别：中</span></h3>
<p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td width=175>
            <p align=center><strong><span>属性</span></strong></p>
            </td>
            <td width=482>
            <p align=center><strong><span>建议</span></strong></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>MeshGeometry3D</p>
            </td>
            <td width=482>
            <p><span>如果网格是通过共享顶点（而且这些顶点的位置、向量和纹理映射都相同），以邻接三角形的形式定义网格的，共享的顶点应该只定义一次，然后用索引</span>MeshGeometry3D.TriangleIndices<span>来定义三角形。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>ImageBrush</p>
            </td>
            <td width=482>
            <p><span>当我们需要直接控制纹理大小时（比如在使用</span>RenderTargetBitmap<span>和</span>/<span>或者</span>ImageBrush<span>时），应该尽可能减小</span>WPF<span>纹理大小。注意低分辨率的纹理会降低显示质量。因此在质量和性能之间应该进行合理的选择。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>Opacity</p>
            </td>
            <td width=482>
            <p><span>提交半透明的</span>3D<span>内容时（比如反射），应该在</span>Brush<span>或者</span>Materials<span>上使用</span>Opacity<span>属性（通过</span>Brush.Opacity<span>或者</span>Materials.Opacity<span>）而不是另外建立一个半透明的</span>Viewport3D<span>（使</span>Viewport3D.Opacity &lt; 1<span>）。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>Viewport3D</p>
            </td>
            <td width=482>
            <p><span>减少在场景中使用的</span>Viewport3D<span>的数量。把多个</span>3D<span>模型放在同一个</span>Viewport3D<span>之中，而不是为每个模型建立不同的</span>Viewport3D<span>。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>Freezable</p>
            </td>
            <td width=482>
            <p><span>通常，重用</span>MeshGeometry3D<span>、</span>GeometryModel3D<span>、</span>Brush<span>和</span>Materials<span>很有好处。由于她们都从</span>Freezable<span>继承，都可以拥有多个父元素。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>Brush</p>
            </td>
            <td width=482>
            <p><span>当</span>Brush<span>内容不改变时，用</span>ImageBrush<span>来代替</span>VisualBrush<span>和</span>DrawingBrush<span>。</span>2D<span>内容可以通过</span>RenderTargetBitmap<span>转换为</span>Image<span>，然后在</span>ImageBursh<span>中使用。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>Light</p>
            </td>
            <td width=482>
            <p><span>光源速度（从快到慢）：</span></p>
            <p>Ambient</p>
            <p>Directional</p>
            <p>Point</p>
            <p>Spot</p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>MeshGeometry3D</p>
            </td>
            <td width=482>
            <p><span>尽量让网格大小满足这些条件：</span></p>
            <p>MeshGeometry3D.Positions: 20,001<span>个</span>Point3D<span>实例</span></p>
            <p>MeshGeometry3D.TriangleIndices: 60,003<span>个</span>Int32<span>实例</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>Materials</p>
            </td>
            <td width=482>
            <p>Materials<span>速度（从快到慢）：</span></p>
            <p>EmissiveMaterials</p>
            <p>DiffuseMaterials</p>
            <p>SpecularMaterials</p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>Brush</p>
            </td>
            <td width=482>
            <p>WPF 3D<span>没有以相同的方式来选择忽略不可见的画刷（黑色的环境</span>Brush<span>、光亮画刷等等）。不要在我们的场景中使用她们。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>MaterialsGroup</p>
            </td>
            <td width=482>
            <p><span>在</span>MaterialsGroup<span>中的每个</span>Materials<span>都引起另一个提交通道，因此包含多个</span>Materials<span>，即使是简单的</span>Materials<span>也会严重地增加</span>GPU<span>的填充指令。应该在</span>MaterialsGroup<span>尽可能减少</span>Materials<span>的数量。</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<h3><span>性能影响级别：低</span></h3>
<p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td width=175><strong><span>
            <p align=center><strong><span>属性</span></strong></p>
            </span></strong></td>
            <td width=482><strong><span>
            <p align=center><strong><span>建议</span></strong></p>
            </span></strong></td>
        </tr>
        <tr>
            <td width=175>
            <p>Transform3DGroup</p>
            </td>
            <td width=482>
            <p><span>当我们不需要动画或者数据绑定时，不要使用</span>Transform<span>组包含多个</span>Transform<span>。而是使用一个单独的</span>MatrixTransform3D<span>。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>Light</p>
            </td>
            <td width=482>
            <p><span>在场景中减少光源的数量。太多的光源会强制</span>WPF<span>回退到软件提交实现。粗略的限制是</span>110<span>个</span>DirectionalLights<span>、</span>70<span>个</span>PointLights<span>或者</span>40<span>个</span>SpotLights<span>。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>ModelVisual3D</p>
            </td>
            <td width=482>
            <p><span>应该把静态对象单独放入一个</span>ModelVisual3D<span>实例。</span>ModelVisual3D<span>比</span>GeometryModel3D<span>更庞大，因为她缓存了变换的边界。</span>GeometryModel3D<span>适合于模型。而</span>ModelVisual3D<span>适合于场景点。我们需要使用</span>ModelVisual3D<span>来把</span>GeometryModel3D<span>实例（希望共享）放入场景之中。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>Light</p>
            </td>
            <td width=482>
            <p><span>在场景中减少改变光源的次数。每次改变光源都强制重新生成</span>Shader<span>、重新编译。除非原来的配置已经存在（也就是</span>Shader<span>被缓存）。</span></p>
            </td>
        </tr>
        <tr>
            <td width=175>
            <p>MeshGeometry3D</p>
            </td>
            <td width=482>
            <p><span>为了减少在</span>WPF<span>构造大量集合的时间，比如</span>MeshGeometry3D<span>的</span>Position<span>、</span>Normals<span>、</span>TextureCoordinates<span>和</span>TrangleIndices<span>。应该在值写入前就改变集合的大小。如果可能，直接向集合的构造函数传入一个</span>Array<span>或者</span>List<span>。</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><span>作者：</span><span>David Teitlebaum</span><span>。感谢</span><span>Chris Raubacher</span><span>、</span><span>Anthony Hodsdon</span><span>、</span><span>Jordan Parker</span><span>和</span><span>Daniel Lehenbauer</span><span>。</span></p>
</strong></span></span>
<img src="http://www.cnblogs.com/YilingLai/aggbug/645536.html?type=1" width="1" height="1" alt=""/><p>评论: 7　<a href="http://www.cnblogs.com/YilingLai/archive/2007/02/09/645536.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/YilingLai/archive/2007/02/09/645536.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56838/" target="_blank">谷歌联合创始人谈Buzz：可以分享实时位置</a><span style="color:gray">(2010-02-10 14:28)</span><br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Windows Vista桌面窗口管理器（3）</title><link>http://www.cnblogs.com/YilingLai/archive/2007/01/25/630481.html</link><dc:creator>赖仪灵</dc:creator><author>赖仪灵</author><pubDate>Thu, 25 Jan 2007 09:15:00 GMT</pubDate><guid>http://www.cnblogs.com/YilingLai/archive/2007/01/25/630481.html</guid><description><![CDATA[<p>阅读: 3470 评论: 2 作者: <a href="http://www.cnblogs.com/YilingLai/" target="_blank">赖仪灵</a> 发表于 2007-01-25 17:15 <a href="http://www.cnblogs.com/YilingLai/archive/2007/01/25/630481.html" target="_blank">原文链接</a></p><p><a href="http://www.cnblogs.com/YilingLai/archive/2007/01/16/621806.html">前面曾经提到过，通过WDDM可以支持Surface的跨进程共享</a>。共享DirectX表面对于重定向DirectX应用程序非常重要。因为Vista必须要和以前的应用程序兼容，就必须支持以前用GDI、、DirectX编写的应用程序。WDM必须把这些应用程序的窗口重定向到Surface，然后由WDM统一合成、最后显示一个单一的Surface。</p>
<p>需要注意的一点是：WDM只重定向Top-level的窗口。而对于MDI应用程序，它的所有Top-level窗口、子窗口会被合成为单独的一个Surface，然后交给DWM合成。根据以前的Windows图形系统。重定向主要分为以下三类：</p>
<p>1、只用GDI显示的窗口</p>
<p>毫无疑问，GDI应用程序在当今任是主流。WDM在重定向基于GDI的应用程序时，基本过程如下：<br>A、在系统内存中分配一个和窗口大小一样的内存块，然后和窗口关联。<br>B、显示内存中也分配一个同样大小、指定象素格式的显存块。<br>C、然后，当应用程序获得窗口的DC时，因为这个窗口还没有参与到WDM的合成，所以现在，它活动的DC不在是主视频内存中，而且前面在系统内存中分配的内存块。<br>D、经过GDI的操作后，在系统内存形成一个Surface。<br>E、系统会根据窗口的各种参数、适当的从系统内存复制显示内容到视频内存中。<br>F、这样，视频内存的数据就和窗口保持一致，剩下的工作就由WDM完成：合成各个Surface，形成最终的桌面。</p>
<p>另外还有两点需要特别说明：</p>
<p>（1）、双缓冲窗口。现在，双缓冲技术显示的窗口特别多，它能有效的避免闪烁。确实，在使用了双缓冲的GDI窗口中，它本身就有两个内存块，一个在系统，一个在显卡。所以问题来了：为什么重定向时不直接使用双缓冲中的显示内存块呢？这样做主要有两个问题：一是格式不相同，GDI显示的格式和DirectX的格式不相同。GDI不支持以DirectX格式进行提交。二是很多GDI操作（XOR、文本、Alpha混合等等）是一种&#8220;读取－修改－写回&#8221;这样的三步操作。如果重定向时直接使用显存块，GDI显示的时候必须从显存读取原来的显示内容到CPU（或者系统内存），然后再修改，最后写回到显存。这样的操作效率非常低。所以没有采用。</p>
<p>（2）、最小化窗口。通常，最小化后的窗口只显示在任务栏的一个很小范围内，我们需要画窗口的大小估计也只有130X30。但是，在DWM中没有采用这种用法。因为，如果窗口最小化后我们把Surface的大小修改为130x30再按需显示，这样会在Filp3D或者取缩略图时有问题，因此窗口已经被修改。所以，DWM在窗口最小化后保存了最后一次更新的Sureface内容。</p>
<p>2、只用DirectX显示的窗口</p>
<p>由于DirectX应用程序通常是通过调用Present()函数进行Surface的提交，所以这类应用程序通常只需要一个窗口缓冲就可以实现重定向。这种DirectX窗口的重定向是由DirectX系统（实际上是DirectX 10）处理的，当DirectX10决定显示某个Surface时，它会调用DWM的接口，以此实现跨进程的共享。DirectX 10的&#8220;Furface共享&#8221;是一个非常独特的功能，其建立在WDDM之上。这也是运行DWM必须要WDDM的关键原因之一。</p>
<p>当Present()显示Surface时，DWM会得到通知，表示应该更新其原来的窗口Surface，更新后DWM再重新进行合成。注意WPF应用程序也是DirectX应用程序。它们也是采用这种重定向方式。</p>
<p>3、混合GDI和DirectX的窗口</p>
<p>现在，有很多的Top-level窗口采用了GDI+DirectX的方式进行内容显示。根据混合的方式不同结果也不同。如果Top-Level窗口以及它的每个子窗口是用唯一的方式进行显示，比如主窗口只用DirectX，子窗口只用了GDI，DWM对这样的窗口会形成自己的&#8220;合成&#8221;树。没有子窗口单独显示，然后整个Tree的Surface被合成为传递给桌面。这样的混合方式能很好的实现。</p>
<p>对于单独一个Top-level窗口同时使用GDI+DirectX显示，比较麻烦。特别是GDI+DirectX对窗口的某个区域进行重复显示的情况。DWM通常不支持这样的窗口。</p>
<img src="http://www.cnblogs.com/YilingLai/aggbug/630481.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/YilingLai/archive/2007/01/25/630481.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/YilingLai/archive/2007/01/25/630481.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56838/" target="_blank">谷歌联合创始人谈Buzz：可以分享实时位置</a><span style="color:gray">(2010-02-10 14:28)</span><br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>闲话WPF之二六（WPF性能优化点）</title><link>http://www.cnblogs.com/YilingLai/archive/2007/01/19/624714.html</link><dc:creator>赖仪灵</dc:creator><author>赖仪灵</author><pubDate>Fri, 19 Jan 2007 05:33:00 GMT</pubDate><guid>http://www.cnblogs.com/YilingLai/archive/2007/01/19/624714.html</guid><description><![CDATA[<p>阅读: 4465 评论: 12 作者: <a href="http://www.cnblogs.com/YilingLai/" target="_blank">赖仪灵</a> 发表于 2007-01-19 13:33 <a href="http://www.cnblogs.com/YilingLai/archive/2007/01/19/624714.html" target="_blank">原文链接</a></p><p>在建立漂亮UI的同时，我们还需要关注应用程序的性能，WPF尤其如此。下面从MS的文档中总结出了一些有用的性能优化点。在实际编写的过程中，可以参考。这个Post非完全原创，是根据一些文档总结出来的。<br><br>1、建立逻辑树的时候，尽量考虑从父结点到子结点的顺序构建。因为当逻辑树的一个结点发生变化时（比如添加或删除），它的父结点和所有的子结点都会激发Invalidation。我们应该避免不必要的Invalidation。</p>
<p>2、当我们在列表（比如ListBox）显示了一个CLR对象列表（比如List）时，如果想在修改List对象后，ListBox也动态的反映这种变化。此时，我们应该使用动态的ObservableCollection对象绑定。而不是直接的更新ItemSource。两者的区别在于直接更新ItemSource会使WPF抛弃ListBox已有的所有数据，然后全部重新从List加载。而使用ObservableCollection可以避免这种先全部删除再重载的过程，效率更高。</p>
<p>3、在使用数据绑定的过程中，如果绑定的数据源是一个CLR对象，属性也是一个CLR属性，那么在绑定的时候对象CLR对象所实现的机制不同，绑定的效率也不同。</p>
<p>A、数据源是一个CLR对象，属性也是一个CLR属性。对象通过TypeDescriptor/PropertyChanged模式实现通知功能。此时绑定引擎用TypeDescriptor来反射源对象。效率最低。<br>B、数据源是一个CLR对象，属性也是一个CLR属性。对象通过INotifyPropertyChanged实现通知功能。此时绑定引擎直接反射源对象。效率稍微提高。<br>C、数据源是一个DependencyObject，而且属性是一个DependencyProperty。此时不需要反射，直接绑定。效率最高。</p>
<p>4、访问CLR对象和CLR属性的效率会比访问DependencyObject/DependencyProperty高。注意这里指的是访问，不要和前面的绑定混淆了。但是，把属性注册为DependencyProperty会有很多的优点：比如继承、数据绑定和Style。所以有时候我们可以在实现DependencyProperty的时候，利用缓存机制来加速访问速度：看下面的缓存例子：</p>
<p>public static readonly DependencyProperty MagicStringProperty = <br>&nbsp;&nbsp;&nbsp; DependencyProperty.Register("MagicString", typeof(string), typeof(MyButton), new PropertyMetadata(new PropertyInvalidatedCallback(OnMagicStringPropertyInvalidated),new GetValueOverride(MagicStringGetValueCallback)));</p>
<p>&nbsp;private static void OnMagicStringPropertyInvalidated(DependencyObject d)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; // 将缓存的数据标识为无效<br>&nbsp;&nbsp;&nbsp; ((MyButton)d)._magicStringValid = false;<br>&nbsp; }</p>
<p>&nbsp; private static object MagicStringGetValueCallback(DependencyObject d)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; // 调用缓存的访问器来获取值<br>&nbsp;&nbsp;&nbsp; return ((MyButton)d).MagicString;<br>&nbsp; }</p>
<p>&nbsp; // 私有的CLR访问器和本地缓存<br>&nbsp; public string MagicString<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; get<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 在当前值无效时，获取最新的值保存起来<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!_magicStringValid)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _magicString = (string)GetValueBase(MagicStringProperty);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _magicStringValid = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return _magicString;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; set<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetValue(MagicStringProperty, value);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>&nbsp; private string _magicString;<br>&nbsp; private bool _magicStringValid;</p>
<p>另外，因为注册的DependencyProperty在默认是不可继承的，如果需要继承特性，也会降低DependencyProperty值刷新的效率。注册DependencyProperty属性时，应该把DefaultValue传递给Register方法的参数来实现默认值的设置，而不是在构造函数中设置。</p>
<p>5、使用元素TextFlow和TextBlock时，如果不需要TextFlow的某些特性，就应该考虑使用TextBlock，因为它的效率更高。</p>
<p>6、在TextBlock中显式的使用Run命令比不使用Run命名的代码要高。</p>
<p>7、在TextFlow中使用UIElement（比如TextBlock）所需的代价要比使用TextElement（比如Run）的代价高。</p>
<p>8、把Label（标签）元素的ContentProperty和一个字符串（String）绑定的效率要比把字符串和TextBlock的Text属性绑定的效率低。因为Label在更新字符串是会丢弃原来的字符串，全部重新显示内容。</p>
<p>9、在TextBlock块使用HyperLinks时，把多个HyperLinks组合在一起效率会更高。看下面的两种写法，后一种效率高。</p>
<p>A、<br>&lt;TextBlock Width="600" &gt;<br>&nbsp; &lt;Hyperlink TextDecorations="None"&gt;MSN Home&lt;/Hyperlink&gt;<br>&lt;/TextBlock&gt;<br>&lt;TextBlock Width="600" &gt;<br>&nbsp; &lt;Hyperlink TextDecorations="None"&gt;My MSN&lt;/Hyperlink&gt;<br>&lt;/TextBlock&gt;</p>
<p>B、<br>&lt;TextBlock Width="600" &gt;<br>&nbsp; &lt;Hyperlink TextDecorations="None"&gt;MSN Home&lt;/Hyperlink&gt;<br>&nbsp; &lt;Hyperlink TextDecorations="None"&gt;My MSN&lt;/Hyperlink&gt;<br>&lt;/TextBlock&gt;</p>
<p>10、任与上面TextDecorations有关，显示超链接的时候，尽量只在IsMouseOver为True的时候显示下划线，一直显示下划线的代码高很多。</p>
<p>11、在自定义控件，尽量不要在控件的ResourceDictionary定义资源，而应该放在Window或者Application级。因为放在控件中会使每个实例都保留一份资源的拷贝。</p>
<p>12、如果多个元素使用相同的Brush时，应该考虑在资源定义Brush，让他们共享一个Brush实例。</p>
<p>13、如果需要修改元素的Opacity属性，最后修改一个Brush的属性，然后用这个Brush来填充元素。因为直接修改元素的Opacity会迫使系统创建一个临时的Surface。</p>
<p>14、在系统中使用大型的3D Surface时，如果不需要Surface的HitTest功能，请关闭它。因为默认的HitTest会占用大量的CPU时间进行计算。UIElement有应该IsHitTestVisible属性可以用来关闭HitTest功能。</p>
<img src="http://www.cnblogs.com/YilingLai/aggbug/624714.html?type=1" width="1" height="1" alt=""/><p>评论: 12　<a href="http://www.cnblogs.com/YilingLai/archive/2007/01/19/624714.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/YilingLai/archive/2007/01/19/624714.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56838/" target="_blank">谷歌联合创始人谈Buzz：可以分享实时位置</a><span style="color:gray">(2010-02-10 14:28)</span><br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>闲话WPF之二五（WPF中的ControlTemplate [3]）</title><link>http://www.cnblogs.com/YilingLai/archive/2007/01/18/623892.html</link><dc:creator>赖仪灵</dc:creator><author>赖仪灵</author><pubDate>Thu, 18 Jan 2007 07:44:00 GMT</pubDate><guid>http://www.cnblogs.com/YilingLai/archive/2007/01/18/623892.html</guid><description><![CDATA[<p>阅读: 3818 评论: 4 作者: <a href="http://www.cnblogs.com/YilingLai/" target="_blank">赖仪灵</a> 发表于 2007-01-18 15:44 <a href="http://www.cnblogs.com/YilingLai/archive/2007/01/18/623892.html" target="_blank">原文链接</a></p><p>在实际应用中，ControlTemplate是一个非常重要的功能。它帮助我们快速实现很Cool的自定义控件。下面我以Windows Vista SDK中的例子<a href="http://www.cnblogs.com/Files/YilingLai/ControlTemplateExamples.zip">ControlTemplateExamples</a>为基础，简单地分析ControlTemplate的使用。这个例子工程非常丰富，几乎包含了所有的标准控件。所以，在实现自定义控件时，可以先参考这样进行适当的学习研究。</p>
<p>首先是App.xaml文件，这里它把Application.StartupUri属性设置为Window1.xaml。然后把工程目录Resource下所有的控件xaml文件都合成为了应用程序范围内的资源。</p>
<p>&lt;Application.Resources&gt;<br>&nbsp;&nbsp;&nbsp; &lt;ResourceDictionary&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ResourceDictionary.MergedDictionaries&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ResourceDictionary Source="Resources\Shared.xaml" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 这里省略 --&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ResourceDictionary Source="Resources\NavigationWindow.xaml" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ResourceDictionary.MergedDictionaries&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/ResourceDictionary&gt;<br>&lt;/Application.Resources&gt;</p>
<p>这样的用法很有借鉴意义。在WPF中实现Skin框架也随之变得非常简单。值需要动态使用不同的XAML文件即可。然后是Window1.xaml文件。它里面几乎把所有的控件都显示了一遍。没有什么多说的。重点看Resource目录下的自定义控件文件。这里的控件太多，不可能每个都说说。我只挑选其中的Button.xaml为例：</p>
<p>&lt;ResourceDictionary <br>&nbsp; xmlns="<a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation">http://schemas.microsoft.com/winfx/2006/xaml/presentation</a>"<br>&nbsp; xmlns:x="<a href="http://schemas.microsoft.com/winfx/2006/xaml">http://schemas.microsoft.com/winfx/2006/xaml</a>" &gt;</p>
<p>&nbsp; &lt;ResourceDictionary.MergedDictionaries&gt;<br>&nbsp;&nbsp;&nbsp; &lt;ResourceDictionary Source="Shared.xaml"/&gt;<br>&nbsp; &lt;/ResourceDictionary.MergedDictionaries&gt;</p>
<p>&nbsp; &lt;!-- Focus Visual --&gt;</p>
<p>&nbsp; &lt;Style x:Key="ButtonFocusVisual"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Setter Property="Control.Template"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Setter.Value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ControlTemplate&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Border&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Rectangle Margin="5" StrokeThickness="3"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Stroke="#60000000" StrokeDashArray="4 2"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Border&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ControlTemplate&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Setter.Value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/Setter&gt;<br>&nbsp; &lt;/Style&gt;<br>&nbsp; &lt;!--...............--&gt;<br>&lt;/ResourceDictionary&gt;</p>
<p>因为这个XAML文件作为资源使用，所以其根元素是ResourceDictionary，而不再是Window/Application等等。同时，资源文件也可以相互的嵌套，比如上面的包含的Shared.xaml文件。然后定义了一个Style，注意这里的目标类型为Control.Template，也就是针对所有的控件模板有效，所以Style添加了一个x:Key属性。这样就阻止Style适用于当前的所有控件。我们必须显式的引用这个Style。相关内容，可以参考我<a href="http://www.cnblogs.com/YilingLai/archive/2007/01/12/619265.html">前面的Style文章</a>。</p>
<p>另一个需要说明的是&lt;ControlTemplate&gt;的子元素，可以是任何的VisualTree。比如这里的Border，也可以是Grid等等。好了，现在定义了一个名为ButtonFocusVisual的模板，下面只需要引用它即可。</p>
<p>&lt;Style TargetType="Button"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;!--.............--&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;!--.............--&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Setter Property="Template"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Setter.Value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ControlTemplate TargetType="Button"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Border x:Name="Border" ......./&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ControlTemplate.Triggers&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Trigger Property="IsKeyboardFocused" Value="true"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DefaultedBorderBrush}" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Trigger&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ControlTemplate.Triggers&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ControlTemplate&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Setter.Value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/Setter&gt;<br>&lt;/Style&gt;</p>
<p>这是真正影响控件外观的代码。因为在定义Style的时候没有指定具体的x:Key，所以将影响所有的Button。如你所见，在FocusVisualStyle这个属性（类型是Style）上我们用资源方式引用了前面定义的命名Style：ButtonFocusVisual。接下来是定义Template，并为其子元素Border定义了一个名称。然后就是ControlTemplate的触发器。在IsKeyboardFocused属性满足条件的情况下，我们把Border（注意这个Border不是类型，而是具体的某个对象）的BorderBrush修改为另一个静态资源。结合前面的Post，理解也就不难了。</p>
<p>最后，我们还会发现一个有趣的问题：这个例子虽然是ControlTempalte，但工程名称却是SimpleStyle，从这一点我们也可以看出：Style和Template通常是配合使用才能真正的实现丰富的自定义功能。</p>
<img src="http://www.cnblogs.com/YilingLai/aggbug/623892.html?type=1" width="1" height="1" alt=""/><p>评论: 4　<a href="http://www.cnblogs.com/YilingLai/archive/2007/01/18/623892.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/YilingLai/archive/2007/01/18/623892.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56838/" target="_blank">谷歌联合创始人谈Buzz：可以分享实时位置</a><span style="color:gray">(2010-02-10 14:28)</span><br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>