vc++对话框制作与编程-Dialog
- 格式:pdf
- 大小:1.79 MB
- 文档页数:28
12.对话框和对话框类CDialog对话框经常被使用,因为对话框可以从模板创建,而对话框模板是可以使用资源编辑器方便地进行编辑的。
1.模式和无模式对话框对话框分后两种类型,模式对话框和并无模式对话框。
1.模式对话框一个模式对话框就是一个存有系统菜单、标题栏、边线等的弹出式窗口。
在建立对话框时选定ws_popup,ws_sysmenu,ws_caption和ds_modalframe风格。
即使没选定ws_visible风格,模式对话框也可以被表明。
创建对话框窗口时,将发送wm_initdialog消息(如果指定对话框的ds_setfont风格,还有wm_setfont消息)给对话框过程。
对话框过程(dialogboxprocedure)不是对话框窗口的窗口过程(windowprocedure)。
在win32里,对话框的窗口过程由windows系统提供更多,用户在建立对话框窗口时提供更多一个对话框过程由窗口过程调用。
对话框窗口被创建之后,windows使得它成为一个激活的窗口,它保持激活直到对话框过程调用::enddialog函数结束对话框的运行或者windows激活另一个应用程序为止,在激活时,用户或者应用程序不可以激活它的所属窗口(ownerwindow)。
从某个窗口建立一个模式对话框时,windows自动地严禁采用(disable)这个窗口和它的所有子窗口,直至该模式对话框被停用和封存。
虽然对话框过程可以enable所属窗口,但是这样搞就丧失了模式对话框的促进作用,所以不引导这样搞。
windows创建模式对话框时,给当前捕获鼠标输入的窗口(如果有的话)发送消息wm_canclemode。
收到该消息后,应用程序应该终止鼠标捕获(releasethemousecapture)以便于用户能把鼠标移到模式对话框;否则由于owner窗口被禁止,程序将失去鼠标输入。
为了处置模式对话框的消息,windows已经开始对话框自身的消息循环,暂时掌控整个应用程序的消息队列。
VC中自己创建对话框的方法这里讲在VC中不需要打开MFC工程,通过代码直接创建一个对话框,我看这个对话框比MFC的漂亮多了,而且要写会代码不需要研究MFC就直接开发新的工程.先打开VC++ 6.0 版本, 第一步:创建一个工程名为:Main Dialog的Win32 Application。
创建过程如下:打开File菜单中New,选自Win32 Application,工程名为:Main Dialog,点击OK,再选自A simple Win32 application。
点击Finish,再点击OK.(见图1)第二步:创建资源脚本。
再打开File菜单中New,选自File选项的Resource Script(就是资源脚本),文件名为Dialog,点击OK。
(见图2)第三步:插入对话框。
刚才建立的脚本Dialog显示为Dialog.rc,就在Dialog.rc上面点击鼠标右键Insert(插入)Resource中选自插入Dialog(对话框),点击New(新建),这样对话框插入完毕。
(见图3)第四步:添加resource.h。
我们把第四步插入的对话框ID改为IDD_MAIN ,在FileView中有个Header Files的文件,上面点击右键,选择Add Files to Folder...(添加文件到目录),弹出一个工程目录窗口,中间找到resource.h,然后OK了(添加)。
(见图4)第五步:复制代码。
双击Main Dialog.cpp,我们写代码的位置出现了(见图5),那里有几行代码,把它们全部删掉,下面已经准备好的代码全部复制到那里,编译,执行,您的是否成功了?#include "stdafx.h"#include "resource.h"#include <windowsx.h>BOOL WINAPI Main_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);BOOL Main_OnInitDialog(HWND hwnd,HWND hwndFocus,LPARAM lParam);void Main_OnCommand(HWND hwnd,int id,HWND hwndCtl, UINT codeNotify);void Main_OnClose(HWND hwnd);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){DialogBox(hInstance,MAKEINTRESOURCE(IDD_MAIN),NUL L,Main_Proc);return 0;}BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){switch(uMsg){HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);}return FALSE;}BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam){return TRUE;}void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify){switch(id){case IDOK:{MessageBox(hwnd,TEXT("Thank you build me!"),TEXT("Happy"),MB_OK);}break;default:break;}}void Main_OnClose(HWND hwnd) {EndDialog(hwnd, 0);}执行以后的对话框图(见图6)是不是比MFC的漂亮!这对话框的缺点就是弹出时不是出现在显示器中间而老是出在显示器左上角,我不知道怎么调整,可定有办法把它显示在中间,有人知道解决的技巧,请教一下,我对他必有回报,我自己知道的一些会献给他!。
实验项目三:文档视图结构实验学时:6实验类型:设计性实验目的:1.理解文档-视图结构2.掌握SDI程序结构和开发3.理解MDI程序结构和开发4.设计支持多文档多视图结构的应用程序实验内容与说明第一部分:对话框制作与编程本例将设计一个能够应用对话框进行参数选择、并运用这些参数进行窗口绘图的MFC程序。
请通过此例掌握对话框资源的制作以及模态对话框的编程。
同时理解文档视图结构。
第一步:新建工程新建一个MFC AppWizard(exe)类型的工程,工程取名为DlgDemo。
注意路径可能与本地磁盘不同。
修改应用程序类型为Single document。
保持其它设置不变,点击Finish按钮(包括随后的OK按钮)结束工程的创建。
第二步:窗口绘图为简单起见,本例只打算在视图窗口内绘制一个矩形,该矩形的长度、宽度以及它们的单位都通过对话框进行选择。
这些关于图形的关键数据一般应该保存在文档类中,视图类在需要绘图时,就从文档类中读取这些数据,这是文档视图结构的基本运行方式。
为此,需要向文档类CDlgDemoDoc中添加数据成员。
在工程的类视图ClassView中右键单击文档类CDlgDemoDoc,选择Add Member Variable...,弹出添加数据成员的对话框。
在下列对话框中添加数据成员m_nWidth。
继续上述步骤,添加数据成员m_nHeight。
继续上述步骤,添加数据成员m_nUnit。
为提供对上述三个protected数据成员的访问,在文档类中提供public访问函数。
在工程的类视图ClassView中右键单击文档类CDlgDemoDoc,选择Add Member Function...,弹出添加成员函数的对话框。
在下列对话框中添加成员函数GetWidth以访问数据成员m_nWidth。
继续上述步骤,在下列对话框中添加成员函数GetHeight以访问数据成员m_nHeight。
继续上述步骤,在下列对话框中添加成员函数GetUnit以访问数据成员m_nUnit。
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 之前进行此操作。
实验项目三:文档视图结构实验学时:6实验类型:设计性实验目的:1.理解文档-视图结构2.掌握SDI程序结构和开发3.理解MDI程序结构和开发4.设计支持多文档多视图结构的应用程序实验内容与说明第一部分:对话框制作与编程本例将设计一个能够应用对话框进行参数选择、并运用这些参数进行窗口绘图的MFC程序。
请通过此例掌握对话框资源的制作以及模态对话框的编程。
同时理解文档视图结构。
第一步:新建工程新建一个MFC AppWizard(exe)类型的工程,工程取名为DlgDemo。
注意路径可能与本地磁盘不同。
修改应用程序类型为Single document。
保持其它设置不变,点击Finish按钮(包括随后的OK按钮)结束工程的创建。
第二步:窗口绘图为简单起见,本例只打算在视图窗口内绘制一个矩形,该矩形的长度、宽度以及它们的单位都通过对话框进行选择。
这些关于图形的关键数据一般应该保存在文档类中,视图类在需要绘图时,就从文档类中读取这些数据,这是文档视图结构的基本运行方式。
为此,需要向文档类CDlgDemoDoc中添加数据成员。
在工程的类视图ClassView中右键单击文档类CDlgDemoDoc,选择Add Member Variable...,弹出添加数据成员的对话框。
在下列对话框中添加数据成员m_nWidth。
继续上述步骤,添加数据成员m_nHeight。
继续上述步骤,添加数据成员m_nUnit。
为提供对上述三个protected数据成员的访问,在文档类中提供public访问函数。
在工程的类视图ClassView中右键单击文档类CDlgDemoDoc,选择Add Member Function...,弹出添加成员函数的对话框。
在下列对话框中添加成员函数GetWidth以访问数据成员m_nWidth。
继续上述步骤,在下列对话框中添加成员函数GetHeight以访问数据成员m_nHeight。
继续上述步骤,在下列对话框中添加成员函数GetUnit以访问数据成员m_nUnit。
此时可以看到:在头文件DlgDemoDoc.h中,文档类CDlgDemoDoc中增加了如下数据成员和成员函数。
切换到源文件DlgDemoDoc.cpp中,定义刚才添加的三个函数。
同时修改文档类CDlgDemoDoc的构造函数(在源文件DlgDemoDoc.cpp中),在其中初始化这三个数据成员。
对于数据成员m_nWidth和m_nHeight,数据4和2分别表示数值,至于它们代表的单位还需要根据数据成员m_nUnit的取值来定。
当m_nUnit取值为0时,单位表示英寸(Inches),此时可以把映射模式设为MM_LOENGLISH。
当m_nUnit取值为1时,单位表示毫米(millimeters),此时可以把映射模式设为MM_LOMETRIC。
当m_nUnit取值为2时,单位表示像素(Pixels),此时把映射模式设为MM_TEXT。
这在下面的函数中会体现出来。
因此,上述构造函数取值,表示默认绘制的矩形宽为4(m_nWidth = 4),高为2(m_nHeight = 2),它们的单位为英寸(m_nUnit = 0)。
最后在视图类CDlgDemoView中读取文档类存放的数据(宽、高和单位),然后绘制矩形。
打开源文件DlgDemoView.cpp中的函数CDlgDemoView::OnDraw,这是实现绘图的主战场。
上述程序,首先通过文档类CDlgDemoDoc的指针pDoc读取文档中的数据,然后分别存放到变量width、height、unit中。
接着创建一把粉色(RGB (255, 0, 255))的画刷brush。
最后根据不同的单位取值,分别设置不同的映射模式,并调用函数Rectangle绘制矩形。
请注意该函数的参数取值(为什么有正负之分?)。
运行该程序,可以得到如下结果。
第三步:制作对话框资源为了实现从对话框动态选择设计参数,下面首先制作对话框资源。
需要设计的对话框如下所示。
在工程的资源视图ResourceView中,展开Dialog项,然后单击右键,选择Insert Dialog命令。
此时程序进入对话框设计界面。
在待设计的对话框上右键单击,选择属性Properties,首先设置该对话框的属性。
在对话框属性(Dialog Properties)窗口,主要设置该对话框的ID为IDD_DLG_OPTIONS,标题Caption为Options。
至于对话框的风格Style,可以浏览一遍,暂时不用设置。
不过,也可以进行一些设置,看看它们的效果。
按回车键,使得该属性窗口消失。
此时,待设计的对话框的标题变为Options。
把左键放置在对话框右下角的锚点上,待光标变成45度倾斜的双箭头,按下并拖动,以改变对话框的的大小。
从控件工具箱Controls中分别拖动两个标签(Static Text)和两个编辑框(Edit Box),放置到对话框合适的位置。
在标签控件上右键单击,选择属性Properties。
在属性窗口修改两个标签的Caption 分别为Width和Height,如下图所示。
同时修改两个编辑框控件的ID分别为IDC_WIDTH和IDC_HEIGHT。
如下是设置两个编辑框控件属性时的窗口。
从控件工具箱中拖动一个组选框(Group Box)控件放置到对话框中,拖动锚点以调整它的大小。
在该控件的属性窗口设置Caption为Unit。
注意不要设置ID。
从控件工具箱中连续拖动三个单选按钮(Radio Button)放置到组选框中的合适位置,注意一定要连续。
右键依次单击三个按钮,分别进行设置。
其中第一个按钮的属性最为重要,请按照下图设计。
选项Group使得接下来的按钮自动成为一组,它们只需要设置一个ID即可。
对余下两个按钮分别如下设置它们的Caption。
注意不要设置ID。
从控件工具箱中拖动一个按钮控件(Button)放置到对话框的合适位置。
如下修改它的属性。
选项Group使得先前控件的分组自动结束,因为它标志着下一组的开始(虽然后面再没有其它控件了)。
为使得对话框显得美观,可以使用Layout菜单(或者屏幕下方的Dialog工具栏)中的命令调整它们的位置和大小,使得各控件大小相同、分布均匀,并对齐。
点击测试Test按钮(或Ctrl+T),设计完成之后的对话框如下所示。
第四步:生成对话框类设计出来的每个对话框都需要封装为一个类。
在处于设计状态的Options对话框上任何一个位置左键双击,同时弹出添加类(Adding a Class)的窗口和MFC类向导(MFC ClassWizard)。
直接点击OK按钮生成一个新类。
在随后弹出的创建新类New Class窗口中键入该对话框类的名字。
注意按照惯例,MFC类的名字都以大写字母C为前缀。
可以点击Change...按钮改变该类所在头文件和源文件的名字。
点击OK按钮完成新类的建立。
New Class窗口消失后,MFC ClassWizard激活为当前窗口。
第五步:添加控件变量生成对话框类之后,接下来需要为该类添加控件变量。
定义控件变量是为了让对话框中控件的取值有效地与类中的数据成员进行双向数据交换(例如把编辑框中的数据保存到程序中,或者从程序中读取数据显示在编辑框中)。
这些都可以借助类向导轻松完成。
点击MFC ClassWizard窗口的Member Variables选项卡。
确保Class Name下拉列表框中选中的是COptionsDialog类。
双击Controls IDs列表框中的控件ID,例如IDC_WIDTH,弹出添加数据成员(Add Member Variable)对话框。
在数据成员名称(Member variable name)列表框中键入合适的取名,确保类型(Category)列表框中选中的是Value,同时选择数据成员类型(Variable type)为int。
点击OK按钮结束数据成员m_nWidth的添加。
对于数据成员m_nWidth来说,还可以限定用户在编辑框中所输入数据的范围,例如假定该值仅限于1~10之间,超过该值之后为非法数据而不接受。
这可以在Member Variable选项卡下方的编辑框中输入相关数据而限定。
同样对ID为IDC_HEIGHT的编辑框控件添加数据成员m_nHeight。
同样限定该数据成员的有效取值范围。
后对ID 为IDC_UNIT 的组选按钮添加数据成员m_nUnit 。
最如果添加错误,可以选择Delete Variable 按钮删除该数据成员。
六步:添加按钮单击事件处理函数对话框ions 个按钮Reset ,点击它的、高和单位分别恢复成默认值4、2和Inches 。
因此需要对该按钮单击的事件进行处理。
第Opt 中有一目的是要把宽在MFC Wizard窗口中,切换到Message Maps选项卡。
确保Class Name下拉列表框中选中COptionsDialog,在Object IDs列表框中选中按钮Reset的ID IDC_RESET,然后在Messages列表框中双击BN_CLICKED消息。
接受添加成员函数(Add Member Function)对话框中推荐的成员函数取名(OnReset)。
点击OK 按钮退出该对话框。
在源文件OptionsDialog.cpp中编辑函数COptionsDialog::OnReset如下。
函数调用UpdateData(FALSE)使得三个控件变量的取值回传到各自的控件中。
接着查看源文件OptionsDialog.cpp 中由应用程序框架自动生成的代码。
注意以下两个函数无需程序员进行编辑。
构造函数COptionsDialog::COptionsDialog 对控件变量进行初始化。
的主要工作(函数DDX_Text ),从中也可以看到数据校验的代码(函数DDV_MinMaxInt ),这些都使得程序员的工作变得简单。
成员函数COptionsDialog::DoDataExchange完成了控件与变量之间数据双向交换七步:把对话框挂接到应用程序中源已经制作件变量已经创建好。
下面的问题就是要把该对话框通过应用为此,修改工程的ns 对话框。
双击资源窗ResourceView 中Menu 下的子项IDR_MAINFRAME 。
在菜单File 的最下面添加子菜单项Option...,把它的ID 设为ID_FILE_OPTIONS 。
第对话框资完成,对话框类及其控程序显示处理,同时接受用户的输入,然后用该参数重新绘制矩形。
菜单资源,通过单击菜单项,弹出选项Optio口在MFC ClassWizard 对话框中,对文档类CDlgDemoDoc 添加子菜单项ID_FILE_OPTIONS 对于消息COMMAND 的响应函数OnFileOptions 。