﻿<?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>博客园-白话Programming</title><link>http://www.cnblogs.com/guanjinke/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 06 Jul 2009 16:03:28 GMT</lastBuildDate><pubDate>Mon, 06 Jul 2009 16:03:28 GMT</pubDate><ttl>60</ttl><item><title>再次提笔</title><link>http://www.cnblogs.com/guanjinke/archive/2008/03/05/1092577.html</link><dc:creator>纶巾客</dc:creator><author>纶巾客</author><pubDate>Wed, 05 Mar 2008 13:37:00 GMT</pubDate><guid>http://www.cnblogs.com/guanjinke/archive/2008/03/05/1092577.html</guid><wfw:comment>http://www.cnblogs.com/guanjinke/comments/1092577.html</wfw:comment><comments>http://www.cnblogs.com/guanjinke/archive/2008/03/05/1092577.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/guanjinke/comments/commentRss/1092577.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/guanjinke/services/trackbacks/1092577.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;Blog荒废很久了，算算看差不多有10个月没有在园子里写文章了。去年真的太忙了，好几个项目需要同时上线，所以很多朋友的提问都没有来得及回复，给大家说声抱歉。<br />
&nbsp;&nbsp;&nbsp;&nbsp;最近琢磨着应该写一些新东西了。从大家的留言来看，大家还是对控件的开发很感兴趣的，我打算做一个图像的显示和编辑控件，演示一些控件制作中细节技术。
<img src ="http://www.cnblogs.com/guanjinke/aggbug/1092577.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48008/" target="_blank">IBM发布全球首款开源智能编译器</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>构建插件式的应用程序框架(八)－－－－视图服务的简单实现</title><link>http://www.cnblogs.com/guanjinke/archive/2007/05/14/746481.html</link><dc:creator>纶巾客</dc:creator><author>纶巾客</author><pubDate>Mon, 14 May 2007 15:29:00 GMT</pubDate><guid>http://www.cnblogs.com/guanjinke/archive/2007/05/14/746481.html</guid><wfw:comment>http://www.cnblogs.com/guanjinke/comments/746481.html</wfw:comment><comments>http://www.cnblogs.com/guanjinke/archive/2007/05/14/746481.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cnblogs.com/guanjinke/comments/commentRss/746481.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/guanjinke/services/trackbacks/746481.html</trackback:ping><description><![CDATA[<p>       我在前一篇文章里提到，对于停靠工具栏或者是视图最好是不要将实例放到词典中，而是将工具栏或者视图的类型放到词典中，因为视图类型会经常的被重用，并且会经常被关闭或者再打开。当实例被关闭后，资源就被释放了，对于实例的管理就会比较麻烦，所以我们分为两步走。在插件被加载的时候，我们只注册类型，在应用程序运行的时候，我们通过某种途径来实例化他。<br/>       我修改的以前的例子，主要突出本次演示的功能。这次的例子实现的功能是通过插件扩展应用程序处理不同文件的能力。在原始的应用程序中，我们可以通过File菜单的Open，只能打开一种文件，就是文本文件，大家可以在例子中看到，当我们没有加载插件的情况下，在OpenFileDialog的Filter中只有"Text（*.txt）"。选择一个文本文件以后，将会出现文本文件视图。当我们加载插件以后，在点击File-&gt;Open菜单，我们观察Filter，发现会多出两种文件："JPEG"和"BMP"，这是我们就可以打开图片文件，选中文件以后，将会出现Picture视图，并且在主菜单下边，还会出现一个工具栏，点击工具栏上的按钮，可以给图片加上水印，并且工具栏会根据PictureView的状态（Active）显示和消失。比如你打开了一个文本视图和一个图片视图，当你切换到文本视图的时候，工具栏就会消失，再切换到图片视图的时候，工具栏又会出现。<br/>       我在框架里面添加了一个IDocumentViewService的接口，用以描述服务的功能：
</p><p style="background: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt=""/><span style="font-size:10pt"><span style="color:blue">using</span><span style="color:black"> System;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt=""/></span><span style="color:blue">using</span><span style="color:black"> System.Collections.Generic;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt=""/></span><span style="color:blue">using</span><span style="color:black"> System.Text;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt=""/></span><span style="color:blue">using</span><span style="color:black"> System.Collections.Specialized;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt=""/></span><span style="color:blue">namespace</span><span style="color:black"> PluginFramework<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" alt=""/><img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>    </span><span style="color:blue">public</span><span style="color:black"> </span><span style="color:blue">interface</span><span style="color:black"> IDocumentViewService<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>    <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        </span><span style="color:blue">void</span><span style="color:black"> RegisterView(String fileType,</span><span style="color:blue">string</span><span style="color:black"> fileFilter,Type viewType);<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        </span><span style="color:blue">void</span><span style="color:black"> ShowView(String fileType, String filePath);<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        </span><span style="color:blue">void</span><span style="color:black"> RemoveRegister(String fileType);<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        String GetFileFilter(String fileType);<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        String GetFileTypeByFileFilter(String fileFilter);<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>        StringCollection FileTypies <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{ </span><span style="color:blue">get</span><span style="color:black">;}<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>    }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt=""/>}<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt=""/></span>
		</span></p><p><br/><span style="font-size:10pt"><span style="font-family:Times New Roman">     </span><span style="font-family:宋体">下面是这个服务的实现：</span><span style="font-family:Times New Roman">
			</span></span></p><p style="background: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt=""/><span style="font-family:Times New Roman; font-size:10pt"><span style="color:blue">using</span><span style="color:black"> System;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt=""/></span><span style="color:blue">using</span><span style="color:black"> System.Collections.Generic;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt=""/></span><span style="color:blue">using</span><span style="color:black"> System.Text;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt=""/></span><span style="color:blue">using</span><span style="color:black"> System.Collections.Specialized;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt=""/></span><span style="color:blue">namespace</span><span style="color:black"> PluginFramework<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" alt=""/><img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>    </span><span style="color:blue">public</span><span style="color:black"> </span><span style="color:blue">class</span><span style="color:black"> DocumentViewService:IDocumentViewService<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>    <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        </span><span style="color:blue">private</span><span style="color:black"> Dictionary&lt;String, Type&gt; docViewRegister = </span><span style="color:blue">new</span><span style="color:black"> Dictionary&lt;</span><span style="color:blue">string</span><span style="color:black">, Type&gt;();<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        </span><span style="color:blue">private</span><span style="color:black"> Dictionary&lt;String, String&gt; fileTypeToFileFilter = </span><span style="color:blue">new</span><span style="color:black"> Dictionary&lt;</span><span style="color:blue">string</span><span style="color:black">, </span><span style="color:blue">string</span><span style="color:black">&gt;();<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        </span><span style="color:blue">private</span><span style="color:black"> Dictionary&lt;String, String&gt; fileFilterToFileType = </span><span style="color:blue">new</span><span style="color:black"> Dictionary&lt;</span><span style="color:blue">string</span><span style="color:black">, </span><span style="color:blue">string</span><span style="color:black">&gt;();<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        </span><span style="color:blue">private</span><span style="color:black"> IApplication application = </span><span style="color:blue">null</span><span style="color:black">;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        </span><span style="color:blue">public</span><span style="color:black"> DocumentViewService(IApplication app)<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>        <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>            application = app;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>        }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/>        </span><span style="background-color:white">IDocumentViewService Members</span><span style="color:blue">#region</span><span style="color:black"> IDocumentViewService Members<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        </span><span style="color:blue">public</span><span style="color:black"> </span><span style="color:blue">void</span><span style="color:black"> RegisterView(</span><span style="color:blue">string</span><span style="color:black"> fileType, </span><span style="color:blue">string</span><span style="color:black"> fileFilter, Type viewType)<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>        <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>            docViewRegister[fileType] = viewType;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>            fileTypeToFileFilter[fileType] = fileFilter.ToUpper();<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>            fileFilterToFileType[fileFilter.ToUpper()] = fileType;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>        }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        </span><span style="color:blue">public</span><span style="color:black"> </span><span style="color:blue">void</span><span style="color:black"> ShowView(</span><span style="color:blue">string</span><span style="color:black"> fileType, </span><span style="color:blue">string</span><span style="color:black"> filePath)<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>        <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>            </span><span style="color:blue">if</span><span style="color:black">(docViewRegister.ContainsKey(fileType))<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>            <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>                IDocumentView docView = </span><span style="color:blue">null</span><span style="color:black">;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>                </span><span style="color:blue">try</span><span style="color:black"><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>                <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>                    docView = (IDocumentView)Activator.CreateInstance(docViewRegister[fileType]);<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>                    docView.Application = application;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>                    docView.ShowView(filePath);<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>                }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>                </span><span style="color:blue">catch</span><span style="color:black"><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>                <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>                    <br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>                }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>                <br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>            }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>        }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        </span><span style="color:blue">public</span><span style="color:black"> </span><span style="color:blue">void</span><span style="color:black"> RemoveRegister(</span><span style="color:blue">string</span><span style="color:black"> fileType)<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>        <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>            docViewRegister.Remove(fileType);<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>        }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        </span><span style="color:blue">public</span><span style="color:black"> StringCollection FileTypies<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>        <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>            </span><span style="color:blue">get</span><span style="color:black"><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>            <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>                StringCollection sc = </span><span style="color:blue">new</span><span style="color:black"> StringCollection();<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>                </span><span style="color:blue">foreach</span><span style="color:black"> (String key </span><span style="color:blue">in</span><span style="color:black"> docViewRegister.Keys)<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>                <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>                    sc.Add(key);<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>                }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>                </span><span style="color:blue">return</span><span style="color:black"> sc;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>            }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>        }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>        </span><span style="color:blue">#endregion</span><span style="color:black"><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/>        </span><span style="background-color:white">IDocumentViewService Members</span><span style="color:blue">#region</span><span style="color:black"> IDocumentViewService Members<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        </span><span style="color:blue">public</span><span style="color:black"> </span><span style="color:blue">string</span><span style="color:black"> GetFileFilter(</span><span style="color:blue">string</span><span style="color:black"> fileType)<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>        <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>            String result = "";<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>            </span><span style="color:blue">if</span><span style="color:black"> (fileTypeToFileFilter.ContainsKey(fileType))<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>            <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>                result = fileTypeToFileFilter[fileType];<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>            }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>            </span><span style="color:blue">return</span><span style="color:black"> result;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>        }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>        </span><span style="color:blue">#endregion</span><span style="color:black"><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/>        </span><span style="background-color:white">IDocumentViewService Members</span><span style="color:blue">#region</span><span style="color:black"> IDocumentViewService Members<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>        </span><span style="color:blue">public</span><span style="color:black"> </span><span style="color:blue">string</span><span style="color:black"> GetFileTypeByFileFilter(</span><span style="color:blue">string</span><span style="color:black"> fileFilter)<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>        <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>            String result = "";<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>            </span><span style="color:blue">if</span><span style="color:black"> (fileFilterToFileType.ContainsKey(fileFilter))<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt=""/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" alt=""/>            <img src="http://www.cnblogs.com/Images/dot.gif" alt=""/>{<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>                result = fileFilterToFileType[fileFilter];<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>            }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/>            </span><span style="color:blue">return</span><span style="color:black"> result;<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>        }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt=""/><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>        </span><span style="color:blue">#endregion</span><span style="color:black"><br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt=""/>    }<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt=""/>}<br/><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt=""/></span>
		</span></p><p><span style="font-size:10pt"><span style="font-family:Times New Roman">      </span><span style="font-family:宋体">时间比较紧，写的比较粗糙。另外定义了</span><span style="font-family:Times New Roman">DocumentView</span><span style="font-family:宋体">的基本功能，就是需要打开的文件的路径，以及显示的方法。再插件了，我实现的一个</span><span style="font-family:Times New Roman">PictureView</span><span style="font-family:宋体">，为两种文件注册了这个视图类型，大家可以根据自己的需要继续扩展。转眼又十一点多了，明天还要上班，就写到这里了，又说的不清楚的地方，大家可以参考一下源代码。</span><span style="font-family:Times New Roman"><br/>   <a href="http://www.cnblogs.com/Files/guanjinke/PluginSample8.rar" title="源代码"/></span><span style="font-family:宋体">源代码</span></span></p><img src ="http://www.cnblogs.com/guanjinke/aggbug/746481.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48007/" target="_blank">IE颓势不减 微软下月公布最新浏览器架构</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>WinForm控件开发总结(十二)-----让控件处理导航键</title><link>http://www.cnblogs.com/guanjinke/archive/2007/05/11/743464.html</link><dc:creator>纶巾客</dc:creator><author>纶巾客</author><pubDate>Fri, 11 May 2007 14:51:00 GMT</pubDate><guid>http://www.cnblogs.com/guanjinke/archive/2007/05/11/743464.html</guid><wfw:comment>http://www.cnblogs.com/guanjinke/comments/743464.html</wfw:comment><comments>http://www.cnblogs.com/guanjinke/archive/2007/05/11/743464.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cnblogs.com/guanjinke/comments/commentRss/743464.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/guanjinke/services/trackbacks/743464.html</trackback:ping><description><![CDATA[摘要: 最近真的真的太忙了，以至于一个多月都没哟更新我的blog。昨天晚上，一个网上的朋友看了我的ToolBox的文章，问我一个问题，他说如何让ToolBox控件也能响应键盘操作，也就是用Up，down按键来选择工具箱控件里的Item，他添加了键盘事件，但是不起作用。一开始做这个控件的时候也只是演示一下控件的制作过程，只用了很短的时间做了一个，只考虑了用鼠标选取，没有考虑键盘操作，我想要添加键盘操作无非重&nbsp;&nbsp;<a href='http://www.cnblogs.com/guanjinke/archive/2007/05/11/743464.html'>阅读全文</a><img src ="http://www.cnblogs.com/guanjinke/aggbug/743464.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48002/" target="_blank">竞争日趋激烈 微软欲借 Windows 7 扭转战局</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>构建插件式的应用程序框架(七)－－－－基本服务</title><link>http://www.cnblogs.com/guanjinke/archive/2007/03/26/689245.html</link><dc:creator>纶巾客</dc:creator><author>纶巾客</author><pubDate>Mon, 26 Mar 2007 15:27:00 GMT</pubDate><guid>http://www.cnblogs.com/guanjinke/archive/2007/03/26/689245.html</guid><wfw:comment>http://www.cnblogs.com/guanjinke/comments/689245.html</wfw:comment><comments>http://www.cnblogs.com/guanjinke/archive/2007/03/26/689245.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cnblogs.com/guanjinke/comments/commentRss/689245.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/guanjinke/services/trackbacks/689245.html</trackback:ping><description><![CDATA[摘要: 既然做好了框架，我们就希望为某个目标服务，我们要提供一些基本的服务，方便用户继续扩展他的功能。首先想到的功能就是，菜单，工具栏的管理，接下来我们要实现一些更流行的功能，比如停靠工具栏等等。 如何实现这些服务呢？我们希望我们的插件在运行时可以获得应用程序本身的菜单，工具条，停靠工具栏等等，然后向他们添加项目，比如加入一个菜单项，添加一个工具栏按钮。为了在运行时获得某个菜单或者工具栏，我们要为每一个菜&nbsp;&nbsp;<a href='http://www.cnblogs.com/guanjinke/archive/2007/03/26/689245.html'>阅读全文</a><img src ="http://www.cnblogs.com/guanjinke/aggbug/689245.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48001/" target="_blank">上海电信计划2012年80%用户实现100M带宽</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>构建插件式的应用程序框架(六)－－－－通讯机制</title><link>http://www.cnblogs.com/guanjinke/archive/2007/03/14/675188.html</link><dc:creator>纶巾客</dc:creator><author>纶巾客</author><pubDate>Wed, 14 Mar 2007 14:43:00 GMT</pubDate><guid>http://www.cnblogs.com/guanjinke/archive/2007/03/14/675188.html</guid><wfw:comment>http://www.cnblogs.com/guanjinke/comments/675188.html</wfw:comment><comments>http://www.cnblogs.com/guanjinke/archive/2007/03/14/675188.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cnblogs.com/guanjinke/comments/commentRss/675188.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/guanjinke/services/trackbacks/675188.html</trackback:ping><description><![CDATA[<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前天发了</span><strong><span><a href="http://www.cnblogs.com/guanjinke/archive/2007/03/12/672454.html"><span><span>构建插件式的应用程序框架</span></span><span>(</span><span><span>五</span></span><span>)</span><span><span>－－－－管理插件</span></span></a></span></strong><strong><span>这篇文章，有几个朋友在回复中希望了解插件之间是如何通讯的。<br></span></strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个系列的文章写到这里，也该谈谈这个问题了，毕竟已经有了插件管理。不知道大家有没有注意到我在第四篇文章里谈到的服务容器（</span><span>Service Container</span><span>），</span><span>Service</span><span>是我所提到的插件式的应用程序框架的基础，我们也可以回头看看</span><span>IApplication</span><span>的接口定义</span><span>,IApplication</span><span>是派生于</span><span>IServiceContainer</span><span>。我把应用程序提供的相关的功能抽象成一个一个的</span><span>Service</span><span>，比如文档管理的，我们就抽象成</span><span>IDocumentService</span><span>，停靠工具栏管理功能抽象成</span><span>IDockBarService</span><span>，菜单管理的功能抽象成</span><span>IMenuService</span><span>，等等。我在第四篇文章里也提到了&#8220;我们在使用</span><span>Service</span><span>架构的时候，总是倾向于有一个根容器，各个</span><span>Service</span><span>容器构成了一个</span><span>Service</span><span>容器树，每一个节点的服务都可以一直向上传递，直到根部，而每一个节点请求</span><span>Service</span><span>的时候，我们总是可以从根节点获得。我把这个根节点比喻成一个服务中心，它汇总了所有可提供的服务，当某个对象要请求服务（</span><span>GetService</span><span>）只需要向根结点发送要获得的服务，根结点就可以把服务的对象传递给它。&#8221;<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IApplication</span><span>是从</span><span>IServiceContainer</span><span>接口派生出来的，而我们的应用程序主窗口又是从</span><span>IApplication</span><span>接口派生出来的，所以，我们的应用程序主窗口就是一个</span><span>ServiceContainer</span><span>。从</span><span>IPlugin</span><span>的定义来看，它有一个</span><span>IApplication</span><span>接口属性，这个</span><span>IApplication</span><span>属性是什么时候指定的呢，在第五篇文章的源代码里我们看到，当每一个</span><span>Plugin</span><span>被实例化的时候，由</span><span>PluginService</span><span>指定的，所以在每一个</span><span>Plugin</span><span>被</span><span>Load</span><span>之前，</span><span>IApplication</span><span>已经被指定，而代表这个</span><span>IApplication</span><span>接口的实例正是我们的应用程序主窗口，而它正是我们所需要的服务容器。一旦我们能够获得</span><span>IApplication</span><span>实例，我们就可以获得整个应用程序所提供的所有的服务。假设我们要获得文档服务，就可以使用</span><span>Plugin</span><span>的</span><span>Application.GetService(typeof(IdocumentService))</span><span>来得到文档服务的实例，接着我们就可以使用这个实例来完成某项功能，比如添加一个新文档等等，其实在第五篇文章的源代码就有这样代码：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CheckExistedPlugin()<br><img id=Codehighlighter1_42_648_Open_Image onclick="this.style.display='none'; Codehighlighter1_42_648_Open_Text.style.display='none'; Codehighlighter1_42_648_Closed_Image.style.display='inline'; Codehighlighter1_42_648_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_42_648_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_42_648_Closed_Text.style.display='none'; Codehighlighter1_42_648_Open_Image.style.display='inline'; Codehighlighter1_42_648_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_42_648_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_42_648_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPluginService&nbsp;pluginService&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(IPluginService)application.GetService(</span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">(IPluginService));<br><img src="http://www.cnblogs.com/Images/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">&nbsp;(pluginService&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_202_638_Open_Image onclick="this.style.display='none'; Codehighlighter1_202_638_Open_Text.style.display='none'; Codehighlighter1_202_638_Closed_Image.style.display='inline'; Codehighlighter1_202_638_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_202_638_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_202_638_Closed_Text.style.display='none'; Codehighlighter1_202_638_Open_Image.style.display='inline'; Codehighlighter1_202_638_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_202_638_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_202_638_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;nameList</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;pluginNames&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pluginService.GetAllPluginNames();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nameList.AddRange(pluginNames);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000">&nbsp;(ListViewItem&nbsp;item&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;listView1.Items)<br><img id=Codehighlighter1_463_624_Open_Image onclick="this.style.display='none'; Codehighlighter1_463_624_Open_Text.style.display='none'; Codehighlighter1_463_624_Closed_Image.style.display='inline'; Codehighlighter1_463_624_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_463_624_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_463_624_Closed_Text.style.display='none'; Codehighlighter1_463_624_Open_Image.style.display='inline'; Codehighlighter1_463_624_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_463_624_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_463_624_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(nameList.Contains(item.Text))<br><img id=Codehighlighter1_539_606_Open_Image onclick="this.style.display='none'; Codehighlighter1_539_606_Open_Text.style.display='none'; Codehighlighter1_539_606_Closed_Image.style.display='inline'; Codehighlighter1_539_606_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_539_606_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_539_606_Closed_Text.style.display='none'; Codehighlighter1_539_606_Open_Image.style.display='inline'; Codehighlighter1_539_606_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_539_606_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_539_606_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.Checked&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-no-proof: yes; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当然，要在插件中获得实例，你必须在应用程序里或者其他插件里实例化服务对象，然后添加到服务容器里，还拿上边的例子，我们在应用程序里实例化了</span><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-no-proof: yes; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">PluginService</span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-no-proof: yes; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">，然后添加到了容器里，代码如下：<br>&nbsp;&nbsp;&nbsp;
