﻿<?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++博客-万星星@完美世界-随笔分类-小作品</title><link>http://www.cppblog.com/wlwlxj/category/611.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>Sat, 08 Sep 2012 13:52:58 GMT</lastBuildDate><pubDate>Sat, 08 Sep 2012 13:52:58 GMT</pubDate><ttl>60</ttl><item><title>richedit研究06 – 高效动画刷新</title><link>http://www.cppblog.com/wlwlxj/archive/2012/09/08/189951.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sat, 08 Sep 2012 10:10:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2012/09/08/189951.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/189951.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2012/09/08/189951.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/189951.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/189951.html</trackback:ping><description><![CDATA[<p>最近工作上比较忙，加之编码任务较多，没来得及继续之前的讲解。抽出时间把这最重要的一部分东西做个阐述。行文以基本的编程思维及个人思考过程为线索。</p>
<p>&nbsp;</p>
<p>众所周知，RichEdir强大在于其图文混排（在这里不跟Word、HTML比），其中的图替换为动态图的核心问题就归结于如何高效刷新。我们知道GDI操作是最消耗CPU的，所以刷新整个RichEdit窗口是不可取的，其副作用会导致更严重的闪烁问题。解决问题的思路很简单：类似于拖拽时候在屏幕绘制异或线，我们的动画重绘时不请求RichEdit，而直接在其窗口的DC上绘制当前动画帧，此时缺少是如何确定该OLE的位置，这个是所有问题的关键。先看下面这幅图：</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/wlwel/240246/o_richedit_animate1.png" alt="" width="538" height="363" /></p>
<p>&nbsp;</p>
<p>假定1-5全部都是GIF图片，非GIF可以暂时无视，这个后面大家会非常清楚如何处理。在这个过程中，2不见了，而4是新出现的。对于4新出现时，RichEdit自身肯定会触发其：</p>
<div class="cnblogs_code">
<pre><span style="color: #000000;">Draw(
    DWORD dwDrawAspect, LONG lindex, </span><span style="color: #0000ff;">void</span>*<span style="color: #000000;"> pvAspect,
    DVTARGETDEVICE</span>*<span style="color: #000000;"> ptd, HDC hicTargetDev, HDC hdcDraw,
    LPCRECTL prcBounds, LPCRECTL prcWBounds,
    BOOL (__stdcall </span>*<span style="color: #000000;">pfnContinue)(DWORD_PTR dwContinue),
    DWORD_PTR dwContinue)</span></pre>
