自定义FileDialog的外观

来源:互联网 发布:人工智能电影剧情 编辑:程序博客网 时间:2024/04/30 09:11

在.NET里面,MS提供了OpenFileDialog和SaveFileDialog,但是MS暴露给我们的方法和属性很少。有的时候我们需要修改他们的外观,比如修改默认的显示风格,默认的排序,甚至要求在Dialog中浏览图片等。这个时候我们除了重做一个Dialog那么就只能依靠消息来达到我们的目的。

关于如果在Dialog中浏览图片的文章,大家可以参考下CodeProject上的http://www.codeproject.com/KB/dialog/OpenFileDialogEx.aspx 这篇文章。

那么如何来改变默认的显示方式,以及如果是Details形式的话,如何更改默认的排序属性呢,这个就是我这篇文章需要介绍的内容。

 

我先说一下大致的思路:

我们用Spy++看到,点击列排序的时候是LVM_SORTITEMS消息

通过MSDN我们知道,发送LVM_SORTITEMS需要同时提供排序的方法,因此要把你排序的方法放到SendMessage的参数中
在排序的方法中通过LVM_FINDITEM和LVM_GETITEMTEXT等消息获得需要排序的列
然后比较并且返回比较结果

MSDN里面有个例子,大家可以参考下: http://support.microsoft.com/kb/170884/

 

好了,接下来就说下我实现的方式吧,我这次主要是实现对日期列的排序,如果大家需要用到其他的列的话,请注意修改排序的代码


  首先,我们需要定义两个enum,一个是用来表示默认的显示类型,一个是表示排序类型,具体代码如下

 

 

 

然后需要定义一些消息常量以及结构,这个没什么说的了,都是通过MSDN查到的

 

 

接下来就是API的引用,这里主要用到SendMessage和FindWindowEx

 

 

上面这些代码我建议大家专门放到一个类里面,以后用到的所有的API方面的东西都可以从这个类里面获得

 

以下就是FileDialogExtender类的内容,这个类继承自我的HookWndProc类,

这个类的代码在以前写的那篇NativeWindow的文章,建议大家先去看看

http://blog.csdn.net/lovefootball/archive/2007/09/14/1784882.aspx

 

 

 

 

调用的方法如下:

 

 

 

 

恩,大致的功能就实现了

 

大家需要注意的是设置完默认显示为Details格式的时候,他默认的是名称排序,

这个时候我们不仅要去掉名称列上的三角图标,还要改成其他列排序,

而且还需要发送LVM_SETSELECTEDCOLUMN消息,告诉对话框,我们选择的是哪个列

 

大家如果有兴趣的话,可以参照这个例子进行扩展

首先列的排序应该是做成属性,在外面调用的时候配置的

另外Details形式下还可以默认显示成其他的列,而不是对话框给我们的四个列

或者可以改变列的顺序,把日期弄到第一列等等

 

 

欢迎转载,请注明出处~~