在CFileDialog对话框中添加控件.doc_第1页
在CFileDialog对话框中添加控件.doc_第2页
在CFileDialog对话框中添加控件.doc_第3页
在CFileDialog对话框中添加控件.doc_第4页
在CFileDialog对话框中添加控件.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在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; /1100 /前置声明-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(*.bmp0*.BMP0所有文件 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),TRUE); :EnableWindow(GetDlgItem(hDlg,IDC_SPIN_ZOOMNUM),TRUE); else bZoomIn = FALSE; /:SetWindowText(GetDlgItem(hDlg, IDC_EDIT_ZOOMNUM),); :EnableWindow(GetDlgItem(hDlg,IDC_EDIT_ZOOMNUM),FALSE); :EnableWindow(GetDlgItem(hDlg,IDC_SPIN_ZOOMNUM),FALSE); 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 szFileMAX_PATH; / Get the path of the selected file. /if (CommDlg_OpenSave_GetFilePath(GetParent(hDlg), szFile, sizeof(szFile) SetWindowText(buff); file.Close(); 结果测试。 CFileDlg dlg(TRUE);dlg.DoModal();通过指定资源ID , 可以使用Wizard添加处理消息, OK 这正是我想要的, 按照它的方法,很快就实现了需求,调用如下/.h / Dialog Data/AFX_DATA(CFileDlg)enum IDD = IDD_FILEDIALOG_EX ;/AFX_DATA public: BOOL bZoomIn; UINT nMul; /1100 afx_msg void OnBnClickedCheckZoomin();afx_msg void OnDeltaposSpinZoomnum(NMHDR *pNMHDR, LRESULT *pResult);virtual BOOL OnInitDialog();afx_msg void OnEnChangeEditZoomnum();afx_msg void OnEnKillfocusEditZoomnum(); /.cppCFileDialogEx: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(*.bmp0*.BMP0所有文件 0 *.*0 ); SetTemplate(0, IDD_FILEDIALOG_EX); BEGIN_MESSAGE_MAP(CFileDialogEx, CFileDialog) /ON_COMMAND() ON_BN_CLICKED(IDC_CHECK_ZOOMIN, &CFileDialogEx:OnBnClickedCheckZoomin) ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_ZOOMNUM, &CFileDialogEx:OnDeltaposSpinZoomnum) ON_EN_CHANGE(IDC_EDIT_ZOOMNUM, &CFileDialogEx:OnEnChangeEditZoomnum) ON_EN_KILLFOCUS(IDC_EDIT_ZOOMNUM, &CFileDialogEx:OnEnKillfocusEditZoomnum)END_MESSAGE_MAP() void CFileDialogEx:OnBnClickedCheckZoomin() / TODO: 在此添加控件通知处理程序代码 bZoomIn = !bZoomIn; GetDlgItem(IDC_EDIT_ZOOMNUM)-EnableWindow(bZoomIn); GetDlgItem(IDC_SPIN_ZOOMNUM)-EnableWindow(bZoomIn); void CFileDialogEx:OnDeltaposSpinZoomnum(NMHDR *pNMHDR, LRESULT *pResult) LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR); / TODO: 在此添加控件通知处理程序代码 if (pNMUpDown-iDelta 0) if (nMul 1) nMul-; else if (nMul SetWindowText(lpstr); *pResult = 0; BOOL CFileDialogEx:OnInitDialog() CFileDialog:OnInitDialog(); / TODO: 在此添加额外的初始化 GetDlgItem(IDC_EDIT_ZOOMNUM)-EnableWindow(FALSE); GetDlgItem(IDC_SPIN_ZOOMNUM)-EnableWindow(FALSE); GetDlgItem(IDC_EDIT_ZOOMNUM)-SetWindowText(_T(1); bZoomIn = FALSE; nMul = 1; return TRUE; / return TRUE unless you set the focus to a control / 异常: OCX 属性页应返回 FALSE void CFileDialogEx:OnEnChangeEditZoomnum() / TODO: 如果该控件是 RICHEDIT 控件,它将不 / 发送此通知,除非重写 CFileDialog:OnInitDialog() / 函数并调用 CRichEditCtrl().SetEventMask(), / 同时将 ENM_CHANGE 标志“或”运算到掩码中。 / TODO: 在此添加控件通知处理程序代码 CString strText; GetDlgItem(IDC_EDIT_ZOOMNUM)-GetWindowText(strText); nMul = _wtoi(strText); if ( (nMul 100) ) if (nMul 100) nMul = 100; wchar_t buff10; _itow( nMul, buff, 10 ); LPCTSTR lpstr = (LPCTSTR)buff; GetDlgItem(IDC_EDIT_ZOOMNUM)-SetWindowText(lpstr); void CFileDialogEx:OnEnKillfocusEditZoomnum() / TODO: 在此添加控件通知处理程序代码 CString strText; GetDlgItem(IDC_EDIT_ZOOMNUM)-GetWindowText(strText); n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论