在CFileDialog对话框中添加控件

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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对话框的句柄

相关文档
最新文档