<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.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;MainForm()<br><img id=Codehighlighter1_34_212_Open_Image onclick="this.style.display='none'; Codehighlighter1_34_212_Open_Text.style.display='none'; Codehighlighter1_34_212_Closed_Image.style.display='inline'; Codehighlighter1_34_212_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_34_212_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_34_212_Closed_Text.style.display='none'; Codehighlighter1_34_212_Open_Image.style.display='inline'; Codehighlighter1_34_212_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_34_212_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_34_212_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pluginService&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;PluginService(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serviceContainer.AddService(</span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">(IPluginService),&nbsp;pluginService);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;稍后，我会继续完善这个例子，做一个简单的多文档编辑器来做演示，并提供一些基础的服务，以便大家阅读。</span></p>
</span></span><img src ="http://www.cnblogs.com/guanjinke/aggbug/675188.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48000/" target="_blank">数万名网友签名抗议星际争霸2取消局域网功能</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>构建插件式的应用程序框架目录</title><link>http://www.cnblogs.com/guanjinke/archive/2007/03/14/675109.html</link><dc:creator>纶巾客</dc:creator><author>纶巾客</author><pubDate>Wed, 14 Mar 2007 13:36:00 GMT</pubDate><guid>http://www.cnblogs.com/guanjinke/archive/2007/03/14/675109.html</guid><wfw:comment>http://www.cnblogs.com/guanjinke/comments/675109.html</wfw:comment><comments>http://www.cnblogs.com/guanjinke/archive/2007/03/14/675109.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/guanjinke/comments/commentRss/675109.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/guanjinke/services/trackbacks/675109.html</trackback:ping><description><![CDATA[摘要: &nbsp;&nbsp;<a href='http://www.cnblogs.com/guanjinke/archive/2007/03/14/675109.html'>阅读全文</a><img src ="http://www.cnblogs.com/guanjinke/aggbug/675109.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48000/" target="_blank">数万名网友签名抗议星际争霸2取消局域网功能</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>WinForm控件开发总结目录</title><link>http://www.cnblogs.com/guanjinke/archive/2007/03/14/675103.html</link><dc:creator>纶巾客</dc:creator><author>纶巾客</author><pubDate>Wed, 14 Mar 2007 13:32:00 GMT</pubDate><guid>http://www.cnblogs.com/guanjinke/archive/2007/03/14/675103.html</guid><wfw:comment>http://www.cnblogs.com/guanjinke/comments/675103.html</wfw:comment><comments>http://www.cnblogs.com/guanjinke/archive/2007/03/14/675103.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/guanjinke/comments/commentRss/675103.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/guanjinke/services/trackbacks/675103.html</trackback:ping><description><![CDATA[摘要: 把这个系列的文章整理出来，方便大家阅读。&nbsp;&nbsp;<a href='http://www.cnblogs.com/guanjinke/archive/2007/03/14/675103.html'>阅读全文</a><img src ="http://www.cnblogs.com/guanjinke/aggbug/675103.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48000/" target="_blank">数万名网友签名抗议星际争霸2取消局域网功能</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>构建插件式的应用程序框架(五)－－－－管理插件</title><link>http://www.cnblogs.com/guanjinke/archive/2007/03/12/672454.html</link><dc:creator>纶巾客</dc:creator><author>纶巾客</author><pubDate>Mon, 12 Mar 2007 14:55:00 GMT</pubDate><guid>http://www.cnblogs.com/guanjinke/archive/2007/03/12/672454.html</guid><wfw:comment>http://www.cnblogs.com/guanjinke/comments/672454.html</wfw:comment><comments>http://www.cnblogs.com/guanjinke/archive/2007/03/12/672454.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cnblogs.com/guanjinke/comments/commentRss/672454.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/guanjinke/services/trackbacks/672454.html</trackback:ping><description><![CDATA[摘要: 我们现在已经搭建了插件式的应用程序框架，接下来的工作就是要充实框架的内容，提供基本的服务，也就是Service。我想首要的任务就是提供插件的管理服务，我在前面的文章也提到了，要实现动态加载必须要知道插件寄宿在哪里，哪些要加载，哪些不加载，这些就是这篇文章要讨论的问题。 首先解决的就是插件放在什么地方，我采取的传统的方法，将插件放到应用程序所在目录下的制定目录，我会在应用程序所在的目录下创建一个文件&nbsp;&nbsp;<a href='http://www.cnblogs.com/guanjinke/archive/2007/03/12/672454.html'>阅读全文</a><img src ="http://www.cnblogs.com/guanjinke/aggbug/672454.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47999/" target="_blank">Silverlight打造杰克逊纪念专题</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>WinForm控件开发总结(十一)-----调试控件的设计时行为</title><link>http://www.cnblogs.com/guanjinke/archive/2007/01/23/628311.html</link><dc:creator>纶巾客</dc:creator><author>纶巾客</author><pubDate>Tue, 23 Jan 2007 12:49:00 GMT</pubDate><guid>http://www.cnblogs.com/guanjinke/archive/2007/01/23/628311.html</guid><wfw:comment>http://www.cnblogs.com/guanjinke/comments/628311.html</wfw:comment><comments>http://www.cnblogs.com/guanjinke/archive/2007/01/23/628311.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cnblogs.com/guanjinke/comments/commentRss/628311.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/guanjinke/services/trackbacks/628311.html</trackback:ping><description><![CDATA[<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前面的一些文章绝大部分都是要讲控件的设计时的行为，既然涉及到这么多的设计时行为的代码编写，那么就有必要就一下如何来调试控件的设计行为。<br></span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>调试控件的设计时行为和调试</span><span>DLL</span><span>的方式非常的相似，因为</span><span>DLL</span><span>是不能够单独运行的，而一般的控件也会在一个</span><span>DLL</span><span>里。当然如果你不考虑类的可复用性而把控件写在一个</span><span>Windows Application</span><span>里面也无可厚非，这样调试倒也变的简单了。但是我们还是要考虑更通常的情况。一般来说，我们调试</span><span>DLL</span><span>时，都是创建一个可独立运行的应用程序，在这个应用程序里引用你希望调试的</span><span>DLL</span><span>工程，在</span><span>DLL</span><span>工程的代码里设置断点，然后调试。所以，调试这一类东西，首要的问题就是找到一个调用它的宿主。调试控件的设计时行为什么样的宿主最好呢，当然是</span><span>Visual studio</span><span>了，</span><span>visual studio</span><span>里提供了非常全面的设计时支持。下来我就来演示一下具体的做法。<br></span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>首先将你要测试的控件所在的工程设为启动工程。在</span><span>Solution Explorer</span><span>里右键点击控件所在的工程，在菜单里选择属性（</span><span>Properties</span><span>）进入工程属性设置界面，点击&#8220;</span><span>Debug</span><span>&#8221;页面，将</span><span>Start Action </span><span>选为&#8220;</span><span>Start External Program</span><span>&#8221;，接下来点击后边的选择按钮选中你的</span><span>Visual Studio</span><span>的可执行程序，我的</span><span>Visual Studio</span><span>程序位于&#8220;</span><span>D:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.exe</span><span>&#8221;，你可以根据自己的情况选择。如下图：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cnblogs.com/images/cnblogs_com/guanjinke/77957/r_DebugControlDesignTime.JPG" border=0><br></span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>在设置完以后工程属性以后，在需要调试的地方设置断点，然后点击</span><span>F5</span><span>或者点击工具栏的运行按钮。当点击以后，</span><span>visual studio</span><span>会运行起来，在运行起来的</span><span>Visual studio</span><span>里面打开一个应用你这个</span><span>Assembly</span><span>的工程，在这个工程里切换到</span><span>Form</span><span>设计器界面，选中你的控件，然后编辑你所要调设的功能，比如，你要调试一个控件的属性的</span><span>Editor</span><span>，你在这个</span><span>editor</span><span>类里设置断点，接着在属性浏览器里编辑这个属性，程序就会停在你设置的断点。</span></p>
<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>今天我也把写前面的文章的时候用到的源码附上，方便朋友们使用。</span> <br><a title=示例源代码 href="http://www.cnblogs.com/Files/guanjinke/CustomControlSample.rar">示例源代码</a><img src ="http://www.cnblogs.com/guanjinke/aggbug/628311.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47998/" target="_blank">传诺基亚正在开发Android手机</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>制作VS风格的Toolbox控件</title><link>http://www.cnblogs.com/guanjinke/archive/2007/01/10/617092.html</link><dc:creator>纶巾客</dc:creator><author>纶巾客</author><pubDate>Wed, 10 Jan 2007 13:23:00 GMT</pubDate><guid>http://www.cnblogs.com/guanjinke/archive/2007/01/10/617092.html</guid><wfw:comment>http://www.cnblogs.com/guanjinke/comments/617092.html</wfw:comment><comments>http://www.cnblogs.com/guanjinke/archive/2007/01/10/617092.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.cnblogs.com/guanjinke/comments/commentRss/617092.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/guanjinke/services/trackbacks/617092.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>在前些日子里</span><span>,</span><span>我写了有十篇关于</span><span>WinForm </span><span>控件的制作教程</span><span>,</span><span>在这些教程里使用的例子都十分的简单</span><span>,</span><span>并且示例的控件基本没有什么用，是该写一个简单实用的控件的时候了。今天我就来制作一个</span><span>VS</span><span>风格的</span><span>ToolBox</span><span>工具箱。</span><span>VS</span><span>风格的</span><span>ToolBox</span><span>和</span><span>QQ</span><span>的界面很相似，都是有多个栏目，并且这些栏目可以展开和折叠，当鼠标在某个子栏目上时，可以高亮显示，另外在</span><span>VS</span><span>风格的</span><span>ToolBox</span><span>中，点击选中项目的时候，要用特殊的颜色标识出来。如下图所示:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cnblogs.com/images/cnblogs_com/guanjinke/77957/o_Toolbox.JPG" border=0><br></span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>其实，控件的制作并不神秘，我们只需要把掌握的知识组合起来即可。现在我们动手来做这个控件，首先看看我们要处理哪些要点：</span>
<p><span><span>1．&nbsp;</span></span><span>创建控件的边框，我在前边的文章也讲过（），直接将代码复制过来，稍做修改即可。</span></p>
<p><span><span>2．&nbsp;</span></span><span>添加滚动条，因为我们的控件只需要垂直的滚动，所以我只只加入一个垂直的滚动条。</span></p>
<p><span><span>3．&nbsp;</span></span><span>ToolBox</span><span>包含多个</span><span>Category</span><span>，我们不但要创建</span><span>Category</span><span>类，还要创建这个类的集合。</span></p>
<p><span><span>4．&nbsp;</span></span><span>每一个</span><span>Category</span><span>包含多个</span><span>Item</span><span>，我们不但要创建</span><span>ToolBoxItem</span><span>类，还要创建这个类的集合。</span></p>
<p><span><span>5．&nbsp;</span></span><span>重载</span><span>OnPaint</span><span>方法，绘制控件的内容，在绘制的时候要注意滚动条的当前值，由于采用了双缓冲机制，所以每次总是将所有的内容重绘一次，不考虑</span><span>ClipRect</span><span>。</span></p>
<p><span><span>6．&nbsp;</span></span><span>写一个方法，根据鼠标的坐标计算出鼠标指向的</span><span>Item</span><span>或者</span><span>Category</span><span>，这个方法是这个控件的核心。</span></p>
<p><span><span>7．&nbsp;</span></span><span>重载</span><span>OnMouseMove</span><span>方法，当鼠标指向某个</span><span>Item</span><span>的时候，高亮显示出来。</span></p>
<p><span><span>8．&nbsp;</span></span><span>重载</span><span><span> </span>OnMouseDown</span><span>方法，当鼠标在某个</span><span>Item</span><span>上按下的时候，用指定的颜色标识出来，如果鼠标按下的地方是一个</span><span>Category</span><span>，根据当前的情况展开或者时折叠这个</span><span>category</span><span>。</span></p>
<p><span><span>9．&nbsp;</span></span><span>计算控件当前状态的内容的总的高度，用于设置滚动条的可见与不可见。</span></p>
<p><span><span>10．<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>暴露一个属性，用于为用户提供当前选中的</span><span>Item</span><span>。</span></p>
<p><span><span>11．<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>声明一个</span><span>ItemChanged</span><span>事件，便于用户在选择另一个</span><span>Item</span><span>时添加处理的代码。</span></p>
<p><span>实现了上述的内容，这个控件也就基本完成了。由于代码并不复杂，我就不将代码列出来讲解了，我将提供代码的下载，大家在看代码的时候，如有不明白的地方，可以参考我前面的控件教程。因为只花了几个小时写的这个控件，难免还有一些问题，请大家指出。<br><br><a title=源代码下载 href="http://www.cnblogs.com/Files/guanjinke/Guanjinke.Windows.Forms.rar">源代码下载</a></span></p><img src ="http://www.cnblogs.com/guanjinke/aggbug/617092.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47996/" target="_blank">7月编程语言排行榜</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>