当前位置:文档之家› 在CFileDialog对话框中添加控件

在CFileDialog对话框中添加控件

在CFileDialog对话框中添加控件关键字:CFileDialog扩展类,OFNHookProc需求描述:昨天遇到一个用户需求,在CFileDialog对话框(SAVE)中加入一个Check , 一个Edit,一个Spin控件,dlg.Domodal()==IDOK返回时要同时获得Edit控件中的数据.实现方法:如果只需要控制控件,用方法一即可,但如果需要获取数据,则只能用方法二。

我最终用的就是方法二.方法一: 首先查找MSDN关于CFileDialog扩展的实现描述,上网查到实现预览图片式的CFILEDIALOG的例子。

按照其思路从CFileDialog派生了一个新的类CFileDialogEX.在类中添加以下代码#define WM_CHECKZOOMIN WM_USER+1856public:BOOL bZoomIn;UINT nMul; //[1~100]//前置声明---------------BOOL NEAR CALLBACK HandleNotify(HWND hDlg, LPOFNOTIFY pofn);UINT_PTR CALLBACK OFNHookProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); // CFileDialogExIMPLEMENT_DYNAMIC(CFileDialogEx, CFileDialog)CFileDialogEx::CFileDialogEx(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd){//这个四个常用标识位m_ofn.Flags |= OFN_ENABLETEMPLATE |OFN_HIDEREADONLY|OFN_EXPLORER; //OFN_EXPLORER | OFN_ENABLEHOOKm_ofn.lpstrTitle = _T("高级保存对话框");m_ofn.hInstance = AfxGetInstanceHandle();m_ofn.lpstrFilter = _T("*.bmp\0*.BMP\0所有文件 \0 *.*\0 ");m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILEDIALOG_EX);m_ofn.lpfnHook = (LPOFNHOOKPROC)OFNHookProc;}//Hook function for the Comm Dlg//在这里处理我们感兴趣的消息,想要哪个,截哪个!UINT_PTR CALLBACK OFNHookProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg){case WM_INITDIALOG: //初始化对话框上的控件if(SendDlgItemMessage(hDlg, IDC_CHECK_ZOOMIN, BM_GETCHECK,0,0) == BST_UNCHECKED){::EnableWindow(GetDlgItem(hDlg,IDC_EDIT_ZOOMNUM),FALSE);::EnableWindow(GetDlgItem(hDlg,IDC_SPIN_ZOOMNUM),FALSE);::SetWindowText(GetDlgItem(hDlg, IDC_EDIT_ZOOMNUM),_T("1"));//ShowWindow(button,SW_HIDE);}break;case WM_DESTROY: //消毁对话框{LPOPENFILENAME lpOFN = (LPOPENFILENAME)GetWindowLong(hDlg, DWL_USER);}break;case WM_COMMAND: //这里处理,IDC_CHECK_ZOOMIN命令{if ((HIWORD(wParam) == BN_CLICKED) && (LOWORD(wParam) ==IDC_CHECK_ZOOMIN)){BOOL bZoomIn = TRUE;if(SendDlgItemMessage(hDlg, IDC_CHECK_ZOOMIN, BM_GETCHECK, 0, 0) == BST_CHECKED){bZoomIn = TRUE;::EnableWindow(GetDlgItem(hDlg,IDC_EDIT_ZOOMNUM),TRU E);::EnableWindow(GetDlgItem(hDlg,IDC_SPIN_ZOOMNUM),TRU E);}else{bZoomIn = FALSE;//::SetWindowText(GetDlgItem(hDlg,IDC_EDIT_ZOOMNUM),"");::EnableWindow(GetDlgItem(hDlg,IDC_EDIT_ZOOMNUM),FAL SE);::EnableWindow(GetDlgItem(hDlg,IDC_SPIN_ZOOMNUM),FAL SE);}HWND hParent = GetParent(hDlg); // 注意hDlg是新加的模板对话框句柄,它是CFileDialog对话框的子部分,要获取CFileDialog对话框的句柄需要用GetParent函数PostMessage(hParent,WM_CHECKZOOMIN,(WPARAM)bZoomIn,(LPARAM)0 );bZoomIn = FALSE;}break;case WM_NOTIFY:HandleNotify(hDlg, (LPOFNOTIFY)lParam);break;}return 0;}//这里处理notify 消息BOOL NEAR CALLBACK HandleNotify(HWND hDlg, LPOFNOTIFY pofn){CFileDialogEx dlg(TRUE);switch (pofn->hdr.code){case CDN_SELCHANGE:{//char szFile[MAX_PATH];//// Get the path of the selected file.//if (CommDlg_OpenSave_GetFilePath(GetParent(hDlg), szFile, sizeof(szFile)) <= sizeof(szFile))//{// if(GetFileAttributes(szFile) != FILE_ATTRIBUTE_DI RECTORY)// {// //Should we load the Pic// if(SendDlgItemMessage(hDlg, IDC_CHECK1,BM_GETCHECK,0,0) == BST_UNCHECKED)// dlg.ShowImagepreview(hDlg, szFile);// }//}}break;case CDN_FILEOK:{int num;GetDlgItemInt(hDlg,IDC_EDIT_ZOOMNUM,&num,FALSE);if(SendDlgItemMessage(hDlg, IDC_CHECK_ZOOMIN, BM_GETCHECK, 0, 0) == BST_CHECKED){dlg.bZoomIn = TRUE;}elsedlg.bZoomIn = FALSE;return FALSE;}break;}return(TRUE);}原计划从回调函数得到触发消息,然后用PostMessage的方式将自定义的WM_CHECKZOOMIN消息发给主窗口,在主窗口中更新我新加的变量bZoomIn和nMul的值。

但调试发现我新定义的CFileDialogEX类中的WM_CHECKZOOMIN的消息响应函数总是无法进入。

进一步调式确定消息确实是发送成功了,而且窗口句柄也没有错,但就是进入不了我定义的响应函数。

经过资料查询和思索初步推理: CFileDialog的消息处理是封闭的,自动的,在没有用钩子的情况下我们是无法将自己的消息函数插入其中并能自己处理的。

从MSDN给的说明也可以看出,它推荐PostMessage传输的也只是系统定义消息如WM_COMMAND,也就是说你可以控制它的控件做某项动作或显示隐藏控件,移动控件的位置。

一切回到了原点,此路不通,继续寻找新的方法!!!!!!方法二:看到一篇文章.softist./programemo/cfiledialog/cfiledialog.htm,给我指了一条明路CFileDialog的个性化(VC++)本文是为标准的文件选择对话框添加控件以扩展它的功能。

为了做到这点,要把CFileDialog 类派生,还要准备粘贴控件用的对话框模板,把控件的消息响应入口追加到MESSAGE-MAP中。

例程。

文件选择对话框在选择文本文件时,可以预览这个文件的容。

1.生成对话框模板。

作一个对话框的资源,比如ID为IDD_DIALOG1。

其属性如下设定。

IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 187, 128STYLE WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDRENFONT 9, "MS Sans Serif"BEGINLTEXT "Static",stc32,7,7,173,114EDITTEXT IDC_EDIT_PREVIEW,7,18,102,30,ES_MULTILINE |ES_AUTOHSCROLL | ES_WANTRETURNPUSHBUTTON "Button1",IDC_BUTTON_PREVIEW,143,36,37,23END2.追加控件。

首先追加一个ID为stc32的大一点的静态文字控件(Static)。

然后在它的下面,追加预览用的多行编辑框(ID=IDC_EDIT_PREVIEW)和起动预览用的按钮(ID=IDC_BUTTON_PREVIEW)。

相关主题