这次在工作中碰到了文件浏览对话框,以前的时候也做过,不过没有做过文件浏览对话框同时实现打开文件,和打开文件夹两种功能的同时实现。通过查阅资料,一上午一开始使用SHBrowseForFolder()而后有使用CFileDialog,一开始以为SHBrowseForFolder只能用于文件夹,CFileDialog可以用于文件和文件夹的打开。但事实证明SHBrowseForFolder()是多么的好用和功能强大。只需要给BROWSEINFO.ulFlag添加上BIF_BROWSEINCLUDEFILE就可以了。而网上的CFileDialog说通过继承可以实现却很难搞定,至少找了许久没找到实例。但SHBrowseForFolder()的强大让我们不用去管CFileDialog。
在SHBrowseForFolder()中我们通过设定上回调函数,可以让我们的浏览对话框实现启动的时候显示上次浏览的位置。我们所需要做的,就是处理回调函数中的BFFM_INITIALIZED消息,在其中我们使用SendMessage发送BFFM_SETSELECTED,wParam表示lParam的指针式字符串指针,还是item id list指针。lParam表示字符串指针或者item id list指针。举例,我们要设置浏览对话框一开始就定格在c盘符下的Program Files,我们可以有两种方法。
第一种:SendMessage( hwnd, BFFM_SETSELECTED, TRUE, ( LPARAM )"c:\\program files" );
第二种: SendMessage( hwnd, BFFM_SETSELECTED, FALSE, ( LPARAM )pidlRoot );其中pidlRoot 是上述路径的id列表指针。我们通过SHCreateItemFromParseName(似乎是,由于这个没有用过,所以不清楚)
另外也可以实现一些其他的功能,例如验证文件有效性等等。需要做的就是熟悉回调函数中的相关消息,和消息中对应参数的含义。