RSS 2.0 Feed
2006-06 Entries
摘要:这些天我在家里用C#实现一个资源管理器控件,功能和Windows自己的那个类似,我想把它实现的和Windows的尽量接近 — 当然是越接近越好啦。 问题马上就来了,.NET目前似乎并不是很擅长搞这个,或者说那些相关的Windows API还没被收入进FCL(WinFX/.NET 3.0应该已经收录了吧),这下可麻烦了: 地址栏MFC里面有个CComboBoxEx类,可以用来做带层次缩进和图标的ComboBox,实现资源管理器的地址栏。但是.NET没有,不过还好可以继承System.Windows.Forms.ComboBox类,然后重写OnDrawItem方法,搞定 文件图标.NET 2.0终于开始支持这个功能了,就是Icon.ExtractAssociatedIcon方法,不过它返回的总是文件的大图标.... 而Windows XP里面一个文件可以包含大中小三种尺寸的图标(每种还有三等色深所以一共是九种),所以还是得调用SHGetFileInfo这个API;还有些图标是在shell32.dll里头的(比如文件夹的图标),那样还得把它们枚举出来... 这个得用ExtractIconEx;此外还要维护一个ImageList,不然占用太多Icon句柄,会发生GDI Failue的... 这个还好,FCL已经有这个类支持了 文件类型信息每种文件类型都有一个Description,比如说.doc就是Microsoft Word Document,也记录在注册表里头。这个问题我在CSDN已经回答了N遍,不想再打一遍了 文件夹背景图这个暂时还没功夫去研究,并且我认为这个功能相对不是那么的重要。还有文件夹缩略图之类的... 不是一般的麻烦,日后再说 左边的树形视图.NET自带了TreeView控件,只要有Icon,剩下的工作就很容易了 右键菜单菜单里有很多项目都是记录在注册表里面的。这个又是个很大的话题... 总而言之就是麻烦得要死。不过那些Cut、Copy、Delete、Properties什么的操作的实现倒是简单,可以直接用ShellExecuteEx这个API 快捷方式解析.lnk文件到目标文件,可以直接打开文件流读取里面的字符,在某个偏移量的某个位置是可以找到的,不过这样不“安全”,还是用API吧。MSDN说可以使用IShellLink和IPersistFile这两个COM接口,代码虽然很ugly但是不算很长。问题又来了,IShellLink没有继承IDispatch,只是继承了IUnknown,这意味着tlbimp.exe也帮不了忙(貌似),得自己声明那些接口和组件原型... 阿门,我今天搞了一晚上,还是不大对头,想睡觉了... 主文件视图这个可以用.NET自带的ListView控件应付,和Windows一样它也带了5种浏览模式(Title、List、Detail等等),不用自己实现 文件/文件夹的TooltipTooltip的内容并不是固定的... 比如说doc文件的Tooltip还会包括Author等信息,mp3文件则会有Duration之类的,这个要用Structure Storage相关的COM组件,超级麻烦,暂时不想管了~ .......... 不过今天也不是没有收获,在Google上找到了这么个网站:http://www.vbaccelerator.com/home/NET/Code/Libraries/Shell_Projects/index.asp 他们把很多Shell相关的东西给封装了一下,比如我一直郁闷的文件快捷方式的问题,他们已经提供了解决方案。早知道有这个,我就不用那么费劲了。...[阅读全文]

posted @ | Feedback (9) | Filed Under [ Patterns and Practice P/Invoke ]

