﻿<?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>博客园-迷梦小筑—让灵魂在代码中无限升华</title><link>http://www.cnblogs.com/DreamlikeAttic/</link><description>我幸运，并不是所有的猫都可以拥有大脑!</description><language>zh-cn</language><lastBuildDate>Mon, 13 Oct 2008 14:40:46 GMT</lastBuildDate><pubDate>Mon, 13 Oct 2008 14:40:46 GMT</pubDate><ttl>60</ttl><item><title>剖析Net 精简版中Treeview控件Treenode的自描绘处理</title><link>http://www.cnblogs.com/DreamlikeAttic/archive/2006/08/05/468876.html</link><dc:creator>拍拍猫脑</dc:creator><author>拍拍猫脑</author><pubDate>Sat, 05 Aug 2006 13:10:00 GMT</pubDate><guid>http://www.cnblogs.com/DreamlikeAttic/archive/2006/08/05/468876.html</guid><wfw:comment>http://www.cnblogs.com/DreamlikeAttic/comments/468876.html</wfw:comment><comments>http://www.cnblogs.com/DreamlikeAttic/archive/2006/08/05/468876.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/DreamlikeAttic/comments/commentRss/468876.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/DreamlikeAttic/services/trackbacks/468876.html</trackback:ping><description><![CDATA[<span>连日暴雨倾盘，我养的小猫整日卷缩在阳台的角落象只死老鼠般一动不动，而我则在数据仓库的十多个表的联系独立分析中迷惘，枯燥无味的数据绑定使用程序失去了所有的生趣。我却定做一些其它的事情来放松绷紧的猫脑。</span>
<p><span>Treeview</span><span>控件是我的老伙伴了，但直到前几天，一个希望设定</span><span>treenode</span><span>背景色的问题才令我发现，我一直没有深入到它的核心。不过一切都会好转，我决定重新复习</span><span>windows</span><span>的基础控件的内部动作。有部电影的对白令我记忆深刻：面包会有的，牛奶会有的。一个能自描绘</span><span>Treenode</span><span>的</span><span>Treeview</span><span>也会有的</span><span>8)</span></p>
<p>&nbsp;<span>根据网上得到的部分代码资料及</span><span>MSDN</span><span>的帮助，我先在完整版中继承了一个</span><span>Treeview</span><span>对象，并试图处理</span><span>TreeView</span><span>的</span><span>OCM_NOTIFY</span><span>消息，所有的一切令人愉快，我轻易地截获了</span><span>TreeNode</span><span>对象在重绘前发出</span><span>OCM_NOTIFY</span><span>消息，消息中的</span><span>lParam</span><span>参数代表的</span><span>NMTVCUSTOMDRAW</span><span>结构的子结构</span><span>NMTVCUSTOMDRAW</span><span>中包含的</span><span>dwDrawStage</span><span>成员代表</span><span>CDDS_ITEMPREPAINT/CDDS_ITEMPOSTPAINT</span><span>标志，而且这个结构还包含有</span><span>Treenode</span><span>重绘时的</span><span>DC</span><span>，这意意味着我可以在</span><span>Treenode</span><span>的重绘前</span><span>/</span><span>后处理这个消息，并不再使用默认的</span><span>Treeview</span><span>消息处理过程而达到自描绘的效果。代码片段如下：</span></p>
<p><span>Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>Select Case m.Msg</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Case OCM_NOTIFY</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Dim NMTVCD As NMTVCUSTOMDRAW</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>NMTVCD = Marshal.PtrToStructure(m.LParam, GetType(NMTVCUSTOMDRAW))</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Select Case NMTVCD.NMCD.hdr.code</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Case NM_CUSTOMDRAW</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Select Case NMTVCD.NMCD.dwDrawStage</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Case CDDS_PREPAINT</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>' </span><span>我要得到</span><span>Treenode</span><span>中绘图处理前后的通知</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>m.Result = CDRF_NOTIFYITEMDRAW</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Case CDDS_ITEMPREPAINT //</span><span>这个通知将在</span><span>Treenode</span><span>绘图处理前收到</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Dim ptr As New IntPtr</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Dim rcItem As New Rectangle</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Dim g As Graphics = Graphics.FromHdc(NMTVCD.NMCD.hdc)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Dim b As New SolidBrush(Color.Blue)</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>rcItem.X = NMTVCD.NMCD.dwItemSpec</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SendMessageItemRect(m.HWnd, TVM_GETITEMRECT, 1, rcItem) </span></p>
<p><span><span>&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; </span></span></p>
<p><span><span>&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; </span>//</span><span>你可以利用</span><span>Graphics</span><span>对象</span><span>g</span><span>来进行</span><span>TreeNode</span><span>的绘图</span><span>,</span><span>例如：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>g.FillRectangle(New SolidBrush(Color.Yellow), New RectangleF(rcItem.X, rcItem.Y, rcItem.Width, rcItem.Height))</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>g.Dispose()</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>b.Dispose()</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>m.Result = CDRF_SKIPDEFAULT //</span><span>这个返回值将通知</span><span>Treeview</span><span>控件不需再进行这个</span><span>Treenode</span><span>的绘图操作</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Case CDDS_ITEMPOSTPAINT ////</span><span>这个通知将在</span><span>Treenode</span><span>处理后收到</span></p>
<p><span><span>&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; </span>&nbsp;//</span><span>和你可以以这儿进行和</span><span>CDDS_ITEMPREPAINT</span><span>过程相似的绘图操作</span></p>
<p><span>//</span><span>这代表在</span><span>Treeview</span><span>进行</span><span>treenode</span><span>描绘后你还可以为</span><span>treenode</span><span>再多画一些东西</span><span>8)</span></p>
<p><span>//</span><span>代码略</span><span>&#8230;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>m.Result = CDRF_SKIPDEFAULT</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>End Select</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>End Select</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Case Else</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>MyBase.WndProc(m)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>End Select</span></p>
<p><span>&nbsp;End Sub</span></p>
<p>&nbsp;<span>但在精简版中，我挂接了</span><span>TreeView</span><span>控件的消息处理过程，却始终无法收到</span><span>OCM_NOTIFY</span><span>消息，查阅了</span><span>PPC2003</span><span>的</span><span>SDK</span><span>也没有发现该消息的说明，讨厌的</span><span>WinCE</span><span>系统没有提供这个通知。然后我在文档中迷醉了</span><span>7~80</span><span>分钟才发现，系统提供的</span><span>Treeview</span><span>只向父窗体发送</span><span>WM_NOTIFY</span><span>消息，消息的</span><span>lParam</span><span>代表的意义和</span><span>OCM_NOTIFY</span><span>通知完全一致。与是我不再继承，而是采取了使用一个自定义控件上放一个</span><span>Treeview</span><span>的方法。然后我在这个自定义控件中截到了</span><span>WM_NOTIFY</span><span>通知消息，接下来的</span><span>Treenode</span><span>绘图处理就和上面的示例大同小异了。</span></p>
<p><span><span>&nbsp;&nbsp; </span></span><span>//</span><span>本控件的消息处理过程</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>private int ThisWindowProc(IntPtr hwnd, uint uMsg, uint wParam, uint lParam)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>bool tblnUseOldWinProc = true;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int tintFuncReturn = 0;</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>switch (uMsg)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>case WM_NOTIFY:</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tagNMHDR tudtNMHDR;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tagNMCUSTOMDRAWINFO tudtTreeViewCustomDrawInfo;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tagNMTVCUSTOMDRAW tudtTreeViewCustomDraw;</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tudtNMHDR = (tagNMHDR)Marshal.PtrToStructure(new IntPtr(lParam), typeof(tagNMHDR));</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (tudtNMHDR.hwndFrom == treMain.Handle)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>switch (tudtNMHDR.code)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>case NM_CUSTOMDRAW:</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tudtTreeViewCustomDraw = (tagNMTVCUSTOMDRAW)Marshal.PtrToStructure((IntPtr)lParam,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>typeof(tagNMTVCUSTOMDRAW));</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tudtTreeViewCustomDrawInfo = tudtTreeViewCustomDraw.nmcd;</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>switch (tudtTreeViewCustomDrawInfo.dwDrawStage)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>case CDDS_PREPAINT:</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span>本控件在</span><span>Item</span><span>重画前后都将获得</span><span>Treeview</span><span>控件的</span><span> NM_CUSTOMDRAW</span><span>消息</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tintFuncReturn = (int)CDRF_NOTIFYITEMDRAW;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tblnUseOldWinProc = false;//</span><span>不再使用原始窗体的消息处理过程</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break;</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>case CDDS_ITEMPREPAINT:</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tintFuncReturn = fnCDDS_ITEMPREPAINT_NotifyMessage(hwnd, uMsg, wParam, lParam,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ref&nbsp;tudtTreeViewCustomDraw, ref tblnUseOldWinProc);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Marshal.StructureToPtr(tudtTreeViewCustomDraw, (IntPtr)lParam, false);//</span><span>这是重绘</span><span>TreeNode</span><span>的处理过程</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>default:</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break;</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}//end switch</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break;</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}//end switch</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}//end if</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break;</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>default:</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span><span>对不处理的消息使用</span><span>treeview</span><span>的默认消息处理过程</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}//end switch</span></p>
<p>&nbsp;<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (tblnUseOldWinProc == true)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return clsCECoreAPI.CallWindowProc(m_intThisPreviousWinProc, hwnd, uMsg, wParam, lParam);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return tintFuncReturn;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//end if</span></p>
<p>&nbsp;</p>
<p><span>}//end function</span></p>
<p>&nbsp;</p>
<p><span>得到的运行效果如下：<br><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/dreamlikeattic/test.jpg" border=0><br><br>如<span>移动设备开发感兴趣可以加入以下群</span><span>24123368</span></p>
<p><span>入群需知：</span></p>
<p><span>1</span><span>、不是编程开发人员请勿加入。</span></p>
<p><span>2</span><span>、没时间讨论问题或喜欢潜水的请勿加入。</span></p>
<p><span>3</span><span>、只想获得源程序的请勿加入</span></p>
<p>&nbsp;</p>
<p><span>本</span><span>blog</span><span>文档，未经作者同意，谢绝转载。谢谢你对我的blog的访问.</span></p>
<p><span>联系方式</span><span>: missilecat@163.com QQ:85403578</span></p>
<p><br></span></p>
<img src ="http://www.cnblogs.com/DreamlikeAttic/aggbug/468876.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42969/" target="_blank">[新闻]MySpace推自助广告平台MyAds</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>在Pocket PC/Smartphone智能设备上编写压缩程序(特别简单，任何人都能简单使用）</title><link>http://www.cnblogs.com/DreamlikeAttic/archive/2006/07/07/445643.html</link><dc:creator>拍拍猫脑</dc:creator><author>拍拍猫脑</author><pubDate>Fri, 07 Jul 2006 15:54:00 GMT</pubDate><guid>http://www.cnblogs.com/DreamlikeAttic/archive/2006/07/07/445643.html</guid><wfw:comment>http://www.cnblogs.com/DreamlikeAttic/comments/445643.html</wfw:comment><comments>http://www.cnblogs.com/DreamlikeAttic/archive/2006/07/07/445643.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/DreamlikeAttic/comments/commentRss/445643.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/DreamlikeAttic/services/trackbacks/445643.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>想拥有一个自己的压缩算法实现很久了，但直到</span><span>net2.0</span><span>微软才开始提供官方的压缩算法。并且激动永远只是短暂的，作为智能开发的这一片，我们仿佛总是处于遗忘的角落。</span><span>Net Compact framework (</span><span>以下简单</span><span>ncf) 1.0</span><span>是不必说了，那是一个玩具，绝不是工具！</span><span>ncf2</span><span>有了较大改观，可以说这开始成为一种工具了。我们拥有了更多的功能，</span><span>com</span><span>的部分支持（但没有</span><span>ActiveX</span><span>控件及一些完整</span><span>Com</span><span>的功能）。但在</span><span>System.IO</span><span>命名空间，失望的我也没有找到</span><span>Compression</span><span>空间。。。</span></p>
<p>&nbsp;<span>在对微软无视使用</span><span>net</span><span>精简版的我的需求，我在表达了最强烈的愤慨后，无奈地接受了这一现实。但我实在无法接受等待下一版</span><span>ncf3</span><span>的漫长等待，也许等待永远都意味着失望。我决定用行动改变这一切！</span></p>
<p>&nbsp;<span>我查阅了</span><span>net2</span><span>的</span><span>MSIL</span><span>源程序，虽然逆向工程并不是一件伟大的事，但我认为我根据</span><span>net</span><span>完整版的源程序帮微软提供</span><span>NCF2</span><span>的扩充功能对微软应该不是什么坏事</span><span>8</span><span>）</span></p>
<p>&nbsp;<span>System.IO.Compression</span><span>处于</span><span>net</span><span>完整版那臃肿的</span><span>system.dll</span><span>中，接下来的事就不细说了，我痛苦地</span><span>copy/paste</span><span>并删除了一些</span><span>ncf2</span><span>不支持的属性，并将</span><span>System.SR</span><span>类合并入这个空间中，</span><span>4 </span><span>个小时后，我生成了和完整版功能一模一样的</span><span>CECompression.dll(</span><span>当然是一模一样啦，程序都是微软写的，我只是负责修正</span><span>8)</span><span>）象普罗米修斯从宙斯控制下偷火一样，我将</span><span>System.IO.Compression</span><span>带到了幸福的智能开发世界。</span></p>
<p>&nbsp;<span>在这儿你可以获得这个</span><span>dll<A href="http://DreamlikeAttic.cnblogs.com/Files/DreamlikeAttic/CECompression.rar">/Files/DreamlikeAttic/CECompression.rar</a></span><span>。至于使用嘛</span><span>,</span><span>在项目中添加对这个</span><span>dll</span><span>的引用就可以了，帮助看</span><span>msdn</span><span>对</span><span>System.IO.Compression</span><span>的说明就行。。。。</span></p>
<p>&nbsp;<span>这此我也提供一个使用这个</span><span>dll</span><span>的实用程序，可以对指定的源文件进行（压缩</span><span>/</span><span>解压缩）后得到目标文件。<br><br>&nbsp;<img src="http://www.cnblogs.com/images/cnblogs_com/dreamlikeattic/1.JPG" border=0>&nbsp;</p>
<p><span>完整代码如下：<br></span></p>
<p>using System;<br>using System.Collections.Generic;<br>using System.ComponentModel;<br>using System.Data;<br>using System.Drawing;<br>using System.Text;<br>using System.Windows.Forms;<br>using System.IO;<br>using System.IO.Compression;</p>
<p>namespace testGzip<br>{<br>&nbsp; public partial class Form1 : Form<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; public Form1()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private void menuItem1_Click(object sender, EventArgs e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Close();<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; private void btnSelectSource_Click(object sender, EventArgs e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dlgFileOpen.FileName = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DialogResult tdlgResult = dlgFileOpen.ShowDialog();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tdlgResult == DialogResult.OK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txtSource.Text = dlgFileOpen.FileName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //end if</p>
<p><br>&nbsp;&nbsp;&nbsp; }//end sub</p>
<p>&nbsp;&nbsp;&nbsp; private void btnSelectDest_Click(object sender, EventArgs e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dlgSaveFile.FileName = "";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DialogResult tdlgResult = dlgSaveFile.ShowDialog();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tdlgResult == DialogResult.OK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txtDest.Text = dlgSaveFile.FileName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //end if<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private void btnZip_Click(object sender, EventArgs e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //开始压缩<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //先验证源文件名及目标文件名的正确性<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (System.IO.File.Exists(txtSource.Text) == false)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("源文件名指定的文件不存在");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txtSource.Focus();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end if</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (System.IO.File.Exists(txtDest.Text) == true)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DialogResult tdlgResult = MessageBox.Show("指定的目标文件已存在,覆盖吗?",<br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "文件覆盖确认", MessageBoxButtons.YesNo,<br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBoxIcon.Question,<br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBoxDefaultButton.Button1);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tdlgResult == DialogResult.No)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txtDest.Focus();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//endif </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool tblnResult = FileGZipCompress(txtSource.Text, txtDest.Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tblnResult == false)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("压缩出现错误!压缩失败");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //end if</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; }//end sub</p>
<p>&nbsp;&nbsp;&nbsp; bool FileGZipCompress(string ni_strSourceFile, string ni_strDestFile)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileStream tobjSourceFileStream;<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("开始对"+txtSource.Text +"进行文件压缩");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Open the file as a FileStream object.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjSourceFileStream = new FileStream(ni_strSourceFile, FileMode.Open, FileAccess.Read, FileShare.Read);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] taSourcebuffer = new byte[tobjSourceFileStream.Length];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Read the file to ensure it is readable.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int count = tobjSourceFileStream.Read(taSourcebuffer, 0, taSourcebuffer.Length);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (count != taSourcebuffer.Length)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjSourceFileStream.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("压缩失败，不能读取指定的文件");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjSourceFileStream.Close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileStream&nbsp; tobjDestFileStream = new FileStream(ni_strDestFile,FileMode.Create,FileAccess.ReadWrite&nbsp; );// new MemoryStream();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemoryStream tobjMemStream = new MemoryStream();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 使用内存流进行压缩<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GZipStream compressedzipStream = new GZipStream(tobjMemStream, CompressionMode.Compress, true);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cursor.Current = Cursors.WaitCursor;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //向压缩流写入要压缩的数据<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; compressedzipStream.Write(taSourcebuffer, 0, taSourcebuffer.Length);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //关闭压缩流<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; compressedzipStream.Close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //此处应该写入文件头信息,在此处简单写入一个文件长度<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjDestFileStream.Position = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjDestFileStream.Write(BitConverter.GetBytes(taSourcebuffer.Length),0,4);//写入4字节的文件长度</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定入压缩得到的实际数据<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjMemStream.WriteTo(tobjDestFileStream);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjMemStream.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cursor.Current = Cursors.Default;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("压缩完成.源文件大小为:\n" + taSourcebuffer.Length + "字节\n"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "压缩后大小为" + tobjDestFileStream.Length + "字节\n"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "压缩比为: " + (tobjDestFileStream.Length&nbsp; / taSourcebuffer.Length*100)+" %");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjDestFileStream.Close();</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end try</p>
<p>&nbsp;&nbsp;&nbsp; }//end sub</p>
<p>&nbsp;&nbsp;&nbsp; private bool FileGZipDecompress(string ni_strSourceFile, string ni_strDestFile)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //对指定的压缩文件进行解压缩<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileStream tobjSourceFileStream;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GZipStream tobjGzipStream = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemoryStream tobjMemStream ;<br>&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cursor.Current = Cursors.WaitCursor;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjSourceFileStream = new FileStream(ni_strSourceFile, FileMode.Open, FileAccess.Read, FileShare.Read);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取得文件的原始长度<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] tabytFileLength=new byte[4];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjSourceFileStream.Read(tabytFileLength,0,4);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int tintFileLength = BitConverter.ToInt32(tabytFileLength,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] tabyteDeCompressData=new byte[tobjSourceFileStream.Length-4];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjSourceFileStream.Read(tabyteDeCompressData, 0, tabyteDeCompressData.Length);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjMemStream = new MemoryStream(tabyteDeCompressData);</p>
<p>&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjGzipStream = new GZipStream(tobjMemStream, CompressionMode.Decompress);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] tabytBuffer = new byte[tintFileLength];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjGzipStream.Read( tabytBuffer, 0, tintFileLength );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjGzipStream.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjSourceFileStream.Close();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将压缩的数据写入目标文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileStream tobjDestFileStream = new FileStream(ni_strDestFile, FileMode.Create, FileAccess.ReadWrite,<br>&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; FileShare.None);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjDestFileStream.Write(tabytBuffer, 0, tabytBuffer.Length);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjDestFileStream.Close();</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cursor.Current = Cursors.Default;</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end try</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; }//end sub</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; private void btnUnzip_Click(object sender, EventArgs e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //开始解压缩<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //先验证源文件名及目标文件名的正确性<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (System.IO.File.Exists(txtSource.Text) == false)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("源文件名指定的文件不存在");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txtSource.Focus();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end if</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (System.IO.File.Exists(txtDest.Text) == true)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DialogResult tdlgResult = MessageBox.Show("指定的目标文件已存在,覆盖吗?",<br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "文件覆盖确认", MessageBoxButtons.YesNo,<br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBoxIcon.Question,<br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBoxDefaultButton.Button1);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tdlgResult == DialogResult.No)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; txtDest.Focus();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//endif </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("开始对\"" + txtSource.Text + "\"进行文件解压缩");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool tblnResult = FileGZipDecompress(txtSource.Text, txtDest.Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tblnResult == false)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("解压缩出现错误!解压缩失败");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show("解压缩成功完成");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //end if</p>
<p><br>&nbsp;&nbsp;&nbsp; }//end sub</p>
<p><br>&nbsp; }//end class</p>
<p><br>}//end namespace</p>
<p><br>&nbsp;<span>你可以这儿获取相应的源程序包：<A href="http://DreamlikeAttic.cnblogs.com/Files/DreamlikeAttic/CECompressionTest.rar">/Files/DreamlikeAttic/CECompressionTest.rar</a></span>&nbsp;</p>
<p>&nbsp;如<span>移动设备开发感兴趣可以加入以下群</span><span>24123368</span></p>
<p><span>入群需知：</span></p>
<p><span>1</span><span>、不是编程开发人员请勿加入。</span></p>
<p><span>2</span><span>、没时间讨论问题或喜欢潜水的请勿加入。</span></p>
<p><span>3</span><span>、只想获得源程序的请勿加入</span></p>
<p>&nbsp;</p>
<p><span>本</span><span>blog</span><span>文档，未经作者同意，谢绝转载。谢谢你对我的blog的访问.</span></p>
<p><span>联系方式</span><span>: missilecat@163.com QQ:85403578</span></p>
</span>
<img src ="http://www.cnblogs.com/DreamlikeAttic/aggbug/445643.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42960/" target="_blank">[新闻]Facebook创始人:信息共享或存摩尔定律</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>使用完整拼音查找汉字(完整拼音,不是网上散布的首字符拼音那种方法） </title><link>http://www.cnblogs.com/DreamlikeAttic/archive/2006/06/30/440048.html</link><dc:creator>拍拍猫脑</dc:creator><author>拍拍猫脑</author><pubDate>Fri, 30 Jun 2006 15:23:00 GMT</pubDate><guid>http://www.cnblogs.com/DreamlikeAttic/archive/2006/06/30/440048.html</guid><wfw:comment>http://www.cnblogs.com/DreamlikeAttic/comments/440048.html</wfw:comment><comments>http://www.cnblogs.com/DreamlikeAttic/archive/2006/06/30/440048.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cnblogs.com/DreamlikeAttic/comments/commentRss/440048.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/DreamlikeAttic/services/trackbacks/440048.html</trackback:ping><description><![CDATA[<h2>&nbsp;</h2>
<div class=postbody>&nbsp;注意：这绝不是网上散播的只能使用拼音首字符进行汉字查找的方案，这是一个真正的输入完整拼音得到相应汉字的解决办法。<br><br>&nbsp;大部分程序员眼中只有变量、函数&#8230;&#8230;他们忽略生活中的一切，他们并不理解真正的优雅的程序解决方案往往来自生活！<br><br>&nbsp;今天群内有兄弟提问怎样使用一个完整的拼音查找到相应的汉字。这显然是网上散播的只能使用拼音首字符进行汉字查找的方案无法解决的，他们在拼命地寻找微软的API，网上现成的函数，但他们忽略了一点，其实所有的一切，都因为他们缺少一个（汉字，拼音）这样的格式的数据库。<br>&nbsp;其实取得这样一个数据库很简单。在很久以前我初学电脑，很久很久以前的事了，我那时只会玩各种不同的游戏8-)由于我不会用win98，所以我常常用鼠标点击我可以点击到的一切东西，其中适好包括一个叫&#8220;输入法生成器&#8221;的程序。更奏巧的是我当时也适好发现这个输入法生成器可以将输入法的数据库转为一个可读的TXT文件。只要取得全拼输入法的数据文件，一切都解决了。<br><br>&nbsp;1、首先需要一个win98 ，你们可能没有了吧，因为你们不玩游戏8（，用VMware虚拟安装啦。输入法生成器是可选安装的，如果在附件中没看到&lt;输入法生成器&gt; ，就使用win98 的安装程序安装它。<br>&nbsp;打开输入法生成器，选逆转换 ，打开文件c:\windows\system\winpy.mb（这是全拼输入法的数据文件）,在码表原文件中写上c:\windows\desktop\winpy.txt 按逆转换&nbsp;<br>&nbsp;<img height=437 src="http://blog.yesky.com/blog/images/yesky_com/dreamlikeattic/20060630231529_52.jpg" width=344 border=0><br>&nbsp;很高兴，我们得到了拼音字符的数据库文件winpy.txt。<br>&nbsp;用编辑软件打开这个文件，看到这样的格式：<br>&nbsp;Description]<br>&nbsp;Name=全拼<br>&nbsp;MaxCodes=12<br>&nbsp;MaxElement=1<br>&nbsp;UsedCodes=abcdefghijklmnopqrstuvwxyz<br>&nbsp;WildChar=?<br>&nbsp;NumRules=3<br>&nbsp;[Rule]<br>&nbsp;ca4=p10+p20+p30+p40<br>&nbsp;ce2=p10+p20<br>&nbsp;ce3=p10+p20+p30<br>&nbsp;[Text]<br>&nbsp;啊a<br>&nbsp;阿a<br>&nbsp;一个汉字对一个拼音，回车换行符分开各项,将这种格式的字符串分为汉字和拼音是很容易的，拼音是字母，在unicode中不会超过255,汉字在unicode中大于255,根据这个判断来分割就行了 <br>&nbsp;<br>&nbsp;2、将文件的头几行说明删除后，我们得到这样格式的拼音与汉字的键对（呵a he），应为需要用拼音找汉字，我再用一个C#代码将这个文件格式变为（a he呵）拼音在前，汉字在后这样的格式以方便查找。<br>&nbsp;示例程序效果如下，两个textbox，上面一个输拼音，下面一个会显示这个拼音对应的汉字，这一刻起我才发现中华汉字是那样的博大精深,一个读音居然有这么多的同音字:<br><br><img height=300 src="http://blog.yesky.com/blog/images/yesky_com/dreamlikeattic/20060630231540_162.jpg" width=300 border=0><br>&nbsp;<br>&nbsp;完整的C#代码<A href="http://DreamlikeAttic.cnblogs.com/Files/DreamlikeAttic/Pinyintest.rar">/Files/DreamlikeAttic/Pinyintest.rar</a>如下，由于是示例，我并没有使用二分查分之类的方法优化，我只是简单将数据文件以字符串的方式读到内存，并使用indexof来确定拼音的位置后取得对应的文字。并且对数据文件也进行了处理，去掉了所有的词组，在debug中可以看到PYCompact.txt这个不再包含词组拼音的数据文件。其实得到了这个数据库，你要怎么玩拼音都可以，不会数据搜索技术就自己再学习一下大学的教科书吧！<br><br>&nbsp;&nbsp; public partial class Form1 : Form<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; string m_strPinyinLib;//保存数据文件中所有的拼音及汉字</div>
<div class=postbody>&nbsp;&nbsp;&nbsp; public Form1()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();<br>&nbsp;&nbsp;&nbsp; }</div>
<div class=postbody>&nbsp;&nbsp;&nbsp; private void Form1_Load(object sender, EventArgs e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StreamReader tobjTextReader;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StreamWriter tobjTextWriter;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BinaryWriter tobjBinaryWriter;</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileStream tobjOutPutFile;</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string tstrItemValue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string tstrTemp;</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjTextReader = new StreamReader(@"winpy.txt", true);</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjOutPutFile = File.Open("PYCompact.txt", FileMode.Create);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjBinaryWriter = new BinaryWriter(tobjOutPutFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjTextWriter = new StreamWriter(tobjOutPutFile, Encoding.Unicode);</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tstrItemValue = tobjTextReader.ReadLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (tstrItemValue != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //只保留单字不再要库中的词组<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tstrItemValue.ToCharArray()[1] &lt; 255)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将拼音放在前面<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tstrTemp = tstrItemValue.Substring(1) + tstrItemValue.Substring(0, 1);</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjTextWriter.WriteLine(tstrTemp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end if<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //tobjBinaryWriter.Write(</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tstrItemValue = tobjTextReader.ReadLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end while</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjTextWriter.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjBinaryWriter.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjOutPutFile.Close();</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjTextReader.Close();</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将拼音库的内容读到一个字符串中待用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjTextReader = new StreamReader(@"PYCompact.txt", true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_strPinyinLib = tobjTextReader.ReadToEnd();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tobjTextReader.Close();</div>
<div class=postbody>&nbsp;&nbsp;&nbsp; }</div>
<div class=postbody>&nbsp;&nbsp;&nbsp; private void textBox1_TextChanged(object sender, EventArgs e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string tstrChineseList = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (textBox1.Text != "")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tstrChineseList = findChinese(textBox1.Text);</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textBox2.Text = tstrChineseList;<br>&nbsp;&nbsp;&nbsp; }//end sub</div>
<div class=postbody>&nbsp;&nbsp;&nbsp; string findChinese(string ni_strPinyin)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int tintFirstFind;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string tstrReturn = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string tstrTemp = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int tintloop;</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tintFirstFind = m_strPinyinLib.IndexOf(ni_strPinyin);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (tintFirstFind &gt;= 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</div>
<div class=postbody><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (tintloop = tintFirstFind; tintloop &lt; m_strPinyinLib.Length - 1; tintloop++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((tintFirstFind - 1) &gt; 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (m_strPinyinLib.Substring(tintFirstFind - 1, 1).ToCharArray()[0] &lt; 255<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; m_strPinyinLib.Substring(tintFirstFind - 1, 1).ToCharArray()[0] != ' ')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; //由于找到的这个拼音前面还有英文字符且不为空格，说明这个拼音可是是u查找到gu这种情况，不予理会<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end if <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end if</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((tintFirstFind + ni_strPinyin.Length) &lt;( m_strPinyinLib.Length - 1))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (m_strPinyinLib.Substring(tintFirstFind + ni_strPinyin.Length, 1).ToCharArray()[0] &lt; 255<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; m_strPinyinLib.Substring(tintFirstFind + ni_strPinyin.Length, 1).ToCharArray()[0] != ' ')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; //由于找到的这个拼音后面还有英文字符且不为空格，说明这个拼音可是是gu查找到guang这种情况，不予理会<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end if <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//endif</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tstrTemp = m_strPinyinLib.Substring(tintloop, 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tstrTemp.ToCharArray()[0] &gt; 255)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { //找到对应的汉字，退出<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end if<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//next</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tstrReturn += tstrTemp;</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tintFirstFind = m_strPinyinLib.IndexOf(ni_strPinyin, tintloop + 1);</div>
<div class=postbody><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }//end while</div>
<div class=postbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (tstrReturn);</div>
<div class=postbody>&nbsp;&nbsp;&nbsp; }//end function</div>
<div class=postbody>&nbsp; }//end class<br></div>
<div class=postbody>本blog文档，未经作者许可，谢绝转载!</div>
<img src ="http://www.cnblogs.com/DreamlikeAttic/aggbug/440048.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42959/" target="_blank">[新闻]微软承认Vista用户账户控制功能有问题</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>如何在net中声明智能设备的API</title><link>http://www.cnblogs.com/DreamlikeAttic/archive/2006/06/23/434311.html</link><dc:creator>拍拍猫脑</dc:creator><author>拍拍猫脑</author><pubDate>Fri, 23 Jun 2006 13:54:00 GMT</pubDate><guid>http://www.cnblogs.com/DreamlikeAttic/archive/2006/06/23/434311.html</guid><wfw:comment>http://www.cnblogs.com/DreamlikeAttic/comments/434311.html</wfw:comment><comments>http://www.cnblogs.com/DreamlikeAttic/archive/2006/06/23/434311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/DreamlikeAttic/comments/commentRss/434311.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/DreamlikeAttic/services/trackbacks/434311.html</trackback:ping><description><![CDATA[&nbsp;<span>看到这个问题，很多人会很奇怪：声明</span><span>API</span><span>不就一个</span><span>dllimport</span><span>属性就搞定？</span>
<p>&nbsp;<span>情况永远没有想象中那么简单，由于微软给出的</span><span>SDK</span><span>帮助永远是为</span><span>VC</span><span>定做的，我们常常没有办法了解到某一个</span><span>DLL</span><span>到底有什么函数。今天就有位写程序的兄弟问我</span><span>SHSendBackToFocusWindow</span><span>的声明方式，他称根据</span><span>SDK</span><span>的说明在声明中</span><span>VS</span><span>一直提示无法在</span><span>DLL</span><span>中找到该方法。</span></p>
<p>&nbsp;<span>我按他所说的情况查询了微软的</span><span>SDK</span><span>，其中说明是这样的：</span></p>
<p><span>Smartphone: Smartphone 2002 and later.</span></p>
<p><span>OS Versions: Windows CE 3.0 and later.</span></p>
<p><span>Header: tpcshell.h.</span></p>
<p><span>Library: Aygshell.lib.</span></p>
<p><span>按照常规，库</span><span>Aygshell.lib</span><span>改了</span><span>lib</span><span>为</span><span>dll</span><span>后即为函数的调用</span><span>DLL</span><span>名字，但根据这种方法声明，运行时果然出现了函数不存在的报错。</span></p>
<p>&nbsp;<span>我第一反应是用</span><span>VS</span><span>自带的</span><span>depends</span><span>工具来查看</span><span>Aygshell.dll</span><span>的内容，</span><span>depends</span><span>是一个极好的工具，他可以显示指定</span><span>DLL</span><span>内的函数和</span><span>DLL</span><span>依存关系。<br></span></p>
<p><span>但不幸的事，</span><span>VS2005</span><span>无法在模拟器中将此文件复制出来，看来这个</span><span>DLL</span><span>属系统的核心组件。</span></p>
<p>&nbsp;<span>所有的一切又回复到了原点，手工的资本依然只有</span><span>SDK</span><span>中指出的</span><span>Aygshell.lib</span><span>。但兴幸的是，从</span><span>dos</span><span>黑暗时代走来的程序员中，我的猫脑依稀还存在一些神秘的记忆，</span><span>dumpbin</span><span>命令！这个命令可以列出</span><span>DLL</span><span>中的信息，但不知它用于</span><span>lib</span><span>时有什么效果？</span></p>
<p><span>一个重定向符</span><span>&gt;</span><span>可以使</span><span>Dos</span><span>命令的输出导入到一个文件中，于是在</span><span>VS</span><span>的命令窗口我输入：</span></p>
<p><span>dumpbin aygshell.lib /all&gt;Luck.txt</span></p>
<p><span>在这个</span><span>luck.txt</span><span>的</span><span>Exports</span><span>节中我找到了函数的入口点：</span></p>
<p><span>97<span>&nbsp;&nbsp;&nbsp; </span>SHSendBackToFocusWindow</span></p>
<p><span>接下来一切迎刃而解，函数声明如下</span></p>
<p><span>&nbsp;[DllImport("Aygshell.dll", EntryPoint = "#97")]</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>private static extern void SHSendBackToFocusWindow(uint uMsg,</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>uint wp,</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>uint lp);</span></p>
<span>本blog文档不经作者许可,谢绝转载!</span>
<img src ="http://www.cnblogs.com/DreamlikeAttic/aggbug/434311.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42958/" target="_blank">[新闻]资本寒冬侵袭中国视频网站 营销春天或不远</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>