版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Visual
C++实用教程(Visual
Studio版)(第6版)第4章窗口和对话框——框架窗口目录01
主框架窗口和文档窗口主框架窗口和文档窗口当用“MFC应用程序向导”创建经典单文档(SDI)或多文档(MDI)应用程序时,主框架窗口类的源
文件名分别是MainFrm.h和MainFrm.cpp,其类名是CMainFrame。对于经典单文档应用程序来说,主框架窗口类是从CFrameWnd派生而来的,而对于经典多文档应用程序,主框架窗口类是从CMDIFrameWnd派生的。如果应用程序中还有工具栏(CToolBar)、状态栏(CStatusBar)等(以后会讨论),那么CMainFrame类还含有表示工具栏和状态栏的成员变量m_wndToolBar和m_wndStatusBar,并在CMainFrame的OnCreate函数中进行初始化。文档窗口对于经典单文档应用程序来说,它和主框架窗口是一致的,即主框架窗口就是文档窗口;而对于经典多文档应用程序,文档窗口是主框架窗口的子窗口,如图4.1所示。文档窗口主框架窗口目录02
窗口样式的设置1.窗口样式2.MFC应用程序向导设置3.修改CREATESTRUCT结构4.使用ModifyStyle和ModifyStyleEx窗口样式的设置窗口样式窗口样式通常有一般(以WS_为前缀)和扩展(以WS_EX_为前缀)两种形式。这两种形式的窗口样式可在函数CWnd::Create或CWnd::CreateEx参数中指定,其中CreateEx函数可同时支持以上两种样式,而
CWnd::Create只能指定窗口的一般样式。需要说明的是,对于控件和对话框这样的窗口来说,它们的窗口样式可直接通过其属性对话框来设置。常见的一般窗口样式如表4.1所示。需要说明的是,除了上述样式外,主框架窗口还有以下三个自己的样式。它们都可以在PreCreateWindow重载函数中指定(后面有应用示例)。FWS_ADDTOTITLE。该样式用来在框架窗口标题中添加一个文档名,如图4.1中“Ex_MDI–Ex_MDI1”的Ex_MDI1就是指定的默认文档名。而对于经典单文档应用程序来说,默认的文档名是“无标题”。FWS_PREFIXTITLE。该样式用来将框架窗口标题中的文档名显示在应用程序名之前。例如,若未指定该样式时的窗口标题为“Ex_MDI–Ex_MDI1”,而当指定该样式后就变成了“Ex_MDI1–Ex_MDI”。FWS_SNAPTOBARS。该样式用来调整窗口的大小,使它刚好包含了框架窗口中的控制栏(如工具栏)。窗口样式的设置2.MFC应用程序向导设置在用“MFC应用程序向导”创建经典单文档或多文档应用程序过程的“用户界面功能”页面中,有一个“主框架样式”栏,如图4.2所示。窗口样式的设置其中,“初始化状态栏”选项用来向应用程序添加状态栏,并对状态栏窗格数组进行初始化(以后讨论),
状态栏上最右边的窗格分别显示出【Caps
Lock】、【Num
Lock】和【Scroll
Lock】的键状态。“主框架样式”栏其他各选项的含义见表4.2所示,但在“用户界面功能”页面中,只能设定少数几种窗口样式。选
项含
义拆分窗口选中时,将程序的文档窗口创建成“切分”(或称拆分)窗口粗框架(默认)选中时,设置窗口样式WS_THICKFRAME最小化框(默认)选中时,设置窗口样式WS_MINIMIZEBOX,标题右侧含有最小化按钮最大化框(默认)选中时,设置窗口样式WS_MAXIMIZEBOX,标题右侧含有最大化按钮系统菜单(默认)选中时,设置窗口样式WS_SYSMENU,标题左侧有系统菜单最小化选中时,设置窗口样式WS_MINIMIZE最大化选中时,设置窗口样式WS_MAXIMIZE窗口样式的设置3.修改CREATESTRUCT结构当窗口创建之前,程序将自动调用PreCreateWindow虚函数。在用“MFC应用程序向导”创建经典文档应用程序框架时,MFC已为主框架窗口或文档窗口类自动重载了该虚函数。可以在此函数中通过修改CREATESTRUCT结构来设置窗口的绝大多数样式。例如,在经典单文档应用程序中,框架窗口默认的样式是WS_OVERLAPPEDWINDOW和FWS_ADDTOTITLE的组合,更改其样式可如下列的代码:BOOL
CMainFrame::PreCreateWindow(CREATESTRUCT&
cs){return
FALSE;if(
!CFrameWnd::PreCreateWindow(cs)
)//新窗口不带有“最大化”按钮
cs.style
&=~WS_MAXIMIZEBOX;//取消FWS_ADDTOTITLE样式
cs.style
&=~FWS_ADDTOTITLE;//将窗口的大小设为1/3屏幕并居中cs.cy
=
::GetSystemMetrics(SM_CYSCREEN)
/
3;cs.cx
=
::GetSystemMetrics(SM_CXSCREEN)
/
3;cs.y
=
((cs.cy
*
3)
-
cs.cy)
/
2;cs.x
=
((cs.cx
*
3)
-
cs.cx)
/
2;return
TRUE;}窗口样式的设置代码中,前面有“::”域作用符的函数是指全局函数,一般都是一些API函数。“cs.style
&=~WS_MAXIMIZEBOX;”中的“~”是按位取“反”运算符,它将WS_MAXIMIZEBOX的值按位取反后,再和cs.style值按位“与”,其结果是将cs.style值中的WS_MAXIMIZEBOX标志位清零。再如,对于经典多文档应用程序,文档窗口的样式可用下列的代码更改:BOOL
CChildFrame::PreCreateWindow(CREATESTRUCT&
cs){return
FALSE;//创建不含有“最大化”按钮的子窗口if(
!CMDIChildWnd::PreCreateWindow(cs)
)cs.style
&=
~WS_MAXIMIZEBOX;return
TRUE;}窗口样式的设置4.使用ModifyStyle和ModifyStyleExCWnd类中的成员函数ModifyStyle和ModifyStyleEx也可用来更改窗口样式,其中ModifyStyleEx还可更改窗口的扩展样式。这两个函数具有相同的参数,其含义如下。BOOL
ModifyXXXX(
DWORD
dwRemove,
DWORD
dwAdd,
UINT
nFlags
=
0
);其中,参数dwRemove用来指定需要删除的样式,dwAdd用来指定需要增加的样式,nFlags表示
SetWindowPos的标志,0(默认)表示更改样式同时不调用SetWindowPos函数。由于框架窗口在用“MFC应用程序向导”创建时不能直接设定其扩展样式,因此只能通过调用ModifyStyle函数来进行。例如,将CChildFrame类的“属性窗口”切换到“重写”页面,找到并添加虚函数OnCreateClient的重写(重载),然后在函数中添加下列代码:BOOL
CChildFrame::OnCreateClient(LPCREATESTRUCT
lpcs,
CCreateContext*
pContext){ModifyStyle(0,
WS_VSCROLL,
0);return
CMDIChildWnd::OnCreateClient(lpcs,
pContext);}窗口样式的设置这样,当窗口创建客户区时就会调用虚函数OnCreateClient。编译运行,结果如图4.3所示。添加的滚动条目录03
窗口状态的改变1.用ShowWindow改变窗口的显示状态2.用SetWindowPos或MoveWindow改变窗口的大小和位置窗口状态的改变1.用ShowWindow改变窗口的显示状态当应用程序运行时,Windows会自动调用应用程序框架内部的WinMain函数,并自动查找该应用程序类的全局变量theApp,然后自动调用用户应用程序类的虚函数InitInstance,该函数会进一步调用相应的函数来完成主窗口的构造和显示工作,如下面的代码(以经典单文档应用程序Ex_SDI为例):BOOL
CEx_SDIApp::InitInstance(){//显示窗口//更新窗口//…m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();return
TRUE;}窗口状态的改变代码中,m_pMainWnd是主框架窗口指针变量,ShowWindow是CWnd类的成员函数,用来按指定的参数显
示窗口,该参数的值如表4.3所示。通过指定ShowWindow函数的参数值可以改变窗口显示状态。例如下面的代码是将窗口的初始状态设置为“最小化”:BOOL
CEx_SDIApp::InitInstance(){//…m_pMainWnd->ShowWindow(SW_SHOWMINIMIZED);m_pMainWnd->UpdateWindow();return
TRUE;}参数值含
义SW_HIDE隐藏当前窗口并激活下一个窗口SW_MINIMIZE将当前窗口最小化并激活下一个窗口SW_RESTORE若当前窗口是最小或最大状态时,则恢复到原来的大小和位置SW_SHOW用当前的大小和位置激活并显示当前窗口SW_SHOWMAXIMIZED激活当前窗口并使之最大化SW_SHOWMINIMIZED激活当前窗口并使之最小化SW_SHOWNORMAL激活并显示当前窗口窗口状态的改变需要说明的是,由于用户应用程序类继承了基类CWinApp的特性,因此也可在用户应用程序类中使用公有型(public)成员变量m_nCmdShow,通过对其进行赋值,同样能达到效果。例如上述代码可改写为:BOOL
CEx_SDIApp::InitInstance(){//…m_nCmdShow
=
SW_SHOWMINIMIZED;m_pMainWnd->ShowWindow(m_nCmdShow);m_pMainWnd->UpdateWindow();return
TRUE;}窗口状态的改变2.用SetWindowPos或MoveWindow改变窗口的大小和位置CWnd中的SetWindowPos是一个非常有用的函数,它不仅可以改变窗口的大小、位置,而且还可以改变窗口在堆栈排列的次序(Z次序),这个次序是根据它们在屏幕出现的先后来确定的。BOOL
SetWindowPos(
constCWnd*
pWndInsertAfter,
int
x,
int
y,
int
cx,
int
cy,
UINT
nFlags
);其中,参数pWndInsertAfter用来指定窗口对象指针,它可以是下列预定义窗口对象的地址:wndBottomwndTopwndTopMostwndNoTopMost将窗口放置在Z次序中的底层将窗口放置在Z次序中的顶层设置最顶窗口将窗口放置在所有最顶层的后面,若此窗口不是最顶窗口,则此标志无效窗口状态的改变x和y表示窗口新的左上角坐标,cx和cy分别表示窗口新的宽度和高度,nFlags表示窗口新的大小和位置方式,如表4.4所示。nFlags值含
义SWP_HIDEWINDOW隐藏窗口SWP_NOACTIVATE不激活窗口。如该标志没有被指定,则依赖pWndInsertAfter参数SWP_NOMOVE不改变当前的窗口位置(忽略x和y参数)SWP_NOOWNERZORDER不改变父窗口的Z次序SWP_NOREDRAW不重新绘制窗口SWP_NOSIZE不改变当前的窗口大小(忽略cx和cy参数)SWP_NOZORDER不改变当前的窗口Z次序(忽略pWndInsertAfter参数)SWP_SHOWWINDOW显示窗口窗口状态的改变函数CWnd::MoveWindow也可用来改变窗口的大小和位置,与SetWindowPos函数不同的是,用户必须在MoveWindow函数中指定窗口的大小。void
MoveWindow(
int
x,
int
y,
int
nWidth,
int
nHeight,
BOOL
bRepaint
=
TRUE
);void
MoveWindow(
LPCRECT
lpRect,
BOOL
bRepaint
=
TRUE
);其中,参数x和y表示窗口新的左上角坐标,nWidth和nHeight表示窗口新的宽度和高度,bRepaint用于指定窗口是否重绘,lpRect表示窗口新的大小和位置。作为示例,这里将使用上述两个函数把主窗口移动到屏幕的(100,100)处(代码添在CEx_SDIApp::InitInstance中return
TRUE语句之前)。//使用SetWindowPos函数的示例m_pMainWnd->SetWindowPos(NULL,100,100,0,0,SWP_NOSIZE|SWP_NOZORDER);//使用MoveWindow函数的示例
CRect
rcWindow;m_pMainWnd->GetWindowRect(rcWindow);m_pMainWnd->MoveWindow(100,100,rcWindow.Width(),rcWindow.Height(),TRUE);当然,改变窗口的大小和位置的CWnd成员函数还不止以上两个。例如CenterWindow函数是使窗口居于父窗口中央,就像下面的代码:CenterWindow(CWnd::GetDesktopWindow());AfxGetMainWnd()->CenterWindow();//将窗口置于屏幕中央//将主框架窗口居中Visual
C++实用教程(Visual
Studio版)(第6版)第4章窗口和对话框——创建对话框目录01
创建对话框应用程序创建对话框应用程序这里先来用“MFC应用程序向导”创建一个基于对话框的应用程序,如下面的过程:①启动Visual
C++,选择“文件”→“新建”→“项目...”菜单命令或按快捷键【Ctrl+Shift+N】或单击标准工具栏中的栏中选中按钮,弹出“新建项目”对话框。在左侧“项目类型”中选中“MFC”,在右侧的“模板”类型,检查并将项目工作文件夹定位到“D:\Visual
C++程序\第4章”,在“名称”栏中输入项目名Ex_Dlg。②
单击
按钮,出现“MFC应用程序向导”欢迎页面,单击
按钮,出现“应用程序类型”页面。选中“基于对话框”应用程序类型,此时右侧的“项目类型”自动选定为“MFC标准”,如图4.4所示。创建对话框应用程序③
单击
按钮,出现如图4.5所示的“用户界面功能”页面,除了有与文档应用程序相同的“主框架样式”选项外,还可在这里指定对话框标题。创建对话框应用程序④
保留默认选项,单击
按钮,出现如图4.6所示的“高级功能”页面。在这里,允许在程序中加入上下文帮助、自动化、ActiveX控件、TCP/IP网络通信、Active
Accessibility以及提供Windows
XP公共控件DLL的支持等。创建对话框应用程序⑤
保留默认选项,单击
按钮,出现如图4.7所示的“生成的类”页面。在这里,可以对向导提供的默认类名、基类名、各个源文件名进行修改。创建对话框应用程序⑥保留默认选项,单击按钮,系统开始创建,并又回到了Visual
C++主界面,同时还自动打开对话框资源(模板)编辑器以及控件工具栏、控件布局工具栏等。按快捷键【Ctrl+F5】,系统开始编连并运行生成的对话框应用程序可执行文件Ex_Dlg.exe,运行结果如图4.8所示。目录02
资源和资源标识1.资源的分类2.资源标识符(ID)资源和资源标识别资源标识符资源的分类先用“MFC应用程序向导”创建一个经典单文档应用程序Ex_SDI,然后选择“视图”→“资源视图”菜单命令,打开“资源视图”页面,展开所有节点,如图4.9所示。可以看出,存放在Ex_SDI.rc中的资源可分为下列几类:快捷键列表(Accelerator)。一系列组合键的集合,被应用程序用来引发一个动作。该列表一般与菜单命令相关联,用来代替鼠标操作。对话框(Dialog)。含有按钮、列表框、编辑框等各种控件的窗口。资源类(3)图标(Icon)。代表应用程序显示在Windows桌面上的位图,它同时有32
x
32像素和16
x
16像素两种规格。菜单(Menu)。用户通过菜单可以完成应用程序的大部分操作。字串表(String
Table)。应用程序使用的全局字符串或其他标识符。工具栏(Toolbar)。工具栏外观是以一系列具有相同尺寸的按钮的位图组成的,它通常与一些菜单命令项相对应,用以提高用户的工作效率。版本信息(Version)。包含应用程序的版本、用户注册码等相关信息。资源和资源标识2.资源标识符(ID)在图4.9中,每一个资源类别下都有一个或多个相关资源,每一个资源均是由标识符来定义的。当添加或创建一个新的资源或资源对象时,系统会为其提供默认的名称,如IDR_MAINFRAME等。当然,也可重新命名,一般地,标识符命名规则与变量名基本相同,只是不区分大小写。除此之外,出于习惯,VisualC++还提供了一些常用的定义标识符名称的前缀供用户使用和参考,见表4.5。标识符前缀含
义IDR_表示快捷键或菜单相关资源IDD_表示对话框资源IDC_表示光标资源或控件IDI_表示图标资源IDB_表示位图资源IDM_表示菜单项ID_表示命令项IDS_表示字符表中的字符串IDP_表示消息框中使用的字符串目录03
添加对话框资源添加对话框资源在一个MFC应用程序中添加一个对话框资源,通常按下列步骤进行(这里以经典单文档应用程序Ex_SDI为例):在工作区窗口任意页面中,选中根节点
,然后选择“项目”→“添加资源”菜单命令,打开“添加资源”对话框,从中可以看到资源列表中存在Dialog项,若单击Dialog项左边的“+”号,将展开对话框资源的不同类型选项,如图4.10所示,表4.6列出各种类型的对话框资源的不同用途。类
型说
明IDD_DIALOGBAR对话条,往往和工具条停放一起IDD_FORMVIEW一个表单(一种样式的对话框),用于表单视图类的资源模板IDD_OLE_PROPPAGE_LARGE一个大的OLE属性页IDD_OLE_PROPPAGE_SMALL一个小的OLE属性页IDD_
PROPPAGE_LARGE一个大属性页,用于属性对话框IDD_
PROPPAGE_MEDIUM一个中等大小的属性页,用于属性对话框IDD_
PROPPAGE_SMALL一个小的属性页,用于属性对话框添加对话框资源,其中
按钮是用来创建一个由“资源类型”列表中指定类型的新资源,按钮是用来创建按钮是用于将外部已有的位图、图标、光标或其他定“资源类型”列表中没有的新类型的资源,制的资源添加到当前应用程序中。对展开的不同类型的对话框资源不作任何选择,选中“Dialog”,单击
按钮,系统就会自动为当前应用程序添加了一个对话框资源,并出现如图4.11所示的开发环境界面(这个界面和前面创建一个对话框应用程序后出现的界面是一样的)。对话框编辑器对话框模板控件工具箱布局工具栏默认标识符添加对话框资源从中可以看出:系统为对话框资源自动赋给它一个默认的标识符名称(第一次为IDD_DIALOG1,以后依次为IDD_DIALOG2、IDD_DIALOG3、...)。使用通用的对话框模板创建新的对话框资源。对话框的默认标题为Dialog,有“确定”和“取消”两个按钮,这两个按钮的标识符分别为IDOK和IDCANCEL。对话框模板资源所在的窗口称为对话框资源编辑器,在这里可进行对话框的设计,并可对对话框的属性进行设置。目录04
设置对话框属性设置对话框属性在对话框模板中右击鼠标,从弹出的快捷菜单中选择“属性”命令,就会在开发环境右侧出现如图4.12所示的对话框属性窗口。从中可以看出,对话框具有这几类属性:外观、位置、行为、杂项和字体,其含义等用到时再讨论。需要说明的是:在图4.12中属性窗口的左上角上,有一个自动隐藏图标,当单击此图标后,属性窗口隐藏,并在最右侧显示标签“属性”,一旦鼠标移动到该标签时,属性窗口自动滑出,同时自动隐藏图标变成。再次单击自动隐藏图标,则窗口又变成最初的“停靠”状态。在属性窗口“杂项”下的ID属性值框中,可修改对话框默认的标识符IDD_DIALOG1;在“外观”下的Caption属性值框中,可设置对话框的默认标题,如改为“我的第一个对话框”。单击“字体”下的Font(Size)属性值框右侧的按钮,弹出“字体”对话框,从中将对话框资源模板内的文本设置成“宋体,常规,9”,以使自己设计的对话框和Windows中的对话框保持外观上的一致(这是界面设计的“一致性”原则)。目录05
添加和布局控件1.控件的添加2.控件的选取3.控件的删除、复制和布局测试对话框操作示例添加和布局控件1.控件的添加将鼠标移动到开发环境最右边的“工具箱”标签,稍等片刻后,工具箱自动滑出,通过工具箱的各个工具按钮可以进行控件的添加。需要说明的是,当鼠标指针移开工具箱后,工具箱就会自动隐藏,单击“工具箱”顶部的图标按钮可使工具箱窗口一直停靠在开发环境的右侧。向对话框资源(模板)添加一个控件的方法有下列几种:(1)在工具箱中单击要添加的控件,然后将鼠标指针移至对话框资源(模板)中,此时的鼠标箭头在对话框资源(模板)内变成“十”字和控件标记的组合形状。此时,在对话框资源(模板)指定位置处单击鼠标,即可在该位置处添加此控件。(2)在工具箱中单击要添加的控件,然后将鼠标指针移至对话框资源(模板)中,此时的鼠标箭头在对话框资源(模板)内变成“十”字和控件标记的组合形状。此时,在需要添加的位置处单击并按住鼠标,然后向右下方拖动光标直到控件的大小满意为止,松开鼠标。(3)在工具箱中单击要添加的控件并按住鼠标,移动鼠标并在需要添加的位置处释放鼠标,控件被添加到当前鼠标位置的对话框资源(模板)中。(4)在工具箱中双击要添加的控件,相应的控件添加在对话框资源(模板)中,拖动它可以改变其位置。添加和布局控件2.控件的选取控件的删除、复制和布局操作一般都要先选取控件。选取单个控件时,可有下列方法:用鼠标直接选取。首先保证在控件工具箱中的选择图标按钮(
)是被选中的,然后移动鼠标指针至指定的控件上,单击鼠标左键即可。用【Tab】键选取。在对话框编辑器中,系统会根据控件的添加次序自动设置相应的“Tab键顺序”。利用【Tab】键,用户可在对话框内的控件中进行选择。每按一次【Tab】键依次选取对话框中的下一个控件,若按住【Shift】键,再按【Tab】键则选取上一个控件。对于多个控件的选取,可采用下列方法:先在对话框内按住鼠标左键不放,拖出一个大的虚框,然后释放鼠标,则被该虚框所包围的控件都将被选取。这个称为“框选”。先按住【Shift】键不放,然后用鼠标选取控件,直到所需要的多个控件选取之后再释放【Shift】键。若在选取时,对已选取的控件再选取一下,则取消该控件选取。添加和布局控件需要注意的是:一旦单个控件被选取后,其四周由选择框包围着,选择框上还有几个(通常是八个)深蓝色实心小方块,称为“尺寸柄”,选中并拖动这些尺寸柄可以改变控件的大小,如图4.13(a)所示。多个控件被选取后,其中只有一个控件的选择框有几个蓝色实心小方块,这个控件称为主导控件,而其他控件的选择框的小方块是空心的。如图4.13(b)所示。重新指定主导控件时,可有下列方法:多个控件被选取后,按下【Ctrl】键不放,然后用鼠标单击要指定的主导控件即可。单击当前选定控件的外部以清除当前的选定,重新按下【Shift】键不放,首个选定的控件即为主导控件。添加和布局控件3.控件的删除、复制和布局当单个控件或多个控件被选取后,按方向键或用鼠标拖动控件的选择框可移动控件。若在鼠标拖动过程中还按住【Ctrl】键则复制控件。若按【Del】键可将选取的控件删除。当然还有其他一些编辑操作,但这些操作方法和一般的文档编辑器基本相同,这里不再重复。对于控件的布局,对话框编辑器中提供了控件布局工具栏,如图4.14所示,它可以自动排列对话框内的控件,并能改变控件的大小。靠齐上边左右间隔相等大小相同靠齐左边上下居中宽度相同显示标尺测试对话框靠齐右边 左右居中 高度相同靠齐下边 上下间隔相等显示网格添加和布局控件需要说明的是:随着对话框编辑器的打开,Visual
C++开发环境的菜单栏还出现“格式”菜单,它的命令与布局工具基本相对应,而且大部分命令名后面还显示出相应的快捷键,由于它们都是中文的,故这里不再列出。(1)大多数布局控件的命令使用前,都需要用户选取多个控件,且“主导控件”起到了关键作用。例如用户选取多个控件后,使用“大小相同”命令则将控件的大小改变成“主导控件”的尺寸。因此,在多个控件的布局过程中,常需要按前述的方法重新指定“主导控件”。(2)为了便于用户在对话框内精确定位各个控件,系统还提供了网格、标尺等辅助工具。在图4.14的控件布局工具栏的最后两个按钮分别用来进行网格和标尺的切换。一旦网格显示,添加或移动控件时都将自动定位在网格线上。(3)添加和布局控件测试对话框“格式”菜单下的“测试对话框”命令或布局工具栏上的
按钮是用来模拟所编辑的对话框的运行情况,帮助用户检验对话框是否符合用户的设计要求以及控件功能是否有效等。操作示例下面来向对话框资源(模板)添加三个静态文本控件(一个静态文本控件就是一个文本标签):①单击布局工具栏上的②在工具箱上,单击按钮,打开对话框资源(模板)的网格。按钮,然后在对话框模板左上角单击鼠标左键不放,拖动鼠标至满意位置,释放鼠标按键。这样,第一个静态文本控件添加到对话框模板中了。③在工具箱上,将
按钮拖放到对话框模板中的左中部。这样,第二个静态文本控件添加到对话框模板中了。同样的操作,将第三个静态文本控件拖放到对话框模板中的左下部。④按住【Shift】键不放,依次单击刚才添加的三个静态文本控件,结果如图4.15所示。⑤
在布局工具栏上,依次单击“大小相同”按钮
、“靠左对齐”按钮
、“上下间隔相等”按钮
,结果如图4.16所示。目录06
创建对话框类创建对话框类在对话框使用前,还必须为该对话框资源(模板)创建一个用户对话框类,其步骤如下:①在对话框资源模板的空白区域(没有其他元素或控件)内双击鼠标左键,或选择“项目”→“添加类”命令,弹出“MFC类向导”对话框。②将“基类”选为CDialog,在“类名”框输入类名COneDlg(注意要以“C”字母打头,以保持与Visual
C++标识符命名规则一致),如图4.17所示,保留默认选项,单击
按钮。目录07
映射WM_INITDIALOG消息映射WM_INITDIALOG消息WM_INITDIALOG是在对话框显示之前向父窗口发送的消息。CDialog类中包含了此消息的映射虚函数OnInitDialog。一旦建立了它们的关联,系统在对话框显示之前就会调用此函数,因此常将对话框一些初始化代码添加到这个函数中。在前面创建的Ex_Dlg应用程序项目中,Visual
C++自动为其添加了WM_INITDIALOG消息的映射函数OnInitDialog,并自动添加了一系列的初始化代码:BOOL
CEx_DlgDlg::OnInitDialog(){CDialog::OnInitDialog();//…return
TRUE;//除非将焦点设置到控件,否则返回TRUE}映射WM_INITDIALOG消息但在应用程序中添加的对话框资源,创建的对话框类并不会自动添加该消息的映射函数,这需要手动操作。下面以单文档应用程序Ex_SDI添加的COneDlg对话框为例说明消息WM_INITDIALOG的映射过程:①将工作区窗口切换到“类视图”,展开所有节点,右击COneDlg节点,从弹出的快捷菜单中选择“属性”命令,弹出“属性”窗口。②将“属性”窗口切换到“重写”页面,找到并添加要重写(重载)的虚函数OnInitDialog,如图4.18所示。映射WM_INITDIALOG消息③在COneDlg::OnInitDialog函数实现的源代码处添加下列一些初始化代码:BOOL
COneDlg::OnInitDialog(){CDialog::OnInitDialog();this->SetWindowText(L"修改标题");return
TRUE;
//
return
TRUE
unless
you
set
the
focus
to
a
control//异常:OCX属性页应返回FALSE}代码中,SetWindowText是CWnd的一个成员函数,用来设置窗口的文本内容。对于对话框来说,它设置的是对话框标题。Visual
C++实用教程(Visual
Studio版)(第6版)第4章窗口和对话框——使用对话框目录01
在程序中调用对话框在程序中调用对话框由于单文档应用程序包含菜单的用户界面,因而通常将代码添加到菜单命令消息的映射函数中,例如下面过程(仍以上面的Ex_SDI项目为例):①将工作区窗口切换到“资源视图”页面,展开所有节点,双击资源“Menu”项中的IDR_MAINFRAME,将打开菜单编辑器,相应的Ex_SDI项目的菜单资源被显示出来,在菜单的最后一项,留出了一个菜单项的空位置,用来输入新的菜单项,如图4.19所示。顶层菜单的空位置子菜单的空位置在程序中调用对话框②在顶层菜单右边的空位置上单击鼠标左键,进入菜单项编辑状态,输入菜单项标题“对话框(&D)”(双引号不输),其中符号&用来将其后面的字符D作为该菜单项的助记符,这样当按住【Alt】键不放,再敲击该助记符键【D】时,对应的菜单项就会被选中,或在菜单打开时,直接按相应的助记符键【D】,对应的菜单项也会被选中。③同样,在“对话框(&D)”菜单下的空位置处单击鼠标,再次单击空位置处进入菜单项编辑状态,输入菜单项标题“第一个对话框(&F)”(双引号不输),在菜单项最前面单击鼠标完成该子菜单的标题输入。④双击子菜单项“第一个对话框(&F)”,打开菜单编辑器的“属性”窗口,将“杂项”中的ID属性值ID_32771改为ID_DLG_FIRST。关闭“属性”窗口,用鼠标将新添加的菜单项拖放到“视图”和“帮助”菜单项之间,如图4.20所示。在程序中调用对话框⑤将工作区窗口切换到“类视图”页面,右击CEx_SDIView节点,从弹出的快捷菜单项中选择“属性”命令,弹出其“属性”窗口。⑥将“属性”窗口切换至“事件”页面,可以看到“菜单命令”项下的ID_DLG_FIRST节点,展开它,出现COMMAND和UPDATE_COMMAND(更新命令消息,以后再讨论)消息。在COMMAND消息右侧栏单击鼠标,从中可以输入映射处理的函数名称(输后按【Enter】键),或者单击右侧的下拉按钮
,从弹出的下拉项中选择“添加OnDlgFirst”(默认处理函数名称),如图4.21所示。在程序中调用对话框⑦在CEx_SDIView::OnDlgFirst函数实现的源代码处,添加下列代码:void
CEx_SDIView::OnDlgFirst(){COneDlg
dlg;dlg.DoModal();}代码中,DoModal是基类CDialog成员函数,用来将对话框按模式方式来显示(后面还会讨论)。⑧在CEx_SDIView类的实现文件Ex_SDIView.cpp的前面,即将刚才添加代码的文档窗口滚动到最前面,添加COneDlg类的头文件包含,即:#include
"stdafx.h"//…#include
"Ex_SDIView.h"#include
"OneDlg.h"在程序中调用对话框⑨编译并运行。在应用程序菜单上,选择“对话框”→“第一个对话框”菜单项,弹出如图4.22的对话框,这就是前面添加并创建的对话框。目录02
使用无模式对话框使用无模式对话框模式对话框的应用范围较广,一般情况下,模式对话框会有
(OK)和(Cancel)按钮。单击按钮,对话框中按钮,系统认定用户在对话框中的选择或输入有效,对话框退出;单击的选择或输入无效,对话框退出,程序恢复原有状态。事实上,对话框还可以用“非模式”方式来显示,称为非模式对话框(或称无模式对话框)。所谓“非模式对话框”,是指当对话框被弹出后,一直保留在屏幕上,用户可继续在对话框所在的应用程序中进行其他操作;当需要使用对话框时,只需像激活一般窗口一样单击对话框所在的区域即可激活。当然,“非模式”方式还要涉及对话框其他一些编程工作。使用无模式对话框【例Ex_Modeless】创建并使用无模式对话框①用“MFC应用程序向导”创建一个经典单文档应用程序Ex_Modeless。添加一个默认的对话框资源,标识符仍用默认的IDD_DIALOG1,在其属性窗口中将其标题(Caption属性)设为“无模式对话框”,对话框的字体和大小设为“宋体,常规,9号”。②为IDD_DIALOG1对话框资源创建一个从基类CDialog派生的对话框类CLessDlg。将工作区窗口切换到“类视图”页面,展开所有节点,右击CLessDlg,从弹出的快捷菜单中选择“属性”命令,弹出其“属性”窗口。③将“属性”窗口切换到“事件”页面,找到并展开IDOK节点,在其下找到并添加BN_CLICKED事件的默认处理函数OnBnClickedOk,添加下列代码:void
CLessDlg::OnBnClickedOk(){//添加其他代码使用户输入对话框的数据有效DestroyWindow();delete
this;//
OnOK();//终止对话框显示//删除对话框,释放内存空间//去除默认的处理}代码中,DestroyWindow是对话框基类CWnd的一个成员函数,用来终止窗口。使用无模式对话框④类似的,在CLessDlg类添加按钮(标识符为IDCANCEL)的BN_CLICKED事件默认的处理函数//终止对话框显示//删除对话框,释放内存空间//去除默认的处理OnBnClickedCancel,并添加下列代码:void
CLessDlg::OnBnClickedCancel(){//添加其他释放代码DestroyWindow();delete
this;//
OnCancel();}⑤将工作区窗口切换到“资源视图”页面,打开IDR_MAINFRAME菜单资源。在菜单“查看”与“帮助”之间添加一个“对话框(&D)”顶层菜单项,并在其下添加一个子菜单项,标题(Caption)为“无模式对话框(&M)”,资源标识ID设为ID_DLG_MODELESS。使用无模式对话框⑥打开CEx_ModelessView类“属性”窗口,在“事件”页面中添加ID_DLG_MODELESS的COMMAND消息映射,保留默认的事件处理函数名OnDlgModeless,并添加下列代码:void
CEx_ModelessView::OnDlgModeless(){CLessDlg
*pDlg
=
new
CLessDlg;pDlg->Create(
IDD_DIALOG1
);pDlg->ShowWindow(
SW_NORMAL
);//使用new来为对话框分配内存空间//创建对话框//显示对话框}代码中,Create函数可以用来以一个对话框资源来创建对话框,ShowWindow是一个CWnd成员函数,用来显示对话框,SW_NORMAL是用来指定将窗口显示成一般常用的状态。⑦在CEx_ModelessView类的实现文件Ex_ModelessView.cpp的前面,即将刚才添加代码的文档窗口滚动到最前面,添加CLessDlg类的头文件包含,即:#include
"stdafx.h"//…#include
"Ex_ModelessDoc.h"#include
"Ex_ModelessView.h"#include
"LessDlg.h"使用无模式对话框⑧编译并运行。在应用程序菜单上,多次选择“对话框”→“第一个对话框”菜单项,将会在同一个位置中出现多个对话框,拖动这些对话框到适当位置,如图4.23所示。Visual
C++实用教程(Visual
S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 扶余市招聘社区就业服务专员笔试真题2025
- 舞台灯光音响租赁合同(2026版)
- 信阳商城县选调城区义务教育学校教师笔试真题2025
- 吉林通化集安市社区就业服务专员招聘笔试真题2025
- 2026 年公路沿线塌方险情避让安全知识
- 2026 年秋季高二开学第一课高中生亲子之间有效沟通实操班会
- 2026年秋道德与法治三年级上册教学工作计划
- 《一景多拍:同一目的地用黑白、彩色、手机与无人机四种表达》
- 某汽车零部件厂生产安全准则
- 《文书与档案管理习题册》答案 - 模块1-5
- 1.1 动与静 课件(共28张)2026-2027学年沪科版物理八年级全一册
- 2026年五四制小升初数学测试题及答案
- T∕CAPID 005.4-2023 垃圾焚烧发电工程质量监督检查大纲 第4部分:厂用电系统受电前监督检查
- 中国专家共识降胆固醇策略2026
- 县域经皮冠状动脉介入治疗合理用药与综合管理指南课件
- 2026四川省现代种业发展集团种芯农业有限公司招聘财务人员(会计岗)1人笔试历年常考点试题专练附带答案详解
- 广西传统医学师承关系合同书模板
- 《化妆品用植物来源原料技术要求通则》
- 交警预警研判工作制度
- 驾驭式课堂培训心得体会
- 医疗机构运营与绩效管理手册(标准版)
评论
0/150
提交评论