




已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年手机壳购销合同协议
- 2025广东水利电力职业技术学院招聘32人模拟试卷及1套完整答案详解
- 2025年合同解除申请书范本
- 2025一级建造师《项目管理》考点:建筑工程合同管理与履行
- 2025私人租赁合同协议范本
- 2025年大型商场供用电力合同
- 2025年河北沧州泊头市中医医院招聘专业技术人员29名模拟试卷有完整答案详解
- 《2025城市房屋租赁代理合同》
- 2025年泰安新泰市市属国有企业公开招聘模拟试卷及参考答案详解
- 2025年甘肃省定西市临洮县中铺镇选聘摩云村文书考前自测高频考点模拟试题及答案详解(夺冠)
- 网络交友新时代课件
- 2024年江南大学公开招聘辅导员笔试题含答案
- 议论文写作入门基础任务式课件2025-2026学年统编版高中语文必修上册
- 佛州驾照考试试题题库及答案
- 2025四川能投合江电力有限公司员工招聘11人笔试备考题库及答案解析
- 生物安全实验室管理体系文件
- 2025年小学部分国防教育知识竞赛答案
- 【政史地 江苏卷】2025年江苏省高考招生统一考试高考真题政治+历史+地理试卷(真题+答案)
- 借车给他人免责协议书
- 气压止血带操作评分标准
- 制药工程导论-化学制药技术与工程
评论
0/150
提交评论