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 之前进行此操作。
VC++弹出对话框VC6.0弹出对话框首先建立工程,选择“MFC AppWizard(exe)”选项,在工程名中取名为“ShowDialog”在“AppWizard – Setup(1-6)”的选项卡中的第一个选项卡里选择“Single document(单文档视图)”点选按钮,其他剩下的5个步骤可以选择默认省略设置,直接点击“Finish”按钮在资源视图的选项卡中选中“Dialog”,右键点击选择“Insert Dialog”菜单,分别添加两个对话框,将新添加的两个对话框的ID改为“IDD_DIALOG_DOMODAL”和“IDD_DIALOG_MODAL”,并将“Caption”属性分别设置成“模态对话框”和“非模态对话框”添加完对话框,分别对两个对话框添加新类,只有添加了新类,才可以操作对话框,转到对话框编辑视图右键点击要添加类的对话框,选中“Class Wizard(类向导)”,在弹出的对话框中系统会提问“IDD_DIALOG_MODAL是一个新的资源,是否要为其添加一个新类?”,此时选择“OK”接下来对该对话框添加类在“Name”中填入新类的名称,此时填入“CModalDlg”(类名可以由程序员自己命名),注意在“Bass Class”中要选中“CDialog”作为对话框新类的基础类,点中“OK”,用同样的方法为“IDD_DIALOG_DOMODAL”对话框添加类,类名为“CDomodalDlg”添加完对话框资源后点击资源选项卡中的“Menu”,找到其中的“IDR_MANIFRAME”,双击可以显示系统菜单,在右边的视图中加入一个顶级菜单“弹出对话框”,在该顶级菜单下添加两个子菜单,子菜单的ID分别设为“IDM_DOMODAL”和“IDM_MODAL”,并将其“Caption”属性设置为“弹出模态对话框”和“弹出非模态对话框”在对子菜单进行添加完成之后右键点击子菜单选中“Class Wizard(类向导)”,在弹出的对话框中选择其中的设置选项资源ID要对应相应的菜单,“Class Name”要对应“CMainFrame”,因为菜单是在框架中生成,“Message”中要选择“COMMAND”消息,“UPDATE_COMMAND_UI”消息是用来处理菜单对应的用户界面,“COMMAND”消息是用来处理菜单对应的功能,他两者的区别在此不做详细介绍,点击“Add Function”按钮可以看到多了一个菜单的COMMAND消息的处理函数,点击“Edit Code”按钮进入代码编辑区,此时进入的是主框架的CPP文件,用同样的方法为另外一个子菜单添加消息处理函数在主框架的CPP文件中的最后一部分可以看到刚才添加的菜单COMMAND处理消息的函数编辑代码在该CPP文件的最上方引入新建的两个类的头文件#include "DomodalDlg.h"#include "ModalDlg.h"在该类的最后部分为新增的方法写入代码最后保存,并运行,可以看出模态对话框只能弹出一次,而非模态对话框可以弹出多次VC2008弹出对话框首先创建工程,选择“MFC应用程序”选项,将工程命名为“ShowDialog”在“MFC-应用程序向导”设置选项卡中的第一项按照图中的红框设置,其他步骤可以默认选择,最后点击“完成”工程建立完成后,在左侧的资源视图中右键点击“Dialog”,选中“插入Dialog”,分别添加两个对话框,在添加好的对话框点击右键可以通过“属性”来设置“Caption”和“ID”ID分别设置为“IDD_DIALOG_DOMODAL”和“IDD_DIALOG_MODAL”,Caption分别设置分别对两个对话框进行添加类,右键点击对话框,选中右键菜单中的“添加类”在弹出的类对话框中加入类名“CDomodalDlg,”,基类选择“CDialog”,点击“完成”,用同样的方法为另外一个对话框添加新类,类名为“CModalDlg”类添加完成后对菜单进行操作,双击资源菜单中的“Menu”项中的“IDR_MAINFRAME”,在右侧的视图中显示出菜单,并添加一个顶级菜单和两个子菜单右键点击子菜单,在其属性中分别设置ID为“ID_DOMODAL”和“ID_MODAL”,设置完成后右键点击子菜单,选中“添加事件处理程序”在弹出的对话框中选择设置点击“添加编辑”,用同样的方法为另一个子菜单添加菜单的Command处理消息在MainFrame框架的CPP问价的最后部分可以看到代码编辑处在该CPP文件的最上方引入新建对话框的头文件回到CPP文件的最后添加弹出对话框代码最后保存运行,可以看出模态对话框只能弹出一次,而非模态对话框可以弹出多次。
Visual C++(VC)中“选择文件夹”对话框的程序的编写2010-04-1001:07A.M.在实际的MFC编程当中,常常需要弹出对话框选择文件、选择目录等操作,对于选择文件,用CFileDialog就可以很简单的解决,而对于选择目录,则稍稍需要多一些步骤,需要自己创建Dialog。
首先创建如下的对话框,并为它创建类Dialog,在Dialog头文件中添加保存目录名的变量CString m_strPath,然后为编辑框右边的按钮添加消息响应函数OnButtonBrowser(),并添加如下代码。
void CDialog::OnButtonBrowser(){//TODO:Add your control notification handler code hereUpdateData(TRUE);char szDir[MAX_PATH];BROWSEINFO bi;ITEMIDLIST*pidl;bi.hwndOwner=this->m_hWnd;//指定父窗口,在对话框显示期间,父窗口将被禁用bi.pidlRoot=NULL;//如果指定NULL,就以“桌面”为根bi.pszDisplayName=szDir;bi.lpszTitle="请选择目录";//这一行将显示在对话框的顶端bi.ulFlags=BIF_STATUSTEXT|BIF_USENEWUI|BIF_RETURNONLYFSDIRS;bi.lpfn=NULL;bi.lParam=0;bi.iImage=0;pidl=SHBrowseForFolder(&bi);if(pidl==NULL)return;if(!SHGetPathFromIDList(pidl,szDir))return;else m_strPath=szDir;UpdateData(FALSE);}当程序启动起来的时候,点击按钮,就会弹出如下的选择目录的对话框=========================================================================== =======Visual C++(VC)中,BROWSEINFO结构中包含有用户选中目录的重要信息。
vc动态创建对话框和按钮1.创建⾮模态对话框:类 *对象=new 类BOOL 对象->Create(ID,this);创建后需调⽤ShowWindow函数将对话框显⽰出来对象->ShowWindow(SW_SHOW);在⾮模态对话框中点击确定和取消时,对话框并不销毁,⽽是隐藏起来,要想销毁,需调⽤DestroyWindow函数2.动态创建按钮:⽅法1为要加按钮的类添加⼀个私有的CButton成为变量m_btn,还要添加⼀个BOOL型的私有成员量m_bIsCreated⽤来确定是否创建了按钮if(m_blsCreated==FALSE)////判断如果没有创建按钮{m_btn.Create("new",/////按钮上显⽰的⽂本BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,///如果没有制定WS_VISIBLE还要调⽤ShowWindow将其显⽰出来CRect(0,0,100,100),/////左上⾓的坐标(0,0),长度为100,100this,123);ID地址为123m_blsCreated=TRUE;}else{m_btn.DestroyWindow();m_blsCreated=false;}⽅法2⽤CWnd类的成员对象m_hWnd⽤来保存与窗⼝对象相关联的窗⼝句柄,如果窗⼝对象没有与任何窗⼝相关联,该值为NULLif(!m_btn.m_hWnd){m_btn.Create("new",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),this,123);m_blsCreated=TRUE;}else{m_btn.DestroyWindow();m_blsCreated=false;}CDialog::CreateBOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );Return ValueBoth forms return nonzero if dialog-box creation and initialization were successful; otherwise 0.ParameterslpszTemplateNameContains a null-terminated string that is the name of a dialog-box template resource.pParentWndPoints to the parent window object (of type ) to which the dialog object belongs. If it is NULL, the dialog object’s parent window is set to the main application window.nIDTemplateContains the ID number of a dialog-box template resource.RemarksCall Create to create a modeless dialog box using a dialog-box template from a resource. You can put the call to Create inside the constructor or call it after the constructor isinvoked.Two forms of the Create member function are provided for access to the dialog-box template resource by either template name or template ID number (for example,IDD_DIALOG1).For either form, pass a pointer to the parent window object. If pParentWnd is NULL, the dialog box will be created with its parent or owner window set to the main applicationwindow.The Create member function returns immediately after it creates the dialog box.Use the WS_VISIBLE style in the dialog-box template if the dialog box should appear when the parent window is created. Otherwise, you must call ShowWindow. For furtherdialog-box styles and their application, see the structure in the Win32 SDK documentation and in the Class Library Reference.Use the CWnd::DestroyWindow function to destroy a dialog box created by the Create function.ExampleCMyDialog* pDialog; void CMyWnd::OnSomeAction() { //pDialog initialized to NULL in the constructor of CMyWnd class pDialog = new CMyDialog(); //Check if new succeeded and we got a valid pointer to a dialog object if(pDialog != NULL) { BOO。
VC中打开对话框.创建打开文件对话框:CFileDialog dlg(TRUE,//TRUE是创建打开文件对话框,FALSE则创建的是保存文件对话框".txt",//默认的打开文件的类型NULL,//默认打开的文件名OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,//打开只读文件"文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");//所有可以打开的文件类型2.点打开文件对话框上面的确定键后if(dlg.DoModal()==IDOK){CString m_FilePath = dlg.GetPathName();////////取出文件路径CString m_path;m_path=m_FilePath;//将文件的路径放入m_pathUpdateData(FALSE);}3.打开文件:File.Open(m_path,CFile::modeRead);4.逐行读取文件:CStdioFile File;///可以逐行读文件的类CString strLine;while(File.ReadString(strLine)) //////将每行都放进strLine字符串里{AfxMessgeBox(strLine);}5判断读出来的字:strLine=“1|2|3|”;//要判断的字符串int strIndex1 = strLine.Find('|');//在字符串中寻找“|”CString a[11];if(-1 != strIndex1)//只要找到“|”就不会返回-1{int i=0;while( -1 != strIndex1)//{strIndex1 = strLine.Find('|');a[i] = strLine.Left(strIndex1);strLine = strLine.Right(strLine.GetLength() - strIndex1-1) ; i++;if (i > 10)//退出循环break;}}。
用VC制作动态弹出的对话框在“网络蚂蚁”中,如果在下载过程中有错误发生,或是提示下载完成时,你都可以在屏幕中央看到一个由小变大、动态弹出的对话框,那么,这个动态弹出的对话框是如何实现的呢?一、选择方法通常,我们可以在对话框的WM_INITDIALOG事件的响应函数中加入对话框的一些初始化设置,比如改变窗口的位置及大小。
同样,我们也可以在WM_INITDIALOG事件的响应函数中让对话框由小到大地显示。
但是,如何改变对话框的大小呢?在编程过程中,我们通常是利用MoveWindow函数来动态调整对话框的大小,但是MoveWindow函数有其局限性:一是它的速度较慢;二是由于众所周知的MFC内存泄漏的原因,如果重复调用MoveWindow函数来改变对话框的大小,MoveWindow不能够将屏幕清“干净”(这点你可以在实际编程中试一下),这显然不是我们所需要的。
能不能找到一种其他的方法来快速地改变窗口大小呢?我们知道,用SetWindowRgn函数能够改变窗口的显示区域,那么,在对话框显示之前,让程序将对话框先隐藏起来,然后让对话框的显示区域不断变大,这样就实现了对话框的动态显示。
在继续介绍之前,我们先来介绍一下SetWindowRgn的具体用法,以下是其调用格式:int SetWindowRgn( HRGN hRgn, BOOL bRedraw );hRgn:指向一区域的句柄,通常该参数是由CRgn对象创建的。
bRedraw:指明在设定窗口显示区域之后系统是否进行窗口重绘操作。
二、应用实例接下来我们以让程序的“帮助对话框”动态弹出为例,介绍如何通过编程的方式来实现对话框的动态弹出显示。
在CAboutDlg类中加入对WM_INITDIALOG的映射,并编辑其响应函数OnInitDialog,该函数的具体内容设置如下:BOOL CAboutDlg::OnInitDialog(){CDialog::OnInitDialog();//隐藏对话框ShowWindow(SW_HIDE);CRect dlgRect;GetClientRect(&&dlgRect);CPoint centerPoint;centerPoint.x=dlgRect.Width()/2;centerPoint.y=dlgRect.Height()/2;//得到对话框的中点坐标CRgn testrgn;this-〉ShowWindow(SW_HIDE);int m=GetSystemMetrics(SM_CYSIZEFRAME);//以下代码实现对话框的动态弹出for (int i=10;i〈dlgRect.Width()/2+2 m;i+=1){testrgn.CreateRectRgn(centerPoint.x-i,centerPoint.y-i,centerPoint.x+i,centerPoint.y+i);SetWindowRgn((HRGN) testrgn,TRUE);ShowWindow(SW_SHOW);CenterWindow();testrgn.DeleteObject();}return TRUE;}该程序的代码比较简单,编译之后进入程序的帮助选单,你会看见一个由小变大的对话框跃然于屏幕之上。
实验项目三:文档视图结构实验学时: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 。