</div>
<p>&nbsp;</p>
<p>这个时候，我们知道新的GIF图片进入可视区，可以把它添加到集合中。对于2的动画触发时间到来时，我们可以确定其位置且与可视区比对，发现其不再可视区，则从集合中移除。这样就可以得到一个接近于（略大于）当前视口中的动画控件集合，当有新的动画触发时间到来时，我们可以先检查其是否在可视区，如果不在则不用GDI操作，仅仅更新其当前帧。当然这些工作你也可以不做，但是在动画控件数量大的时候效率可能略有下降，主要是查找的过程（索引、位置）比较耗时。</p>
<p>&nbsp;</p>
<p>如何确定一个OLE的位置呢？由于我们插入OLE都使用了REO_BELOWBASELINE标志，也就是跟当前行的底部对齐，所以OLE左下角位置的精确度对我们来说很重要。看下图：</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/wlwel/240246/o_richedit_animate2.png" alt="" width="363" height="214" /></p>
<p>假设图中黑框是一个OLE对象，其字符索引为CPN，假定第N+1行的第一个字符索引为CPN1，那么OLE左下角坐标={PosFromChar(CPN).x, PosFromChar(CPN1).y }，PosFromChar这个是RichEdit提供的。问题的关键是最后一行怎么计算？此时没有第N+1行。对于这种特殊情况，主要是Y坐标的计算，可以这样考虑：Y=RichEdit内容高度-滚动条位置。猜测: 计算内容高度可能比较耗时，故QQ的聊天消息显示部分强制在底部加了一行，以避免这种情况出现。</p>
<p>&nbsp;</p>
<p>得到左下角位置以后，可能你会觉得就万事大吉了。错！还有一个关键点！我们可以通过OLE的接口GetExtent得到其大小，然而这个大小没有考虑缩放比例，所以你需要根据当前缩放比例进行计算，而这个计算牵扯到浮点数运算，过程中的来回不仅麻烦而且不精确，所以OLE的可视大小要想非常精确是不能通过计算来的。我们前面知道OLE绘制的时候会传入可视范围，假如我们保存下来是不是就可以解决问题了呢？当然，显然，你可以试试！<br /><br /><span style="font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff; ">这些问题主要原因是RichEdit的很多接口方法没有暴露，而Win8的SDK会做重大升级，很多之前的问题都会变成不是问题，或许还会引起更多的新特性，但是动画本身的逻辑还是需要自己实现，或者会简单许多，至于多少我还尚不清楚，但是目前来看这种方案效率足够！</span>&nbsp;<br /></p>
<p>&nbsp;</p>
<p>到了这里，核心技术应该大白天下，整个过程，我追求了位置的精准度，并据此获得最小可视集合进行刷新优化。</p>
<p>&nbsp;</p>
<p>最新SDK&amp;Demo，参见：<a href="http://code.google.com/p/im-solution/">http://code.google.com/p/im-solution/</a>。希望你会喜欢！</p><img src ="http://www.cppblog.com/wlwlxj/aggbug/189951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2012-09-08 18:10 <a href="http://www.cppblog.com/wlwlxj/archive/2012/09/08/189951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>richedit研究 – 正式版1.0.0发布</title><link>http://www.cppblog.com/wlwlxj/archive/2012/09/06/189750.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Thu, 06 Sep 2012 14:25:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2012/09/06/189750.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/189750.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2012/09/06/189750.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/189750.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/189750.html</trackback:ping><description><![CDATA[最近忙里偷闲对之前的设计做了大量重构，其间转辗反侧体会到过度设计之苦。然而这个产品是我第二用心持续之作，第一的当然是自己商业化盈利产品，实乃无心插柳，感觉这2年自己设计能力进步神速，打算重新架构。前面的x-framework界面框架停止维护许久，深感自责，但是我绝没有放弃信念，卷土重来之日是必须的。<br />
<br />
先谈下richedit我做的工作，主要是参照QQ的功能进行设计，分为2个部分：texthost和richole，前者实现无窗口的richedit，后者实现动画控件。这些东西可以说网上可见的鲜有正确的方法论，很多都是饮鸩止渴之手段，我确信自己的手法是非常科学的。<br />
<br />
目前的实现：<br />
1.动画控件<br />
2.拷贝粘贴：支持QQ互通 &nbsp;支持HTML格式(网页 word等)互通 &nbsp;Shell拖放互通 &nbsp;画图程序的互通<br />
3.窗口、无窗口控件统一操作接口<br />
4.增强的扩展能力<br />
<br />
现有的不足和完善：<br />
1.粘贴网页中图像的下载过程是堵塞式下载<br />
2.炫彩字体完善<br />
3.新闻摘要（仿QQ）OLE实现<br />
<br />
效果图：<br />
<img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_im_richedit_donews.png" alt="" /><br />
<br />
SDK&amp;Demo<a href="http://www.cppblog.com/files/wlwlxj/im_richedit_1.0.0.rar">下载</a><br />
<br />
<br />
无论如何，对现在的设计（架构&amp;稳定性）到达了一个满意效果，最小的依赖和最通用的编码，觉得可以拿出来show一下。如果您有任何建议都可以在下面提出或者给我email（索要源码除外，技术讲解我会尽快展开，按照之前的大纲）。总之一切都是围绕QQ效果实现，为实现IM类聊天展示提供解决方案，武装到牙齿。<img src ="http://www.cppblog.com/wlwlxj/aggbug/189750.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2012-09-06 22:25 <a href="http://www.cppblog.com/wlwlxj/archive/2012/09/06/189750.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>richedit研究 – 拷贝&amp;粘贴初步实现效果</title><link>http://www.cppblog.com/wlwlxj/archive/2012/08/26/188342.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sun, 26 Aug 2012 09:15:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2012/08/26/188342.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/188342.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2012/08/26/188342.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/188342.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/188342.html</trackback:ping><description><![CDATA[<span style="font-size: 14pt; ">花了四天时间，再次对QQ的剪切板格式做了深入研究，对im_richedit做了一次重构使得richframe作为抽象的支持动画功能占位块，派生出richpicture。从基本功能上来讲，可以实现qq消息框的功能。</span><br />
<br />
<span style="font-size: 14pt; ">
我支持的剪贴板格式如下：</span><br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">enum</span>&nbsp;FETCINDEX&nbsp;{<br />
&nbsp;&nbsp;kFETCINDEXUnicode,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Unicode&nbsp;文本</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;kFETCINDEXAnsi,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;ANSI&nbsp;文本</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;kFETCINDEXDIB,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;DIB</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;kFETCINDEXHDROP,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;HDROP</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;kFETCINDEXHTML,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;HTML</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;kFETCINDEXIMRichEdit,&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;自定义格式</span><span style="color: #008000; "><br />
</span>};</div>
<br />
<span style="font-size: 14pt; ">未来打算扩展的OLE类型如下：</span><br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">enum</span>&nbsp;IMRichElementType&nbsp;{<br />
&nbsp;&nbsp;kIMRichElementText,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;字符串</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;kIMRichElementCustomPicture,&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;自定义图片</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;kIMRichElementSystemPicture,&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;系统图片</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;kIMRichElementFancyCharacter&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;炫彩字符</span><span style="color: #008000; "><br />
</span>};</div>
<br />
<span style="font-size: 14pt; ">时间紧张，很多细节处理不完善，上周还初步实现了chromium的windowless版的embed方案，新的一周要努力完善。</span><br />
<br />
<span style="font-size: 14pt; ">
效果图如下（支持HTML拷贝咯！！！）：<br />
</span><br />
<img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_copy_html.png" alt="" /><br />
<br />
<span style="font-size: 14pt; ">执行文件</span><a href="http://www.cppblog.com/files/wlwlxj/copynpaste.rar"><span style="font-size: 14pt; ">下载</span></a><br />
<br />
<span style="font-size: 14pt; ">
技术讲解会在现在特性细节完成后继续。扯点别的，继chrome os的shell放弃web实现后，fb也倾向native app而暂缓html5，似乎给html5泼了一小点冷水。新技术的稳定需要一个过程，而商业公司往往看重的是当前的运营、盈利。当然html5本身仅仅是加入了一些语义、植入了一些sdk，而作为Windows开发者擅长的也是对sdk封装而非语言层面的封装，相比之下，web方面我比较热衷用html5新特性(canvas)来实现UI，而对于原生的html元素拼凑界面有点摸不着门道。</span><img src ="http://www.cppblog.com/wlwlxj/aggbug/188342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2012-08-26 17:15 <a href="http://www.cppblog.com/wlwlxj/archive/2012/08/26/188342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Chrome开源提取的界面开发框架 三(.3)</title><link>http://www.cppblog.com/wlwlxj/archive/2011/09/14/155792.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Wed, 14 Sep 2011 15:45:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2011/09/14/155792.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/155792.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2011/09/14/155792.html#Feedback</comments><slash:comments>24</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/155792.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/155792.html</trackback:ping><description><![CDATA[<div>
<div>新的代码已经上传，请在 https://x-framework.googlecode.com/svn/trunk 更新</div>
<br />
<div></div>
<div>这一次的更新有些仓促，主要是有一些网友希望能早些看到chrome的tab页效果的具体实现，目前来讲还有一些没实现的地方，会导致一些bug，下载代码调试的时候，请忽视异常，勇敢的按下f5，不能正常退出请终止调试或者杀掉进程，任何崩溃不能退出的地方都有可能，仅故学习参考。</div>
<br />
<div></div>
<div>一些截图：</div>
<br />
<div><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_chrome-xp-1.png" alt="" /></div>
<br />
<div><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_chrome-xp-2.png" alt="" /></div>
<br />
<div><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_chrome-win7-1.png" alt="" /></div>
<br />
<div><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_chrome-win7-2.png" alt="" /></div>
<br />
<div></div>
<br />
<div>我认为chrome的架构在三个方面做的非常好：通知系统（线程模型/观察者模式）、preference系统和extension扩展系统，非常具有互联网客户端特征，大部分功能都可以重用。适合搭建互联网客户端平台，然而在中国能驾驭如此全面架构的互联网企业应该也不多，小步跑多迭代需要依赖可靠的平台。其多进程的架构模型，好处自然不用多说，然而需要的架构水平之高恐怕很难在实际开发中真正全部跑起来。</div>
<div><br />
下面是所在团队使用chrome遇到问题时候，我做的一些研究分析，在分析前我对chrome内部的线程对象关系也很模糊，希望对他人有用。<br />
<br />
</div>
<div>chrome在线程和对象之间运作的一些基础技巧，总体来讲使用了三种设施，而不是一刀切，一个不规范的报告如下：</div><br />
<div></div>
<div>&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;</div>
<div>同一线程同一对象的方法异步调用 &nbsp; &nbsp; ScopedRunnableMethodFactory能保证对象自身异步方法调用的安全性</div><br />
<div></div>
<div>同一线程不同对象之间的通知 &nbsp; &nbsp; &nbsp; 调用者派生NotificationObserver，通过NotificationRegistrar把自己注册到通知系统，通知源触发NotificationService &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;订阅模式，线程内同步调用，不存在对象生命周期的问题</div><br />
<div></div>
<div>MessageLoopProxy是线程安全的引用计数对象，内部封装了线程消息循环，MessageLoop销毁的时候会置空其MessageLoopProxy中的消息循环，支持线程安全的异步调用，适合在不同线程之间回调，回调过程是异步的，所以牵扯到的参数必须考虑对象生命周期以及对象方法调用的线程问题。我的想法就是回调的对象最好是生命周期跟application的一致的大对象，充当manager（这也正是一个管理者该做的事情），这样就能维持回调对象的合法性。</div><br />
<div></div>
<div>chrome推荐多使用非线程安全对象，也就是对象方法的执行都在对象创建的线程</div><br />
<div></div>
<div>Application&lt;----------------------------------------------------------</div>
<div>&nbsp; &nbsp;|--------|... &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|</div>
<div>&nbsp; &nbsp;V &nbsp; &nbsp; &nbsp; &nbsp; V &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|</div>
<div>UI线程 &nbsp; &nbsp;文件读写线程 &nbsp; &nbsp; 数据库读写线程 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 网络线程 ... &nbsp; &nbsp; |</div>
<div>UIMgr &nbsp; &nbsp; FileIOMgr &nbsp; &nbsp; &nbsp; &nbsp;DatabaseIOMgr &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NetIOMgr &nbsp; &nbsp; &nbsp; |</div>
<div>Obj... &nbsp; &nbsp; Obj... &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;... &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ... &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|</div>
<div>Obj... &nbsp; &nbsp; Obj... &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;... &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ... &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;---</div>
<div>&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;&#9734;</div>
<div></div>
<div>在chrome中运用最多的是第二种技法，因为本身就没有那么多对象需要跨线程；其次是第三种，因为互联网客户端确实存在不少的多线程数据管理；最后是第一种技法，这种情况较为少见。</div><br />
<div></div>
<div>至于全面详尽的剖析，我没有精力或者暂时没有勇气去整理。后面代码的更新可能也会减缓，自己会考虑在如何使用这套框架做一些东西。</div>
</div><img src ="http://www.cppblog.com/wlwlxj/aggbug/155792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2011-09-14 23:45 <a href="http://www.cppblog.com/wlwlxj/archive/2011/09/14/155792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Chrome开源提取的界面开发框架 三(.2.5)</title><link>http://www.cppblog.com/wlwlxj/archive/2011/09/02/154975.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Fri, 02 Sep 2011 14:32:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2011/09/02/154975.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/154975.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2011/09/02/154975.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/154975.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/154975.html</trackback:ping><description><![CDATA[向Chrome浏览器进军，呵呵，夸张了。<br />
<br />
随着对chrome的基础库的熟悉以及平时的维护，总体上来讲view框架以下的部分基本上稳定。目前变动的主要是硬件加速部分，两个分支：direct2d和opengl，还有就是对touch的支持，最近又引入了aura的一套界面，应该是谷歌收买摩托之后的一些计划，但是具体是什么还不清楚。<br />
<br />
作为基础库学习的最后一个作业，我想实现一个window平台下的chrome界面，可能不是全部特性，但希望能做到尽量吻合。所有的实现会在三(.3)的时候完成，预计期望带上一个webbrowser能勉强浏览网页。其实在最初抽取这套东西的时候，几乎所有人都期望的是chrome的那个能随意拖拉的tab，这次我也希望能实做一个出来。<br />
<br />
本身browser的代码极其大，我也无心恋战，一顿猛砍之后，居然神奇般的能跑起来一个空壳，真的是很欣慰，算是一个中间阶段吧，下面的工作就是整理代码，慢慢恢复一个最小的外壳。目前状况见下图：<br />
<img alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_chrome-1.png" width="636" height="414" /><br />
<br />
之后的下一步打算是弄一套metroui风格的控件，因为chrome的view框架本身对windows控件的封装也不多，实现也不多，但是引擎确实极好，正好适合这一目的。可能会封装出接口api甚至是集成脚本引擎，因为这些上层的东西对于大多数人来讲是喜欢的，他们懒得知道那么多细节，当然可能限制就会多一些。<br />
<br />
======================================================================================<br />
继续：<br />
<img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_chrome-2.png" alt="" /><br />
<br />
前进一步：<br />
<img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_chrome-3.png" alt="" /><br />
<br />
第一个Tab：<br />
<img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_chrome-4.png" alt="" />&nbsp; &nbsp; &nbsp; &nbsp;<img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_chrome-5.png" alt="" /><br />
<br />
<img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_chrome-6.png" alt="" /><br />
<br />
开始支持拖动<br />
<img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_chrome-7.png" alt="" /><br /><br />开始支持拖拽TAB分离<br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_chrome-8.png" width="566" height="237" alt="" /><br /><br />当前release的exe大小为1.98M，静态链接crt，不包含资源dll<img src ="http://www.cppblog.com/wlwlxj/aggbug/154975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2011-09-02 22:32 <a href="http://www.cppblog.com/wlwlxj/archive/2011/09/02/154975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Chrome开源提取的界面开发框架 三(.2)</title><link>http://www.cppblog.com/wlwlxj/archive/2011/08/24/154239.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Wed, 24 Aug 2011 11:49:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2011/08/24/154239.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/154239.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2011/08/24/154239.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/154239.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/154239.html</trackback:ping><description><![CDATA[<div><div><br />svn: https://x-framework.googlecode.com/svn/trunk &nbsp; &nbsp;建议重新下载代码</div><div></div><div><br />很久没有在svn上更新这套库里，但自己有时间的时候都在开发增加功能。这次的更新主要是在对activex的支持，一个界面库若想成为框架，必须具备这种包容性，至少flash /webbrowser等主流的控件还是会经常用到的。这一次主要是实现了无窗口的flash、mediaplay和sl插件，实现了mshtml和webbrowser的容纳，参考有vc的sdk和国外对无窗口activex的研究，目前操纵接口仅仅供run，没有深度的wrapper。</div><div></div><div><br />还有一件事情就是纠正了之前的错误思想，对chrome的基础库私自做了大量修改导致维护更新很麻烦，目前基本上保持了对应，至少我自己跟踪代码的变更还是比较方便。这个过程中自己学到了很多非技术的东西，技术上也看到了google工程师对设计的精益求精。Chrome对顶层窗口的改造部分，我一直有一些说不出的感觉，代码中说了一堆理由阐述为何在下面预留1px的nc区，但是我在之前没有预留的时候反而更好。</div><div></div><div><br />整个工程的结构如下：</div><div></div><div>x-framework</div><div>|</div><div>--bin（可执行程序）</div><div>|</div><div>--examples（示例源码）</div><div>&nbsp; |</div><div>&nbsp; --demos（基础控件展示）</div><div>&nbsp; |</div><div>&nbsp; --desktop（chrome桌面，不知道有何意图）</div><div>&nbsp; |</div><div>&nbsp; --igantt（一个计划的图形产品）</div><div>&nbsp; |</div><div>&nbsp; --net_base_test（暂时无用）</div><div>&nbsp; |</div><div>&nbsp; --status_tray（应用层托盘库，很小）</div><div>&nbsp; |</div><div>&nbsp; --wanui_res（库依赖的资源）</div><div>|</div><div>--lib（框架库）</div><div>|</div><div>--library（库源码）</div><div>&nbsp; |</div><div>&nbsp; --base（基础库，标准算法、字符串、内存工具、统计工具、多线程编程工具、窗口API封装、消息泵等）</div><div>&nbsp; |</div><div>&nbsp; --net_base（暂时无用）</div><div>&nbsp; |</div><div>&nbsp; --skia（skia在windows平台使用的基本封装，主要是设备和位图的转换，支持32位位图）</div><div>&nbsp; |</div><div>&nbsp; --third_party（第三方库）</div><div>&nbsp; |</div><div>&nbsp; --ui_base（作为view库的基础，对windows的消息事件等做了一层封装和扩展）</div><div>&nbsp; |</div><div>&nbsp; --ui_gfx（为view库提供更好地图形封装，点线面路径图像支持、坐标转换支持）</div><div>&nbsp; |</div><div>&nbsp; --view（基于windows的顶层窗口对窗口世界的chrome化，兼容无窗口和有窗口的界面引擎，我增加了一些扩展）</div><div></div><div><br />一些demo截图：</div><div><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_1.png" alt="" /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_sl%E5%8A%A0%E8%BD%BD.png" alt="" /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_3.png" alt="" /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_%E6%B0%94%E6%B3%A1%E7%AA%97%E5%8F%A3%E5%AE%9E%E7%8E%B0.png" alt="" /></div><div></div><div><br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_%E5%8A%A8%E7%94%BB%E6%95%88%E6%9E%9C.png" alt="" /><br /><br />这些示例尽管一眼看上去并不是那么震撼，局限因素不是技术，目前的问题就是控件数量不够丰富，chrome里面无窗口的控件绘制采用了native主题，当然这或许不是我目前非常看重的，它能给开发者提供的便利性才是我追求的。早期版本我也在正式的项目中采用，使用的过程中，掌握了很多技巧，也走了弯路。对于一个强大的库，如果使用的不好可能反而觉得别扭。</div></div><img src ="http://www.cppblog.com/wlwlxj/aggbug/154239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2011-08-24 19:49 <a href="http://www.cppblog.com/wlwlxj/archive/2011/08/24/154239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Chrome开源提取的界面开发框架 三(.1.5)</title><link>http://www.cppblog.com/wlwlxj/archive/2011/06/04/148046.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sat, 04 Jun 2011 05:47:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2011/06/04/148046.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/148046.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2011/06/04/148046.html#Feedback</comments><slash:comments>25</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/148046.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/148046.html</trackback:ping><description><![CDATA[<br />
无窗口richedit的机制基本实现，剩下的是接口调用封装和事件的设计。<br />
<br />
一周的时间添加了无窗口richview，机制上没有采取任何hack方式，完全靠实现ITextHost接口以及作用ITextService接口：<br />
1、支持输入法编辑<br />
2、支持滚动(暂时没有滚动条，待添加!)<br />
3、支持拖拽<br />
<br />
主要参考的示例为微软的例子windowlessre，由于chrome的view自身封装的限制导致实现的时候有许多框架（封装）引入的障碍，为了尽可能少的改动引擎自身，我只做了很少的平台依赖调整，很多时间都消耗在框架机制上。<br />
至于一些颜色、字体、文本操作、ole图片的接口、事件和mvc的抽象在接下来会实现，应该没有太大难度了，确保控件的精细控制和完美解决方案。代码已经上传svn: <a href="http://code.google.com/p/x-framework/">http://code.google.com/p/x-framework/</a>。<br />
<br />
截图：<br />
<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_richview_input.PNG" /><br />
<br />
<br />
实现无窗口的activex控件支持(flash mediaplayer) .net控件 &nbsp;wpf控件<br />
<img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_windowless_flash.png" alt="" /><br />
<br />
<img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_%E9%80%8F%E6%98%8Eflash%E7%AA%97%E5%8F%A3.png" alt="" /><br />
<br />
<br />
<img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_mediaplayer_flash.png" alt="" />
<br />
<br />
花了许久才把activex这块处理完整，实现了无窗口的flash mediaplayer，支持容纳webbrowser以及html文档，至于sl插件的支持也会考虑，下一步会转向无窗口的richedit重构和功能完善：
<br />
<img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_1.png" alt="" />
<br />
<br />
<img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_2.png" alt="" />
<br />
<br />
<img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_3.png" alt="" /><br /><br />sl插件支持：<br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_sl%E5%8A%A0%E8%BD%BD.png" alt="" /><img src ="http://www.cppblog.com/wlwlxj/aggbug/148046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2011-06-04 13:47 <a href="http://www.cppblog.com/wlwlxj/archive/2011/06/04/148046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>移植自2000泄漏代码中的ie部分代码</title><link>http://www.cppblog.com/wlwlxj/archive/2011/06/01/147904.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Wed, 01 Jun 2011 15:58:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2011/06/01/147904.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/147904.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2011/06/01/147904.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/147904.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/147904.html</trackback:ping><description><![CDATA[<div>这份代码在我的硬盘里面静静呆了一年，最起初的研究是想学习改造利用，到了后来发现代码结构并不是很优雅，自己的掌控能力有限，且是商业泄漏代码，所以放弃了继续改造，但是整个移植的过程让我直到今日都受益匪浅。<br /><br />这份代码可以运行跑起来，但不是ie（当时是5.x）的全部。后来有一些人出去好奇想看，我没有给出。微软的代码设计模式用的并不淋漓尽致，但是总可以直击要害。我看到身边的人为了设计模式而用设计模式的时候，写了很多代码控制力并不是很强或者并不是真正的解耦合，我想有必要把这个东西拿出去，希望他们能思考或者反思一些问题。当然，希望你只是出于学习目的，毕竟是泄露的商业代码，我也无暇也不敢去做具体分析，希望不会引出祸端。<br /><br /><a href="http://www.cppblog.com/Files/wlwlxj/Xindows.part01.rar">分卷一</a><br /><a href="http://www.cppblog.com/Files/wlwlxj/Xindows.part02.rar">分卷二</a></div><img src ="http://www.cppblog.com/wlwlxj/aggbug/147904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2011-06-01 23:58 <a href="http://www.cppblog.com/wlwlxj/archive/2011/06/01/147904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Chrome开源提取的界面开发框架 三(.1)</title><link>http://www.cppblog.com/wlwlxj/archive/2011/05/27/147373.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Fri, 27 May 2011 08:17:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2011/05/27/147373.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/147373.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2011/05/27/147373.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/147373.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/147373.html</trackback:ping><description><![CDATA[<div>
<div><br />近期开发计划:</div>
<div></div>
<div>1.无窗口的richedit支持,包括ole图片以及段落支持,这些是IM类必需的组件(已经开始) &nbsp; --预计6月初完成</div>
<div>2.浏览器类组件支持,预计包括webbrowser和webkit,后者近来的需求越来越大,尽管有挑战也要试一试,到时候参考qt &nbsp; --预计6月底完成</div>
<div>3.flash窗口的支持,这个可能有些地方会用到,比较容易 &nbsp; --预计7月初完成</div>
<div></div>
<div>希望大家有好的这方面源码参考或者建议的能给我留言.</div></div>
<div>
<div></div>
<div><br /><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 21px; font-family: verdana, Arial, Helvetica, sans-serif; font-size: 14px" class="Apple-style-span">
<p style="text-indent: 0px; margin: 10px auto">问题：</p>
<p style="text-indent: 0px; margin: 10px auto">1.Chrome中的光标设置依赖于mousemove消息，快速移动鼠标的时候会导致光标状态闪烁，尝试修复为wm_setcursor</p>
<p style="text-indent: 0px; margin: 10px auto">2.Chrome中的NativeTextfieldView输入框非常复杂且处理的不完整，考虑移除用richedit相关接口替换</p>
<p style="text-indent: 0px; margin: 10px auto">随记：</p>
<p style="text-indent: 0px; margin: 10px auto"></p><div><p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px; ">widget是一个窗体的抽象 &nbsp;&nbsp;widget_win是win窗体的实现</p><p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px; ">window引入了非客户区的概念，允许最小化最大化模态等窗体概念 &nbsp;window_win则是其win平台的实现(带有标题栏的)</p></div><p style="text-indent: 0px; margin: 10px auto"></p>
<p style="text-indent: 0px; margin: 10px auto"><br /></p>
<p style="text-indent: 0px; margin: 10px auto">2011.5.29:实现了无窗口richedit的拖拽<br /></p>
<p style="text-indent: 0px; margin: 10px auto">2011.5.30:实现了无窗口richedit的输入编辑<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_%e8%be%93%e5%85%a5%e6%b3%95.PNG" width="476" height="349" /><br /></p></span></span></div></div><img src ="http://www.cppblog.com/wlwlxj/aggbug/147373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2011-05-27 16:17 <a href="http://www.cppblog.com/wlwlxj/archive/2011/05/27/147373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Chrome开源提取的界面开发框架 二(.x)</title><link>http://www.cppblog.com/wlwlxj/archive/2011/04/20/144665.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Wed, 20 Apr 2011 07:27:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2011/04/20/144665.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/144665.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2011/04/20/144665.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/144665.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/144665.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
最近比较忙，各种原因，对界面框架做的工作如下：<br><br>1、维护更新至chromium.r80414<br>2、开始着眼Chrome浏览器架构，框架、插件机制、主题、多进程/线程方面<br>3、工作的目标做了适当延伸，暂时命名x-framework，并尝试模拟实现一个类Chrome的UI作品。<br>4、界面方面进度不大，主要是不断研究、尝试、走弯路和改进过程，临时性的截图：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_theme.png" width=683 height=428> 
<img src ="http://www.cppblog.com/wlwlxj/aggbug/144665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2011-04-20 15:27 <a href="http://www.cppblog.com/wlwlxj/archive/2011/04/20/144665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Chrome开源提取的界面开发框架 二</title><link>http://www.cppblog.com/wlwlxj/archive/2011/04/05/143478.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Tue, 05 Apr 2011 13:25:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2011/04/05/143478.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/143478.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2011/04/05/143478.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/143478.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/143478.html</trackback:ping><description><![CDATA[&nbsp;
<div>
<div>前段时间的工作</div>
<div>1.2d绘图引擎迁移回skia平台</div>
<div>2.跟进到Chrome源码的chromium.r78515版本</div>
<div>3.ScrollView、Menu等UI元素移植</div>
<div>4.修改Chrome的一些Bugs或不足</div>
<div>5.目录的整理、调整</div>
<div>6.开始以教程的形式深入理解整个UI框架, 发现其中的问题, 为下一步扩展打好基础</div>
<div><br></div>
<div>UI库项目的依赖在library\depends.txt</div>
<div>UI库的Bugs在library\bugs.txt</div>
<div>所有不确定的地方在代码中均有WLW TODO标记</div>
<div>之前的test_base test_view项目即将废弃, 不要再尝试编译, 会以教程的形式体现</div>
<div><br></div>
<div>近期工作</div>
<div>跟踪chromium最新源码, 修改Bugs</div>
<div>进一步开发教程, 学习整个框架</div>
<div><br></div>
<div>位图滚动条由于没有合适格式的图片, 暂时无法在教程中体现. 代码稳定之后会考虑放在开源项目网站上或用于公司商业化开发维护, 暂时不确定.</div>
<div><br></div>
<div>教程位于tutorial目录, 其中wanui_res是纯资源DLL, hello_window是基本窗口展示, hello_view是基本View展示.后续会逐步开发所有控件的教程, 在完全理解整个框架之后会进行扩展.<br><br><br>截图：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_test_view.PNG" width=700 height=500><br><br>&nbsp; <img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_hello_window.PNG" width=300 height=300><br><br>&nbsp; <img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_hello_view.PNG" width=386 height=416><br></div>
<br><br><a href="http://www.cppblog.com/Files/wlwlxj/WanUI.rar">代码下载</a></div>
<img src ="http://www.cppblog.com/wlwlxj/aggbug/143478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2011-04-05 21:25 <a href="http://www.cppblog.com/wlwlxj/archive/2011/04/05/143478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Chrome开源提取的界面开发框架 一</title><link>http://www.cppblog.com/wlwlxj/archive/2011/03/23/142612.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Wed, 23 Mar 2011 14:22:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2011/03/23/142612.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/142612.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2011/03/23/142612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/142612.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/142612.html</trackback:ping><description><![CDATA[下一步计划：<div>1、gdiplus-&gt;skia: 之前移植的就是skia，后来觉得开源的skia代码量大且需要额外包含头文件，怕他人觉得麻烦就自己替换了gdiplus.因有人提及，自己也觉得有点画蛇添足，故改回。</div><div>2、更新至最新的的Chrome代码，包括结构的合理性和bug的修改。</div><div>3、ScrollView以及Richedit的ITextHost处理实现无窗口的编辑视图。</div><img src ="http://www.cppblog.com/wlwlxj/aggbug/142612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2011-03-23 22:22 <a href="http://www.cppblog.com/wlwlxj/archive/2011/03/23/142612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Chrome开源提取的界面开发框架开篇</title><link>http://www.cppblog.com/wlwlxj/archive/2011/03/20/142246.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sat, 19 Mar 2011 16:24:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2011/03/20/142246.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/142246.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2011/03/20/142246.html#Feedback</comments><slash:comments>23</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/142246.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/142246.html</trackback:ping><description><![CDATA[&nbsp;
<h1><span>初衷<br></span></h1>
<p><span>一直希望</span><span>VC</span><span>开发者能够方便的开发出细腻高品质的用户界面。我喜欢</span><span>C++</span><span>，选择的平台是</span><span>Windows</span><span>，所以大部分时间用</span><span>VC</span><span>。我自身不排斥其他技术或者开发语言或者开发工具，都去了解，了解的目的是想吸取好的思想补充</span><span>VC</span><span>开发方面的不足。从事界面开发方面的研究有</span><span>5</span><span>年了，学过很多，尝试过很多，失败过很多，但是没有气馁。感谢开源，尤其是谷歌的</span><span>Chrome</span><span>开源，使我再次提高。在论坛和代码网站，都能看到一些界面方面作品，有源码的也有纯欣赏的，大多数一看上去还不错，本地执行就会发现粗糙的地方，不细腻，难以商业化使用。总体来讲，国内很难看到好的界面方面的开源框架，优秀公司也以此为傲，不断引导界面潮流，使得其他一些公司模仿起来都累得喘气。<br></span></p>
<p>&nbsp;<br><span>界面开发跟所有其他开发一样，都是有技术含量的，对于真正研究的人来说应该清楚。我在初期也遇到有人问我：</span><span>xp</span><span>换肤不是挺好嘛？</span><span>vista</span><span>都出来了，还需要换肤嘛？</span><span>win7</span><span>很漂亮，完全不需要额外的界面开发呀？我想一直界面代表了一个企业的标识文化，比如</span><span>qq</span><span>的蓝色以及企鹅，迅雷的动态效果窗口和蜂鸟。有兴趣研究没错，能做好更难得。</span></p>
<p><span>互联网客户端的特点是小巧灵，界面本身比较绚丽，背后依赖的界面引擎很重要。谷歌倾尽所有的开源姿态，是对微软的一种挑衅，在互联网方面我打败了你，在传统桌面上无法打败，把自己优秀的桌面代码开源出去联合所有人来不断孤立你。</span></p>
<p><span>Chrome</span><span>开源牵扯的其他开源达</span><span>30</span><span>多个，几百个工程，一般的开发者想要利用其中的部分功能需要花费一些学习时间，要有移植大项目的经验。这里我做的就是抽取其中的</span><span>view</span><span>部分，做出一个基本的开发框架，斩断过多的牵连，尽量利用</span><span>Windows</span><span>平台的</span><span>sdk</span><span>，希望对渴望学习开发者的或者有能力扩展的公司有用。<br><br><br></span></p>
<h1><span>背景<br></span></h1>
<p><span>界面方面的研究，经过了三个阶段：传统</span><span>Win32</span><span>窗口、</span><span>Win32</span><span>窗口的子类化自绘、无窗口界面开发</span><span>(directui)</span><span>。这三个阶段有交集，大致还是按照时间推移不断提高的。</span></p>
<p><span>第一阶段：</span><span>04-05</span><span>年当时处于研究生实习时期，在导师公司做</span><span>gis</span><span>平台开发，对于界面要求不高，但也有一些定制性开发，那个时期基本上就是上</span><span>codeproject</span><span>，学习常规窗口编程技巧，那些</span><span>api</span><span>能做那些事，会引起什么效果，有那些附带作用，久而久之就知道做一个效果最直接的办法是组合那些</span><span>api</span><span>。当时自绘的工作不多，但是长时间的反复调用控件会让人厌烦，当时看了</span><span>arcgis</span><span>的平台里面开始使用网页做一些界面，限于当时的知识，无法获取研究的途径。后来我知道了一个叫</span><span>BCG</span><span>的界面开发库，从它开始进入了自绘阶段。</span></p>
<p><span>第二阶段：</span><span>06-07</span><span>年一开始是对</span><span>BCG</span><span>界面库的研究，说起这件事，觉得泄露的代码对我国软件开发水平的提高有很大帮助。</span><span>BCG</span><span>界面库在当时模拟的是</span><span>office2003</span><span>界面风格，模拟的很像但它的代码自身并不是非常清晰，模块的划分不一目了然。他在当时是把开源的</span><span>CJLib</span><span>打垮了，不过随后又被</span><span>CJLib</span><span>的商业公司</span><span>Codejoke</span><span>干翻，直至最后跟</span><span>VC8</span><span>的</span><span>mfc</span><span>弱弱联合，仓促间形成一个</span><span>mfcx</span><span>，就现在来看使用的公司很少。</span><span>Codejoke</span><span>的</span><span>xtp</span><span>也是以泄漏的方式才能有机会学到，他的界面组件划分比较合理，代码很清晰，尤其是其中的</span><span>skinframework</span><span>框架，单独拿出来编译一个</span><span>dll</span><span>即可实现常规窗口的换肤，皮肤格式可以和</span><span>xp</span><span>的兼容。也是他，让我彻底放弃常规窗口的子类化自绘的工作，转而是研究他的实现，因为他已经做到极致。后来我</span><span>08</span><span>年的毕业设计也是以他为基础，题目是软件构造方面的，各种形式的界面插件构造软件框架。在这个时候</span><span>qq</span><span>已经向无窗口发展了，这时候我得到了</span><span>directui</span><span>的概念，开始了无窗口界面方面的研究。</span></p>
<p><span>第三阶段：</span><span>07-</span><span>现在。最开始是研究</span><span><a href="http://www.viksoe.dk/code/windowless1.htm">http://www.viksoe.dk/code/windowless1.htm</a></span><span>这个开源，相信很多人都知道也研究过。他抽象了一些无窗口的界面元素，翻译常规窗口消息解释并重新派发给无窗口元素，引入了一些</span><span>ddraw</span><span>特效，当时能接触到这样的代码很兴奋，界面初看起来很震撼，尤其是主界面的动画效果。他也有很明显的缺点：不支持</span><span>unicode</span><span>，</span><span>pretytext</span><span>的计算有问题，本地窗口跟无窗口的布局混合会遮盖。基于他，我做出了自己的第一个界面框架，并应用在公司商业化产品中，可以从这里欣赏：</span><span><a href="http://www.cppblog.com/wlwlxj/archive/2007/08/28/31014.html">http://www.cppblog.com/wlwlxj/archive/2007/08/28/31014.html</a></span><span>。由于他对</span><span>Windows</span><span>的封装和无窗口元素的抽象并不是很强大，所以想要真正的用它做很强大的界面框架有困难，后来看</span><span>qq</span><span>、迅雷的界面，感觉到之前的界面元素并不通用，且缺少动态的能力，有一些想法在这个帖中提及：</span><span><a href="http://hi.baidu.com/wlwel/blog/item/ad08bfc8108ff78dc9176808.html">http://hi.baidu.com/wlwel/blog/item/ad08bfc8108ff78dc9176808.html</a></span><span>。我后来想自己可能需要的是网页那种动态能力的界面，对图形图像的处理，以及界面的动态布局拖拽，我想起手里的</span><span>Win2000</span><span>泄漏代码，于是乎开始了一件疯狂的事情：移植其中的</span><span>ie</span><span>部分代码，只要其中的界面引擎，带上</span><span>css</span><span>和滤镜，支持各种交互事件，这就是我当时的想法。历时</span><span>8</span><span>个月，出来的成果：</span><span><a href="http://www.cppblog.com/wlwlxj/archive/2009/06/28/88695.html">http://www.cppblog.com/wlwlxj/archive/2009/06/28/88695.html</a></span><span>。这一次失败了，没法商业化应用，有很多问题，按钮的焦点有</span><span>1</span><span>像素偏差，</span><span>css</span><span>由于那个</span><span>ie</span><span>版本比较低，非常有限且不规范，滤镜由于一个组件创建不成功且无代码没法使用。整理的代码有</span><span>30</span><span>多兆，代码本身结构不清晰，砍掉的地方也非常多且很乱，最终我也没有能力去继续修改。中间有很多次的放弃，又不服气继续，最终走了下来。这一次研究对我最大的帮助就是在一个巨大的软件代码中，如何找到自己想要的东西，如何大刀阔斧的砍代码。里面就像大观园，技术很全，学到的东西太多太多。后来我意识到网页有网页布局的特点，桌面软件有桌面软件的特点，需要的地方互操作即可。接下来，我又研究了几个月</span><span>comctl32</span><span>部分，最后发现研究</span><span>edit button</span><span>需要走到</span><span>ntuser</span><span>部分，甚至想要朝显卡驱动调用方面走，就打住了，当然也有一些成果：</span><span>http://www.cnblogs.com/wlwel/archive/2010/05/10/1732160.html</span><span>，是一个失败的研究，但是学到了很多东西。有段时间我甚至刻意的躲避界面开发，直到后来接触到</span><span>Chrome</span><span>浏览器，看了他的开源。<br></span></p>
<h1><span><br><br>针对</span><span>Chrome</span><span>开源所做的工作<br></span></h1>
<p><span>Chrome</span><span>开源，主要是抽取其中的</span><span>view</span><span>部分代码，依赖的有他的</span><span>base</span><span>、</span><span>gfx</span><span>、</span><span>skia</span><span>、</span><span>app</span><span>部分，我把</span><span>base</span><span>分成了</span><span>base</span><span>、</span><span>message_framework</span><span>、</span><span>rfc_algorithm</span><span>，</span><span>skia</span><span>用</span><span>gdiplus</span><span>替换合并到</span><span>gfx</span><span>，</span><span>app</span><span>划分到</span><span>animation</span><span>和</span><span>view_framework</span><span>，去掉</span><span>linux</span><span>以及</span><span>mac</span><span>平台的支持部分，去掉了一些不需要的功能比如网页拖拽相关，形成了一个最小的开发框架，并修改了标题栏自绘的一个</span><span>bug</span><span>。Base部分起初想用boost替换，后来发现工作量很大，还是没敢做。截图如下：<br></span></p>
<p><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_snapshoot.PNG" width=516 height=519></p>
<p><span>所有整理代码<a href="http://www.cppblog.com/Files/wlwlxj/library.rar">下载</a>。<br><br><br></span></p>
<h1><span>后续工作<br></span></h1>
<p><span>继续增加控件、功能、修改现有代码中的一些注释的问题。接受所有的批评和建议，但不要人身攻击。希望能看到更多其他人的作品，现在的开源世界太丰富，很多东西不是接触不到，而是肯不肯静下心来研究。</span></p>
<p><span>注：工程是</span><span>2005</span><span>的，额外需要的头文件</span><span>&lt;vsstyle.h&gt; &lt;vssym32.h&gt;</span><span>可以从</span><span>vc2008</span><span>的</span><span>sdk</span><span>中拷贝或者任意其他地方下载。</span><span>2008</span><span>直接转换即可编译。</span></p>
<img src ="http://www.cppblog.com/wlwlxj/aggbug/142246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2011-03-20 00:24 <a href="http://www.cppblog.com/wlwlxj/archive/2011/03/20/142246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>顶层窗口的Skin</title><link>http://www.cppblog.com/wlwlxj/archive/2009/07/09/89606.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Thu, 09 Jul 2009 02:54:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2009/07/09/89606.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/89606.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2009/07/09/89606.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/89606.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/89606.html</trackback:ping><description><![CDATA[网上看见过很多Skin技术，但是以我所见提供代码的真没几个能把细节处理好的，这里我提供一个来接受批评，内存问题应该没有或者很少，如果发现请告诉我一下。<br><br>很久没有摆弄窗口的skin了，上一次做好像还是1、2年前，当时有一些地方处理的不是很好，但是勉强能用。由于升级的需要，界面的技术也得动一下略作表示。根据自己的经验加上同事的前期技术调研加上后面自己的整理，一个比较满意的方案算是出来了，在实现的基础上尽量保证了Windows的基本特性，比如左上角的系统菜单、标题栏的系统菜单，模仿了QQ2008的一个特性：窗口的按钮不在任务栏显示，但可以通过ALT+TAB进行窗口的访问。Skin的通用型上也做了最大化的兼容，active和unactive状态，12个方位贴图，且为主窗口添加的菜单扩展按钮并提供tooltip的支持。当然存在的问题还有待于慢慢发现，暂时是一个满意的方案，当然只包括顶层窗口的Skin，子窗口的将通过其他技术进行解决。题外话：有些人说xp不是有皮肤吗？在Vista、Win7上这种技术还有存在的必要嘛？我自己的认为是一种界面风格代表的可能是一个企业的理念，可能成为企业的标识之一。<br><br>界面预览：<br><img height=400 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_newskin_login.PNG" width=500 border=0><br><br><img height=700 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_newskin_main.PNG" width=280 border=0><br><br><a href="http://www.cppblog.com/files/wlwlxj/src.rar">代码</a><br><br>注：VS2008开发，左键双击登录窗口客户区显示主界面。代码部分修改后可使用，但请不要使用图片资源。 
<img src ="http://www.cppblog.com/wlwlxj/aggbug/89606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2009-07-09 10:54 <a href="http://www.cppblog.com/wlwlxj/archive/2009/07/09/89606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Xindows第一版本快整理完了</title><link>http://www.cppblog.com/wlwlxj/archive/2009/06/28/88695.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sun, 28 Jun 2009 07:26:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2009/06/28/88695.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/88695.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2009/06/28/88695.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/88695.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/88695.html</trackback:ping><description><![CDATA[<br><img height=670 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_Xindows_V1.PNG" width=902 border=0><br><br><img height=499 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_activex.PNG" width=640 border=0><br>&nbsp;&nbsp;&nbsp; 实现了很多东西，还有很多东西未实现，总体来说应该算成功了一小步了。 支持类似网页的大部分css，界面布局，DOM模型、事件。 想支持滤镜、以及activex，之后还需要做一些扩展。 对象接口以及事件现在还没有暴露出去，不知道还需要多久，自己一个人搞得很慢。不过我想慢慢改善慢慢丰富，还是可以做的不错，当然慢慢就成了自己的东西了。<br><br>&nbsp;&nbsp;&nbsp; 可以<a href="http://www.cppblog.com/files/wlwlxj/Xindows2.rar">下载</a>欣赏一下，由于demo写死了一些东西，所以需要放在E盘根目录下面执行。 E:\Xindows2 这样子。 
<img src ="http://www.cppblog.com/wlwlxj/aggbug/88695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2009-06-28 15:26 <a href="http://www.cppblog.com/wlwlxj/archive/2009/06/28/88695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PerfectPM 版本1.2.2内容</title><link>http://www.cppblog.com/wlwlxj/archive/2008/12/19/69785.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Thu, 18 Dec 2008 17:18:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2008/12/19/69785.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/69785.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2008/12/19/69785.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/69785.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/69785.html</trackback:ping><description><![CDATA[<br>1、修改逻辑关系显示在顶部时候出现绘制错误bug<br>2、为Gantt视图增加了一个自定义绘制的好友视图，时间轴与Gantt视图保持一致且视图同步，用来完成额外的资源视图自绘制<br>3、PMGrid增加了excel导出功能<br>4、PMGrid、PMGantt增加图形导出功能（bmp jpeg gif tiff png）<br><br><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_excel.PNG"><br><br><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_P3EC-Grid1.png"><br><br><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_P3EC-Gantt28-4.png"><br><br> <img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_P3EC-Grid26.png"><br><br>  <img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_P3EC-Grid2-7.png"><br><br>  <img src ="http://www.cppblog.com/wlwlxj/aggbug/69785.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-12-19 01:18 <a href="http://www.cppblog.com/wlwlxj/archive/2008/12/19/69785.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PerfectPM 1.2.0即将发布</title><link>http://www.cppblog.com/wlwlxj/archive/2008/10/19/64406.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sun, 19 Oct 2008 05:11:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2008/10/19/64406.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/64406.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2008/10/19/64406.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/64406.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/64406.html</trackback:ping><description><![CDATA[<br>新的版本即将发布。 <br><br>新版本功能：<br>CPMGantt<br>1、背景自定义绘制<br>2、逻辑关系线的自定义绘制<br>3、甘特图的托拽<br>4、界面的假绘制（实现临时效果）<br><br>CPMGraphicsPath：<br>1、路径中开始一个新的图形对象<br><br>CPMDisplay<br>1、修改FillRectLinearGradientBrush和FillPathLinearGradientBrush中渐变色方向内部错误处理<br>2、添加了VertFillRectExLinearGradientBrush实现A-B-A色垂直填充效果<br><br>CPMGrid<br>1、表头点击事件为排序做支持<br><br>CPMGridColInfo<br>1、为每个列对象添加了一组属性值ColProperty<br><br>CPMDocument<br>1、修改VB .NET开发环境启动情况下加载授权文件失败的问题<br>2、实现了排序功能<br><br>目前开发文档初步完成，做起来很麻烦，慢慢完善改进。<br><a href="http://www.cppblog.com/files/wlwlxj/PerfectPMLib.rar">1.1.0开发文档下载</a><br><br>网站托朋友正在做，打算自己也弄一个技术网站推广。<br><br>下面是一个自绘制实现的XGantt效果图：<br><img alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_PerfectPM-1.1.1.PNG" border="0" width="1034" height="589"><br><br>生产排程应用：<br><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_Scheduling.PNG"><br><img src ="http://www.cppblog.com/wlwlxj/aggbug/64406.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-10-19 13:11 <a href="http://www.cppblog.com/wlwlxj/archive/2008/10/19/64406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>甘特图第一版本发布</title><link>http://www.cppblog.com/wlwlxj/archive/2008/09/26/62823.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Fri, 26 Sep 2008 08:25:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2008/09/26/62823.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/62823.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2008/09/26/62823.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/62823.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/62823.html</trackback:ping><description><![CDATA[<p><br>一款甘特图中间件。<br><br>PerfectPM是一套甘特图控件开发包，控件采用ATL+API开发，支持Windows平台所有编程语言(包括脚本语言)，运行在Win2000(包括)以上操作系统上。基于该控件，程序员可以很容易的开发出类似MSProject、P3EC的管理软件。适合于项目管理、生产管理、大修项目。</p>
<p>开发包目前包括：<br>1、PMDocument:文档控件，运行时不可见，主要负责存储数据，是所有控件的基础。<br>2、PMGrid:表格控件，通过表格方式展示文本信息。<br>3、PMGantt:甘特图控件，通过各种图形丰富的展现时间信息。<br>4、PMADOAdapter:ADO数据库适配器，通过ADO方式桥接数据库和PMDocument，缓存关键信息，加速数据加载和信息查询。</p>
<p>目前版本:1.1.0</p>
<p>示例分为VB6,Delphi7,VS2005 C#,VBS版本,由于时间原因,JS以及C++版本没有做.考虑到开发言语的等价性,VB.net示例将不开发.</p>
<p>运行示例前请执行bin目录的reg.bat注册控件(其中SplitterATLControl.dll不属于本产品，VB6 demo中用到)，执行unreg.bat可以注销控件。</p>
<p>如果由于找不到数据库发生错误，请将其他目录下的数据库文件拷贝到本目录。</p>
<p><br>history:</p>
<p>2008-9-15, 1.0.1&#946;<br>1.PMGTLT_CUSTOM类型的时间轴更改为用户自绘制<br>2.PMDisplay接口增加绘制字符串、矩形、路径等功能<br>3.颜色、字体等对象的暴露实现高级绘制<br>4.Gantt增加OnPostDrawNodeSprite,提供精灵绘制完毕后的附加图形信息绘制事件<br>5.C#示例</p>
<p><br>2008-9-21, 1.1.0 release<br>1.增加控件授权机制<br>2.VBS Delphi7示例完成<br>3.第一版本正式发布</p>
<p><br>目前正在编写帮助手册<br>网站将会在10月建设完毕<br><br><br>// 授权:<br>//&nbsp;&nbsp;&nbsp;&nbsp; 企业版:绑定exe,不限制分发数量 (免费技术支持1年)<br>//&nbsp;&nbsp;&nbsp;&nbsp; 价格:<br>//&nbsp;&nbsp;&nbsp;基础控件(PMDocument,PMGrid,PMGantt)&nbsp;2w RMB<br>//&nbsp;&nbsp;&nbsp;扩展控件PMADOAdapter&nbsp;&nbsp;&nbsp;&nbsp;1w RMB</p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp; 个人版:绑定exe,控件底部会显示授权信息 (无技术支持)<br>//&nbsp;&nbsp;&nbsp;&nbsp; 价格:<br>//&nbsp;&nbsp;&nbsp;1k<br><br><br><a href="http://www.cppblog.com/files/wlwlxj/PerfectPM Release 1.10.rar">下载示例以及截图</a></p><img src ="http://www.cppblog.com/wlwlxj/aggbug/62823.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-09-26 16:25 <a href="http://www.cppblog.com/wlwlxj/archive/2008/09/26/62823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web示例开始</title><link>http://www.cppblog.com/wlwlxj/archive/2008/09/16/61991.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Tue, 16 Sep 2008 09:25:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2008/09/16/61991.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/61991.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2008/09/16/61991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/61991.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/61991.html</trackback:ping><description><![CDATA[<br>VBS第一例，因为vb6到vbs的例子转换最简单。<br><img height=708 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_WebVBS-001.PNG" width=1075 border=0><br>&nbsp;<br><br>继续转换一些典型示例：<br><img height=708 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_WebVBS-002.PNG" width=1070 border=0><br><br><img height=685 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_WebVBS-003.PNG" width=562 border=0><br><br><img height=486 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_WebVBS-004.PNG" width=549 border=0> 
<img src ="http://www.cppblog.com/wlwlxj/aggbug/61991.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-09-16 17:25 <a href="http://www.cppblog.com/wlwlxj/archive/2008/09/16/61991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>甘特图1.0.1β发布 </title><link>http://www.cppblog.com/wlwlxj/archive/2008/09/15/61834.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sun, 14 Sep 2008 19:52:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2008/09/15/61834.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/61834.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2008/09/15/61834.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/61834.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/61834.html</trackback:ping><description><![CDATA[<br>很久没有搞到这么晚了，终于把C#示例做完，后面的工作将是不熟悉的Delphi示例以及javascript示例。<br><br>history:<br>2008-9-15, 1.0.1&#946;<br>1.PMGTLT_CUSTOM类型的时间轴更改为用户自绘制<br>2.PMDisplay接口增加绘制字符串、矩形、路径等功能<br>3.颜色、字体等对象的暴露实现高级绘制<br>4.Gantt增加OnPostDrawNodeSprite,提供精灵绘制完毕后的附加图形信息绘制事件<br>5.C#示例<br><br><a href="http://www.cppblog.com/files/wlwlxj/1.01%CE%B2-demo.rar">下载</a> <br><br><img alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_CSharp001.PNG" border="0" height="504" width="729"><br><br><img alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_CSharp002.PNG" border="0">&nbsp;<br><br><img alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_CSharp003.PNG" border="0" height="405" width="556"><br><br><img alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_CSharp004.PNG" border="0" height="405" width="556"><br><br><img alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_CSharp005.PNG" border="0" height="405" width="556"><img src ="http://www.cppblog.com/wlwlxj/aggbug/61834.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-09-15 03:52 <a href="http://www.cppblog.com/wlwlxj/archive/2008/09/15/61834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#示例开始</title><link>http://www.cppblog.com/wlwlxj/archive/2008/09/13/61737.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sat, 13 Sep 2008 03:22:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2008/09/13/61737.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/61737.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2008/09/13/61737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/61737.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/61737.html</trackback:ping><description><![CDATA[<br>开始制作C#示例，一切都还顺利，只是接口转换的地方不太熟悉，老是碰到小问题。<br><br><img height=504 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_CSharp001.PNG" width=729 border=0>
<img src ="http://www.cppblog.com/wlwlxj/aggbug/61737.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-09-13 11:22 <a href="http://www.cppblog.com/wlwlxj/archive/2008/09/13/61737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gantt效果图示例</title><link>http://www.cppblog.com/wlwlxj/archive/2008/09/11/61637.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Thu, 11 Sep 2008 15:54:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2008/09/11/61637.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/61637.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2008/09/11/61637.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/61637.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/61637.html</trackback:ping><description><![CDATA[<br>由于显示组件的暴露，使得控件的图形扩展能力大大加强，用户可以在控件的事件里面很容易的绘制自己的业务逻辑。下面是3副简单的效果图：<br><br><img height=565 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_011.PNG" width=703 border=0><br><br><img alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_012.PNG" border=0><br><br><img alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_013.PNG" border=0>
<img src ="http://www.cppblog.com/wlwlxj/aggbug/61637.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-09-11 23:54 <a href="http://www.cppblog.com/wlwlxj/archive/2008/09/11/61637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>新功能</title><link>http://www.cppblog.com/wlwlxj/archive/2008/09/08/61345.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Mon, 08 Sep 2008 15:21:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2008/09/08/61345.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/61345.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2008/09/08/61345.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/61345.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/61345.html</trackback:ping><description><![CDATA[<br>添加了一些新功能，主要依靠绘制接口方法的提供（对Gdiplus封装）<br><br>1、甘特图时间轴完全自绘制（刻度线等）<br><img height=565 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_006.PNG" width=703 border=0><br><br>2、甘特图视图自定义层绘制（数据线等）<br><img height=602 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_007.PNG" width=867 border=0><br><br>3、视图控件垂直滚动条的隐藏（与常用软件风格差异的一种弥补）<br><img height=602 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_008.PNG" width=867 border=0><br><br>4、多Bar示例以及Bar完全自绘制（生产排程）&nbsp;<br><img height=565 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_009.PNG" width=703 border=0>&nbsp;<br><br>5、精灵绘制完毕事件，可以实现一些辅助信息绘制：<br><img height=565 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_010.PNG" width=703 border=0>
<img src ="http://www.cppblog.com/wlwlxj/aggbug/61345.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-09-08 23:21 <a href="http://www.cppblog.com/wlwlxj/archive/2008/09/08/61345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>甘特图1.0.0β发布</title><link>http://www.cppblog.com/wlwlxj/archive/2008/09/07/61230.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sun, 07 Sep 2008 09:15:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2008/09/07/61230.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/61230.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2008/09/07/61230.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/61230.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/61230.html</trackback:ping><description><![CDATA[<p>Perfect是一套甘特图控件开发包，控件采用ATL+API开发，支持Windows平台所有编程语言(包括脚本语言)，运行在Win2000(包括)以上操作系统上。基于该控件，程序员可以很容易的开发出类似MSProject、P3EC的管理软件。适合于项目管理、生产管理、大修项目。</p>
<p>开发包目前包括：<br>1、PMDocument:文档控件，运行时不可见，主要负责存储数据，是所有控件的基础。<br>2、PMGrid:表格控件，通过表格方式展示文本信息。<br>3、PMGantt:甘特图控件，通过各种图形丰富的展现时间信息。<br>4、PMADOAdapter:ADO数据库适配器，通过ADO方式桥接数据库和PMDocument，缓存关键信息，加速数据加载和信息查询。</p>
<p>目前版本:1.0.0-&#946;，有一部分高级绘制接口暂时没有暴露。</p>
<p>示例采用VB6开发，更多语言的demo将会陆续开发出来。</p>
<p>运行示例前请执行bin目录的reg.bat注册控件(其中SplitterATLControl.dll不属于本产品，demo中用到)，执行unreg.bat可以注销控件。<br><br><a href="http://www.cppblog.com/files/wlwlxj/1.0.0&#946;-demo.rar">下载</a><br><br><img height=563 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_001.PNG" width=692 border=0><br><br><img height=667 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_002.PNG" width=901 border=0><br><br><img height=573 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_003.PNG" width=703 border=0><br><br><img height=610 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_004.PNG" width=867 border=0><br><br><img height=610 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_005.PNG" width=867 border=0><br><br>自定义甘特图表头绘制(全部自定制)：<br><img height=565 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/8028/o_006.PNG" width=703 border=0></p>
<img src ="http://www.cppblog.com/wlwlxj/aggbug/61230.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-09-07 17:15 <a href="http://www.cppblog.com/wlwlxj/archive/2008/09/07/61230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>win32常规窗口Bridge</title><link>http://www.cppblog.com/wlwlxj/archive/2008/01/20/41544.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sun, 20 Jan 2008 15:09:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2008/01/20/41544.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/41544.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2008/01/20/41544.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/41544.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/41544.html</trackback:ping><description><![CDATA[<br>通过窗口过程替换，把win32窗口纳入到布局管理当中，对于Listview，Treeview、edit之类的界面元素使用系统的是非常经济实惠也是有效的方法。对于按钮，fade效果已经实现。效果：<br><img height=500 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_vista.PNG" width=623 border=0><br><br><img height=500 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_skinned.PNG" width=623 border=0><br><br>计划：<br>引入MDI<br>MFC文档结构支持<br>activex控件的host进一步完善<br>.net控件的host以及通信机制进一步完善<br>web控件（由于使用较多）的定制行处理<br>flash控件的通讯机制<br>控件的丰富<br>windows平台窗口skin的彻底解决<br>类似Json结构的Databind<br>脚本引擎的支持<br>窗口特效支持<br>线程支持<br>soap支持<br>设计器（？？？？）<br><br>先想到这么多，有时间就做做，不知道何年何月，唉，忙，最近研究libjingle头都大，线程＋信号，绕来绕去。 
<img src ="http://www.cppblog.com/wlwlxj/aggbug/41544.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-01-20 23:09 <a href="http://www.cppblog.com/wlwlxj/archive/2008/01/20/41544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hook模块加入</title><link>http://www.cppblog.com/wlwlxj/archive/2008/01/05/40433.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Fri, 04 Jan 2008 16:43:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2008/01/05/40433.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/40433.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2008/01/05/40433.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/40433.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/40433.html</trackback:ping><description><![CDATA[<br>化了一天时间，把Hook功能集成进来。但是标准对话框尤其是新版本的OpenFile，还有一点问题，有时间再慢慢解决。.NET示例没做出了，一调试IDE就死，郁闷死了。<br><br>图片：<br><img height=377 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_hook_mfc.PNG" width=576 border=0><br><br><img height=377 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_hook_mfc2.PNG" width=576 border=0>&nbsp;<br><br><br><br>Hook VB<br><img height=381 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_UIHook01.PNG" width=464 border=0> <br><br>Hook OpenDialog<br><img alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_UIHook02.PNG"> <br><br>Hook .NET<br><img alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_UIHook03.PNG">&nbsp;<br><br><br>通过集成Win32窗口，使得控件可以大大的丰富：下面是Tree，描述主要如下：<br>
<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">&lt;</span><span style="COLOR: #800000">Win32CtlBridge&nbsp;</span><span style="COLOR: #ff0000">class</span><span style="COLOR: #0000ff">="SysTreeView32"</span><span style="COLOR: #ff0000">&nbsp;&nbsp;name</span><span style="COLOR: #0000ff">="nettree"</span><span style="COLOR: #0000ff">/&gt;</span></div>
<br><img height=500 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_Win32Bridge.PNG" width=623 border=0>
<img src ="http://www.cppblog.com/wlwlxj/aggbug/40433.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-01-05 00:43 <a href="http://www.cppblog.com/wlwlxj/archive/2008/01/05/40433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>界面库纳入新的窗口风格(Vista)</title><link>http://www.cppblog.com/wlwlxj/archive/2008/01/04/40376.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Thu, 03 Jan 2008 16:43:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2008/01/04/40376.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/40376.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2008/01/04/40376.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/40376.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/40376.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Vista效果窗口&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2008/01/04/40376.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/40376.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-01-04 00:43 <a href="http://www.cppblog.com/wlwlxj/archive/2008/01/04/40376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GUI作品 欣赏</title><link>http://www.cppblog.com/wlwlxj/archive/2007/08/28/31014.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Tue, 28 Aug 2007 05:13:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2007/08/28/31014.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/31014.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2007/08/28/31014.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/31014.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/31014.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: GUI&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2007/08/28/31014.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/31014.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-08-28 13:13 <a href="http://www.cppblog.com/wlwlxj/archive/2007/08/28/31014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Go On</title><link>http://www.cppblog.com/wlwlxj/archive/2007/08/10/29690.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Fri, 10 Aug 2007 06:35:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2007/08/10/29690.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/29690.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2007/08/10/29690.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/29690.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/29690.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: OutlookBar：&nbsp;StackBar &amp;&amp; ImageCanvas：&nbsp;&nbsp;基于OPENGL的实现尝试：&nbsp;3维里面中文字体的处理比较麻烦，dx10开始支持界面控件，不知道是否已经支持中文。dx9以及ogl本身不支持中文，所以需要借助其他辅助库。freetype是不错的字体管理库，用它来处理3维中的中英文会很轻松。&nbsp;&nbsp;OGL...&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2007/08/10/29690.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/29690.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-08-10 14:35 <a href="http://www.cppblog.com/wlwlxj/archive/2007/08/10/29690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可以供把玩的demo</title><link>http://www.cppblog.com/wlwlxj/archive/2007/08/03/29306.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Fri, 03 Aug 2007 08:52:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2007/08/03/29306.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/29306.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2007/08/03/29306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/29306.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/29306.html</trackback:ping><description><![CDATA[<br>提供一个可以供初步把玩的小例子，skin目录是皮肤文件以及描述、res是程序需要的各种资源、gui是界面描述文件(有兴趣可以尝试一下，属性列表是比较稳定的部分ui元素，控件类由于尚不完善没有列出)。程序启动main.xml，你可以修改此文件。 <br><br><a href="http://www.cppblog.com/files/wlwlxj/xui_bin1.rar">下载</a><br><br>截图：<br><br><img alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_xui_10_1.PNG"><br><br><img alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_xui_10_2.PNG"><br><br><img alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_xui_10_3.PNG"><br>&nbsp;<br>只要有控件资源，一个丰富得系统可以很快搭建起来：<br><img height=554 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_xui_10_9.PNG" width=750 border=0><br><br><img height=564 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_xui_10_10.PNG" width=741 border=0><br>&nbsp;<br><img height=554 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_xui_11_1.PNG" width=750 border=0><br><br><img height=554 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_xui_11_2.PNG" width=750 border=0><br><br><img height=554 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_xui_11_3.PNG" width=750 border=0><br><br><img height=554 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_xui_11_4.PNG" width=750 border=0>&nbsp;<br><br>工具栏：<br><img height=500 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_xui_12_1.PNG" width=750 border=0>&nbsp;<br><br>HeaderPanel：<br><img height=500 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_xui_12_2.PNG" width=750 border=0><br>&nbsp;<br>Host DotNet控件：<br><img height=499 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_xui_12_4.PNG" width=745 border=0><br><br><img height=499 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_xui_12_5.PNG" width=745 border=0><br><br><img height=500 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_xui_12_8.PNG" width=750 border=0>
<img src ="http://www.cppblog.com/wlwlxj/aggbug/29306.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-08-03 16:52 <a href="http://www.cppblog.com/wlwlxj/archive/2007/08/03/29306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>