分享
 
 
 

横秋扫盲系列(2): CFileDialog 文件对话框 -- 2005-8-14 17:22:32

王朝vc·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

一:参数设置

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;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有