C++研究

C++细节深度探索及软件工程

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  37 随笔 :: 0 文章 :: 74 评论 :: 0 Trackbacks

转自:http://blog.csdn.net/vcmute/archive/2005/09/01/469487.aspx
作者tag
一:参数设置
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;

posted on 2007-06-18 19:31 常兴龙 阅读(1492) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


> hi的博客