在CFileDialog对话框中添加控件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在CFileDialog对话框中添加控件
关键字:CFileDialog扩展类,OFNHookProc
需求描述:昨天遇到一个用户需求,在CFileDialog对话框(SAVE)中加入一个Check , 一个Edit,一个Spin控件,dlg.Domodal()==IDOK返回时要同时获得Edit控件中的数据.
实现方法:如果只需要控制控件,用方法一即可,但如果需要获取数据,则只能用方法二。我最终用的就是方法二.
方法一: 首先查找MSDN关于CFileDialog扩展的实现描述,上网查到实现预览图片式的CFILEDIALOG的例子。按照其思路从CFileDialog派生了一个新的类CFileDialogEX.
在类中添加以下代码
#define WM_CHECKZOOMIN WM_USER+1856
public:
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); // CFileDialogEx
IMPLEMENT_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_ENABLEHOOK
m_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对话框的句柄