摘要:一大堆实用类库 有一帮家伙成天没事,而且貌似有点无聊,所以搞了一大堆乱七八糟毫无联系的项目,最后标以Free Software放在网上,就成了Mentalis.org。和一般的垃圾软件下载站所不同的是,他们的东西着实都还不错,而且全都是原创,比较符合寡人的胃口,而且今天我也很无聊,所以写篇BLOG分享之: http://www.mentalis.org/soft/projects.qpxhttp://www.mentalis.org/soft/classes.qpx GPL和BSD Mentalis.org这个网站的第一个特别之处就是他们的No GPL的Mark(右图)。而且这个Mark是覆盖在Free Software之上的,看的出来他们很不喜欢GPL这个License。想起我的FtpClient Library也是基于GPL,也曾遭到网友反对。这个怎么说呢,我用GPL,不管你怎么想,但最起码你很难理直气壮的说我做的不对。我明白,对于开源软件/库/代码的使用者来说,还是BSD更“爽”一点。这也许是因为BSD协议并不限制你把代码使用于商业项目中,不像GPL那样会强制你的软件也开源。 事实上,我现在也越来越不喜欢GPL了,我打算把我的那个项目升级到一个新版本,然后改成BSD(这样做对于GPL协议来说是合法的)。原来用GPL的原因是我小气,怕别人下载了改改就拿去卖钱,我不爽(呵呵)。现在想法转变,原因是GPL这种防君子不防小人的条文,最起码在我周围这一大圈面积的地方是起不到什么作用的。而实际情况更糟,小人没能防成,君子们却都被我拒之门外了。既然如此,干脆好人做到底,就BSD吧。(看起来我的确是不如Mentalis.org那帮人那么伟大,反对GPL居然是因为这种理由) Creative Commons License 上个月我在这个BLOG的Title下面加了个图标,就是CC - Some Rights Reserved那个。对于网上发表的文本作品,我打算都使用这个Creative Commons License。有个网站很贴心,知道我等懒人已经懒到连License都不想抽时间写了(要死啊),所以发明了个License制作向导:http://creativecommons.org。这个也推荐大家一用。 Donate 关于很多非盈利性质的软件,往往都喜欢在自己网站的角落里加一个Donate链接(往往是基于PayPal的在线支付系统)。不知道各位看官对这个现象有何看法,反正我是觉得很别扭。这就像那些穷酸的艺人,一边在路边卖艺,一边等着路人把硬币扔到自己面前的瓷碗里,而瓷碗里的那些钱真的是少得可怜。他们真的有很多共同点: 不指望自己做的东西能卖钱你会拿一个自己写的class就去卖钱吗,除非你实现了个什么前无古人的算法什么的,不然会遭鄙视的 都小有成就但别人只要愿意往往也能办到大部分 - 我不是说全部 - 开源软件实际上是学雷锋做好事,并无多少创意,只能说多少有几分新意吧 互相看不起古代文人相轻,现代程序员相轻。这一点,甚至直接体现在论坛回帖和BLOG的回复里面 没钱(文雅一点的说法就是,收入相对较低)古往今来从不缺有才无财的人,而古代很多秀才们往往希望能把自己的字画卖出去赚几个小钱,好供养老婆孩子还有高堂,却又不敢大声吆喝。何必那,现在已经21世纪了,拜托,这不是什么可耻的事情 却没人同情盗版软件就不说了,你可能还是坚持认为一切商业行为都是可耻的,所以盗版有理。那开源软件呢,你是不是也该出于良心考虑去Donate一把?可是我周围却从没见过甚至听说过有人去做过这种事情(阿门,好像我也没做过) 我知道我这么说一定会惹毛一大堆人,不过千万不要觉得我有恶意,我可一点都没有看不起他们的意思;相反那些开源软件的作者都是热心的网络大侠,技术好、人品也好。我只是感慨一下而已(不知道为啥一看到那个漂亮的Donate Button就联想到那种装了些硬币和毛票的瓷碗),不是想在这里下结论。欢迎拍砖。 扯太远了,以上仅代表个人观点,收笔~ ...[阅读全文]

posted @ | Feedback (6) |

摘要:正则表达式是设计为用来匹配文本的,可是论坛里头老是有这种问题: “谁能帮我写个正则表达式,验证从0到180的数字。” 我说,正则表达式不是用来干这个的,匹配和验证是不一样的概念,数据验证过程可能包含很复杂的逻辑,而这个时候要用文本匹配来模拟,就变得很不科学。虽然,这个问题对于正则表达式并不是无解,可以写成这样: ^([0-9]{1,2}|1[0-7][0-9]|180)$ 但用编程语言来判断显然方便直观的多,(x >= 0 && x <= 180)就可以了。你大概觉得上头那个正则表达式还不算复杂,那么看看这个: “匹配从874到142857的数字。” 那正则表达式就得写成: ^(87[4-9]|8[8-9][0-9]|9[0-9]{2}|[1-9][0-9]{3,4}|1[0-3][0-9]{4}|14[0-1][0-9]{3}|142[0-7][0-9]{2}|1428[0-4][0-9]|14285[0-7])$ 尽管还是可以做到,不过这个就有点走火入魔了。 不过呢,如果你非得这么做(比如客户逼你,我就是...),那我写了个小工具来干这个事情(写这种正则表达式,毕竟还是有规律可循)。下面是截图: 刚才那两个正则表达式,也是用这个工具生成的。代码在这里。 P.S.这个工具目前尚不支持小数和负数,也许你可以基于我提供的代码写个更完整的版本出来。(不过,真的有必要吗?)此外,这个工具尚未经过严格测试。发现问题了请给我发邮件或者在这里留言,多谢。...[阅读全文]

posted @ | Feedback (18) | Filed Under [ Patterns and Practice ]