在CFileDialog对话框中添加控件

合集下载

6.7 Windows通用对话框

6.7 Windows通用对话框

任务六对话框应用程序设计6.7 Windows通用对话框Windows通用对话框是由操作系统提供的任何应用程序都可以获得的对话框。

在VC++中,对这些对话框进行了封装,使用户在开发程序时可以方便的调用这些对话框。

6.7.1 使用“文件”对话框打开和保存文件主程序名:FileDialog1、添加两个按钮控件,一个编辑框控件,两个静态文本控件2、为控件关联变量3、编辑“打开”按钮,编辑程序void CFileDialogDlg::OnOpen(){// TODO: Add your control notification handler code here CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONL Y|OFN_OVERWRITEPROMPT, "All Files(*.TXT)|*.TXT||",AfxGetMainWnd());CString strPath,strText="";if(dlg.DoModal() == IDOK){strPath = dlg.GetPathName();m_OpenPath.SetWindowText(strPath);CFile file(strPath,CFile::modeRead);char read[10000];file.Read(read,10000);for(int i=0;i<file.GetLength();i++){strText += read[i];}file.Close();m_FileText.SetWindowText(strText);}}4、编辑“保存”按钮,编辑程序void CFileDialogDlg::OnSave(){// TODO: Add your control notification handler code hereCFileDialogdlg(FALSE,NULL,NULL,OFN_HIDEREADONL Y|OFN_OVERWRITEPROMPT, "All Files(*.TXT)|*.TXT||",AfxGetMainWnd());CString strPath,strText="";char write[10000];if(dlg.DoModal() == IDOK){strPath = dlg.GetPathName();if(strPath.Right(4) != ".TXT")strPath += ".TXT";m_SavePath.SetWindowText(strPath);CFile file(_T(strPath),CFile::modeCreate|CFile::modeWrite);m_FileText.GetWindowText(strText);strcpy(write,strText);file.Write(write,strText.GetLength());file.Close();}}6.7.2 使用“字体”对话框设置文本字体主程序名:FontDialog1、添加一个按钮控件,一个编辑框控件2、为控件关联变量3、编辑文本中的文字,程序BOOL CFontDialogDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization hereCString str = "";str +="有志者,事竟成,破釜沉舟,百二秦关终属楚\r\n";str +="苦心人,天不负,卧薪尝胆,三千越甲可吞吴\r\n";m_Text.SetWindowText(str);return TRUE; // return TRUE unless you set the focus to a control}4、“文字”按钮控件的程序编辑void CFontDialogDlg::OnFont(){// TODO: Add your control notification handler code hereCFont* TempFont = m_Text.GetFont(); //获取编辑框当前字体LOGFONT LogFont;TempFont->GetLogFont(&LogFont);CFontDialog dlg(&LogFont); //初始化字体信息if(dlg.DoModal()==IDOK){m_Font.Detach();LOGFONT temp;dlg.GetCurrentFont(&temp); //获取当前字体信息m_Font.CreateFontIndirect(&temp); //直接创建字体m_Text.SetFont(&m_Font); //设置字体}}6.7.3 使用“颜色”对话框设置文本背景颜色主程序名:ColorDialog1、添加一个按钮控件,一个静态文本对话框ID:IDD_COLORDIALOG_DIALOG对话框标:使用"颜色"对话框设置文本背景颜色按钮ID:IDC_COLOR按钮标题:颜色静态文本控件ID:IDC_STATIC静态文本控件标题:红笺小字,说尽平生易。

fxml dialogpane用法

fxml dialogpane用法

fxml dialogpane用法FXML DialogPane是JavaFX中的一个界面组件,用于创建弹窗对话框。

它可以用于显示用户交互或显示重要的信息。

下面将介绍如何使用FXML DialogPane 来创建自定义的弹窗对话框。

首先,在JavaFX应用程序中创建一个FXML文件,用于定义DialogPane的布局和样式。

可以使用JavaFX Scene Builder来创建FXML文件,或者手动编写FXML代码。

在FXML文件中,可以使用各种JavaFX控件来构建对话框的布局。

例如,可以添加Label、TextField、Button等控件,并通过CSS样式来设置它们的外观。

接下来,在Java代码中,加载FXML文件并创建DialogPane对象。

可以使用FXMLLoader类来加载FXML文件,并通过load()方法将其转换为Node对象。

然后,创建一个Dialog对象,并将刚才创建的DialogPane设置为其内容。

可以使用Dialog类的构造函数来创建Dialog对象,然后使用setDialogPane()方法将前面创建的DialogPane对象设置为其内容。

接着,可以设置Dialog的标题、按钮等属性。

可以使用setTitle()方法设置对话框的标题,使用setHeaderText()方法设置对话框的头部文本,使用setContentText()方法设置对话框的内容文本。

最后,显示对话框并等待用户的交互。

可以使用show()方法显示对话框,并使用showAndWait()方法等待用户对对话框的响应。

根据用户的操作,可以通过对话框的getDialogPane().getButtonData()方法获取到用户点击的按钮类型。

总结一下,对于FXML DialogPane的用法,首先需要创建一个FXML文件用于定义对话框的布局和样式。

然后,在Java代码中,加载FXML文件并创建DialogPane对象。

CommonDialog控件使用方法

CommonDialog控件使用方法

CommonDialog控件使用方法CommonDialog控件提供诸如打开和保存文件、设置打印选项、选择颜色和字体等操作的一组标准对话框。

运行 Windows 帮助引擎时,控件还能够显示帮助。

CommonDialog控件在Visual Basic和 Microsoft Windows 动态连接库Commdlg.dll 例程之间提供了接口。

为了用该控件创建对话框,必须要求Commdlg.dll 在 Microsoft Windows \System 目录下。

为了在应用程序中使用 CommonDialog控件,应将其添加到窗体上并设置属性。

控件显示的对话由控件的方法决定。

运行时,调用相应方法后将显示对话框或执行帮助引擎;设计时在窗体上将 CommonDialog控件显示成一个图标。

此图标的大小不能改变。

CommonDialog控件可以显示如下常用对话框:“打开”“另存为”“颜色”“字体”“打印”要使用 CommonDialog控件1. 若未添加 CommonDialog控件,则应从“工程”菜单中选定“部件”,将控件添加到工具箱中。

在标记对话的“控件”中找到并选定控件,然后单击“确定”按钮。

2. 单击工具箱中的“CommonDialog”控件并在窗体上绘制该控件。

在窗体上绘制 CommonDialog控件时,控件将自动调整大小。

象 Timer控件一样,CommonDialog控件在运行时不可见。

3. 运行时,请适当使用下表所列方法显示需要的对话。

显示“打开”和“另存为”对话框有了“打开”对话框就可指定驱动器、目录、文件扩展名和文件名。

“另存为”对话框在外观上与“打开”对话框相同,只是对话框的标题和文件名是暗淡的。

运行时选定文件并关闭对话框后,可用 FileName 属性获取选定的文件名。

要显示“打开”对话框1. 指定在“文件类型”列表框中显示的文件过滤器列表。

可用下列格式设置 Filter 属性:description1 | filter1 | description2 | filter2...Description 是列表框中显示的字符串——例如,"Text Files (*.txt)"。

一个定制CFileDialog对话框的实例

一个定制CFileDialog对话框的实例

一个定制CFileDialog对话框的实例很多程序员都喜欢让自己的代码运行效果与众不同。

Windows系统的应用程序打开某个文件一般使用的都是默认的CFileDialog。

但是这个默认的CFileDialog往往满足不了用户的要求。

我就碰到一个这样的用户,他的要求如下:1、在默认的CFileDialog对话框中加一个预览窗格,以便在选中ASCII文件时能看到所选文件的内容,也就是用*.txt 作为文件过滤条件。

2、在默认的CFileDialog对话框中加一个"全部"按钮来选择某个目录中所有的.txt文件。

3、如果选择的目录中没有.txt文件时,要将"全部"按钮disable,也就是置灰这个按钮。

实现上面这些需求必须要改装CFileDialog对话框。

当最后写完程序时,功能到是全都实现了,但在Windows 2000环境测试中,用户发现了这样一个问题:如果先选中某个文件,然后再去选某个文件夹,预览窗格仍然显示的那个文件的内容。

尽管在OnFileNameChange中对CDN_SELCHANGE进行了处理,为了获取所选的文件/路径名,也调用了CFileDialog::GetPathName。

但是即使是选中了文件夹,GetPathName仍然返回的是文件的名字。

即便尝试用其它的通知消息和函数,比如 CDN_FOLDERCHANGE 和 GetFileName,但仍旧存在同样的问题。

必须承认在Windows 2000中,CFileDialog是个不完美的对话框,确实存在上述问题。

正是有这些不完美,程序员们才忙得个不亦乐乎......那么到底如何判断用户选中的是文件还是文件夹呢?下面就让我们从用户需求开始,一个一个解决所碰到的问题。

首先简单介绍下本文引入的三个辅助类:CFileDialogHook;CFileDialogOwnerHook和CFileDlgHelper,这三个类很简单,其功能分别是:子类化文件对话框;子类化文件对话框的父窗口或宿主窗口,这两个类只在CFileDlgHelper类中使用,一些重要的处理都在CFileDlgHelper中。

1.修改例程10.1 给对话框增加编辑控件[共2页]

1.修改例程10.1 给对话框增加编辑控件[共2页]

13010.2 控件与控件类的连接在10.1节中设计的对话框功能太简单了,几乎什么也没有做。

本节将给例程10.1中的对话框增加功能。

修改例程10.1,要实现的功能是:单击对话框上的“显示文字”按钮时,能在对话框的编辑控件里输出一行文本。

这就要修改对话框模板,给对话框增加新的控件——编辑控件,编辑控件在对话框中使用非常频繁,常用来输入数据。

1.修改例程10.1 给对话框增加编辑控件(1)双击对话框的ID号IDD_DIALOG1,打开对话框资源编辑器,从控件栏里拖放一个编辑控件到对话框模板上。

右键单击编辑控件,选择“属性”,在打开的属性框里对编辑控件的属性进行修改,这里最重要的是控件的ID号,它是使用编辑控件的依据,如图10-5所示。

在编辑控件旁添加一个静态文本控件,用来对编辑控件进行说明。

从控件栏中拖放一个静态文本控件到编辑控件的右侧,并修改其属性,在“标题”栏里输入文字“输出文字”,以提示编辑控件的作用,如图10-6所示。

图10-5 在对话框里增加编辑控件图10-6 加入静态文本控件的对话框(2)控件资源的类支持。

前面讲过,对话框资源通过对话框类的构造器实现与对话框类的连接,工具栏资源通过工具栏类(CToolBar)的函数LoadToolBar()实现与工具栏类的连接。

同样,控件资源有时候也需要与控件类连接。

已经接触到的两种控件中,按钮控件的支持类是CButton类,编辑控件的支持类是CEdit类,这两个类都是从CWnd类派生的。

实现控件资源与控件类相连接的方法是CWnd类的GetDlgItem()函数。

如下的代码就实现了编辑控件IDC_EDIT1与其支持类CEdit类的连接,这些代码一般位于对话框类的函数中。

CEdit *pEdit; //生成CEdit类的指针pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);。

VC通用对话框类CFileDlg

VC通用对话框类CFileDlg

VC通用对话框类CFileDlgCFileDialog类封装了Windows常用的文件对话框。

常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。

可以用构造函数提供的方式使用CFileDialog,也可以从CFileDialog派生出自己的对话类并编写一个构造函数来适应你的需要。

每种情况下,对话框都与标准MFC对话框一样工作。

因为它们都是CCommonDialog类的派生类。

要使用CFileDialog,先用CFileDialog构造函数构造一个对象,当创建了一个对话框后,可以设置或修改m_ofn结构中的任何值,以初始化对话框控件的值或状态。

m_ofn结构是OPENFILENAME类型的。

要了解更多信息,可参阅联机文档“Win32 SDK”中的OPENFILENAME结构。

初始化对话框控件后,调用DoModal成员函数显示对话框并使用户输入路径和文件。

DoModal返回不论是用户选择了OK(IDOK)还是取消(IDCANCEL)按钮。

当DoModal返回IDOK,可以使用某一个CFileDIalog的公共成员函数获取用户输入的信息。

CFileDIalog包含许多保护成员,使你可以处理常用的共享冲突、文件名合法性检查、列表框改变通知。

这些保护成员对许多应用来说用处不大,因为缺省处理是自动的。

对这些函数来说,消息映射入口是不必要的,因为它们是标准虚函数。

可以使用Windows CommDlgExtendError函数判断在初始化对话框时是否是发生了错误,并获取关于错误的更多信息。

析构一个CFileDialog对象是自动,无须调用CDialog::EndDialog。

要使用户选用多个文件,可在调用DoModal之前设置OFN_ALLOWMULTISELECT标志。

你应提供文件名缓冲区来放置返回的多个文件名的列表,这通过用一个分配了的缓冲区指针替换m_ofn.lpstrFile来实现,要在创建了CFileDialog之后调用DoModal 之前进行此操作。

在CFileDialog对话框中添加控件

在CFileDialog对话框中添加控件

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

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

按照其思路从C派生了一个新的类C.在类中添加以下代码#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);// CIMPLEMENT_DYNAMIC(C, C)C(BOOL bOpen, LPCTSTR lpszDefExt, LPCTSTR lpsz,DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :C(bOpen, lpszDefExt, lpsz, 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_);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: //消毁对话框{LPOPEN lpOFN = (LPOPEN)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是新加的模板对话框句柄,它是C对话框的子部分,要获取C对话框的句柄需要用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){C dlg(TRUE);switch (pofn->hdr.code){case CDN_SELCHANGE:{//char sz];//// Get the path of the selected file.//if (CommDlg_OpenSave_Get(GetParent(hDlg), szFile, sizeof(szFile)) <= sizeof(szFile))//{// if(Get(szFile) != )// {// //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的值。

winform folderbrowserdialog的用法

winform folderbrowserdialog的用法

winform folderbrowserdialog的用法在WinForms应用程序中,FolderBrowserDialog控件是一个非常实用的工具,它允许用户通过图形化的界面选择一个文件夹。

使用FolderBrowserDialog控件可以轻松地让用户指定一个文件夹路径,而无需手动输入路径字符串。

下面是一个关于如何使用FolderBrowserDialog控件的详细指南:添加FolderBrowserDialog控件首先,你需要在你的WinForms项目中添加一个FolderBrowserDialog控件。

你可以在设计器中直接从工具箱拖放它到你的窗体上,或者通过代码创建它。

设置FolderBrowserDialog属性FolderBrowserDialog有一些有用的属性,如Description(显示的描述信息),RootFolder(选择的起始目录)等。

你可以根据需要设置这些属性。

显示FolderBrowserDialog要显示FolderBrowserDialog,你需要调用它的ShowDialog()方法。

这将打开一个标准的文件夹选择对话框,用户可以在其中选择一个文件夹。

获取选择的文件夹一旦用户选择了文件夹并关闭了文件夹选择对话框,你可以通过检查FolderBrowserDialog的SelectedPath属性来获取用户选择的文件夹路径。

处理FolderBrowserDialog事件你也可以处理FolderBrowserDialog的HelpRequest事件,以便为用户提供有关如何使用此对话框的帮助。

示例代码:csharp// 创建FolderBrowserDialog实例FolderBrowserDialog folderDlg = new FolderBrowserDialog();folderDlg.Description = "选择一个文件夹"; // 设置描述信息folderDlg.RootFolder = Environment.SpecialFolder.MyComputer; // 设置起始目录为我的电脑// 显示FolderBrowserDialog并获取用户的选择if (folderDlg.ShowDialog() == DialogResult.OK){string folderPath = folderDlg.SelectedPath; // 获取选择的文件夹路径// 在这里处理选择的文件夹,例如保存路径到变量或执行其他操作}通过以上步骤和代码示例,你应该能够掌握如何在WinForms应用程序中使用FolderBrowserDialog控件。

  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+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)。

相关文档
最新文档