| 一:参数设置 a)初始化目录 如我的电脑 等 dlg.m_ofn.lpstrInitialDir=_T('::{20D04FE0-3AEA-1069-A2D8-08002B30309D}'); b)Win2000方式 if(GetVersion()<0x80000000) dlg.m_ofn.lStructSize += 12;//即88 c)扩展对话框 一般在对话框DoModal前设置支持模版 dlg.m_ofn.Flags |= OFN_ENABLETEMPLATE; dlg.m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILE_DIALOG); 如果要改变内嵌CFileDialog的位置,添加一个ID为stc32的Static即可 二:重载对话框 a)修改按钮文本 通过重载,或设置callback class CFileDialogEng:public CFileDialog { public: void OnInitDone() { CWnd *pWnd,*pParent=GetParent(); if(pParent) { pParent->SetWindowText(m_bOpenFileDialog?'Open':'Save as'); #define SetEngText(id,txt) if(pWnd = pParent->GetDlgItem(id))pWnd->SetWindowText(txt) SetEngText(IDOK,'&OK'); } } } b)修改目录(如自写几个按钮模拟Win2000左边的列表点击) GetParent()->SendMessage(CDM_SETCONTROLTEXT, edt1, (LPARAM)(LPCTSTR)strFolder); GetParent()->SendMessage(WM_COMMAND, MAKEWPARAM(IDOK, BN_CLICKED),(LPARAM)GetDlgItem(IDOK)->GetSafeHwnd()); c)设置查看模式 Paul推荐了在Init后处理 LRESULT OnPostInit(WPARAM w,LPARAM l) { CWnd* pshell = GetParent()->GetDlgItem(0x461); if (pshell) { pshell->SendMessage(WM_COMMAND, ODM_VIEW_THUMBS); } return 0; } 在OnInitDialog或OnInitDone中 PostMessage(MYWM_POSTINIT); 其中enum LISTVIEWCMD {ODM_VIEW_ICONS = 0x7029, ODM_VIEW_LIST = 0x702b, ODM_VIEW_DETAIL= 0x702c, ODM_VIEW_THUMBS= 0x702d, ODM_VIEW_TILES = 0x702e, }; 详情见MSDN Magazine -- March 2004 http://msdn.microsoft.com/msdnmag/issues/04/03/CQA/ List View Mode, SetForegroundWindow, and Class Protection 但如果设置为REPORT即DETAIL风格,建议使用以下,相对来说不闪一点,因为在OnInitDialog中处理 BOOL OnInitDialog() { CFileDialog::OnInitDialog(); CWnd *parent = GetParent(); if ( parent != NULL ) { parent->PostMessage(WM_COMMAND, 40964, NULL);//0xA004 } return TRUE; } 详见: Detail View in FileOpen Dialog http://codeguru.com/Cpp/W-D/dislog/commondialogs/article.php/c5031/ 三: IShellBrowser 接口 July 9, 2000 就在 Q157247 出现了 WM_GETISHELLBROWSER ,但一直没公布 #ifndef WM_GETISHELLBROWSER #define WM_GETISHELLBROWSER (WM_USER+7) #endif IShellBrowser *pshb=(IShellBrowser *)GetParent()->SendMessage(WM_GETISHELLBROWSER,0,0); 详情见 jiangsheng 的 Better Late Than Never http://blog.joycode.com/jiangsheng/archive/2004/09/17/33756.aspx P.S.如何扩充多选文件缓冲区 使用CFileDialog类并设置OFN_ALLOWMULTISELECT标志时,OPENFILENAME结构体的lpstrFile成员是一个指向用户申请分配的缓冲区,里面接受所选的路径和文件名列表,这个列表的每一项由一个NULL隔开,最末以两个NULL结束。 nMaxFile成员指明了缓冲区的大小,如果所选择的文件名的加起来的总长度超过了此值,则DoModal函数返回IDCANCEL,如果用户试图打开超过缓冲区大小的文件集的话,CommDlgExtendedError()将返回FNERR_BUFFERTOOSMALL,这时候,lpstrFile的前两个byte将会包含实际需要的缓冲区的字节数。 如果是在Windows NT 4.0下,能被拷贝到lpstrFile缓冲区的字节数被限制在2562字节以内,如果超过将被截断,但可以通过安装 Service Pack 2 解决 默认修改了nMaxFile就可以解决缓冲区不足的问题,但GetOpenFileName限制了复制到缓冲区中的文件名的总长度,一般32K,所以若要打开大量文件,参见 http://blog.joycode.com/jiangsheng/archive/2004/11/22/39413.aspx 另外打开并正常关闭对话框后如果程序不退出就不能删除该目录,请在dlg打开前 dlg.m_ofn.Flags |= OFN_NOCHANGEDIR;
|