对话框和对话框类CDialog
对话框经常被使用,因为对话框可以从模板创建,而对话框模板是可以使用资源编辑器方便地进行编辑的。
模式和无模式对话框
对话框分两种类型,模式对话框和无模式对话框。
模式对话框
一个模式对话框是一个有系统菜单、标题栏、边线等的弹出式窗口。在创建对话框时指定WS_POPUP, WS_SYSMENU, WS_CAPTION和 DS_MODALFRAME风格。即使没有指定WS_VISIBLE风格,模式对话框也会被显示。
创建对话框窗口时,将发送WM_INITDIALOG消息(如果指定对话框的DS_SETFONT风格,还有WM_SETFONT消息)给对话框过程。
对话框过程(Dialog box procedure)不是对话框窗口的窗口过程(Window procedure)。在Win32里,对话框的窗口过程由Windows系统提供,用户在创建对话框窗口时提供一个对话框过程由窗口过程调用。
对话框窗口被创建之后,Windows使得它成为一个激活的窗口,它保持激活直到对话框过程调用::EndDialog函数结束对话框的运行或者Windows激活另一个应用程序为止,在激活时,用户或者应用程序不可以激活它的所属窗口(Owner window)。
从某个窗口创建一个模式对话框时,Windows自动地禁止使用(Disable)这个窗口和它的所有子窗口,直到该模式对话框被关闭和销毁。虽然对话框过程可以Enable所属窗口,但是这样做就失去了模式对话框的作用,所以不鼓励这样做。
Windows创建模式对话框时,给当前捕获鼠标输入的窗口(如果有的话)发送消息WM_CANCLEMODE。收到该消息后,应用程序应该终止鼠标捕获(Release the mouse capture)以便于用户能把鼠标移到模式对话框;否则由于Owner窗口被禁止,程序将失去鼠标输入。
为了处理模式对话框的消息,Windows开始对话框自身的消息循环,暂时控制整个应用程序的消息队列。如果Windows收到一个非对话框消息时,则它把消息派发给适当的窗口处理;如果收到了WM_QUIT消息,则把该消息放回应用程序的消息队列里,这样应用程序的主消息循环最终能处理这个消息。
当应用程序的消息队列为空时,Windows发送WM_ENTERIDLE消息给Owner窗口。在对话框运行时,程序可以使用这个消息进行后台处理,当然应该注意经常让出控制给模式对话框,以便它能接收用户输入。如果不希望模式对话框发送WM_ENTERIDlE消息,则在创建模式对话框时指定DS_NOIDLEMSG风格。
一个应用程序通过调用::EndDialog函数来销毁一个模式对话框。一般情况下,当用户从系统菜单里选择了关闭(Close)命令或者按下了确认(OK)或取消(CANCLE)按钮,::EndDialog被对话框过程所调用。调用::EndDialog时,指定其参数nResult的值,Windows将在销毁对话框窗口后返回这个值,一般,程序通过返回值判断对话框窗口是否完成了任务或者被用户取消。
无模式对话框
一个无模式对话框是一个有系统菜单、标题栏、边线等的弹出式窗口。在创建对话框模板时指定WS_POPUP、WS_CAPTION、WS_BORDER和WS_SYSMENU风格。如果没有指定WS_VISIBLE风格,无模式对话框不会自动地显示出来。
一个无模式对话框既不会禁止所属窗口,也不会给它发送消息。当创建一个模式对话框时,Windows使它成为活动窗口,但用户或者程序可以随时改变和设置活动窗口。如果对话框失去激活,那么即使所属窗口是活动的,在Z轴顺序上,它仍然在所属窗口之上。
应用程序负责获取和派发输入消息给对话框。大部分应用程序使用主消息循环来处理,但是为了用户可以使用键盘在控制窗口之间移动或者选择控制窗口,应用程序应该调用::IsDialogMessage函数。
这里,顺便解释::IsDialogMessage函数。虽然该函数是为无模式对话框设计的,但是任何包含了控制子窗口的窗口都可以调用它,用来实现类似于对话框的键盘选择操作。
当::IsDialogMessage处理一个消息时,它检查键盘消息并把它们转换成相应对话框的选择命令。例如,当Tab 键被压下时,下一个或下一组控制被选中,当Down Arrow键按下后,一组控制中的下一个控制被选择。
::IsDialogMessage完成了所有必要的消息转换和消息派发,所以该函数处理的消息一定不要传递给TranslateMessage和DispatchMessage处理。
一个无模式对话框不能像模式对话框那样返回一个值给应用程序。但是对话框过程可以使用::SendMessage给所属窗口传递信息。
在应用程序结束之前,它必须销毁所有的无模式对话框。使用::DestroyWindow销毁一个无模式对话框,不是使用::EndDiaLog。一般来说,对话框过程响应用户输入,如用户选择了“取消”按钮,则调用::DestroyWindow;如果用户没有有关动作,则应用程序必须调用::DestroyWindow。
对话框的MFC实现
在MFC中,对话框窗口的功能主要由CWnd和CDialog两个类实现。
CDialog的设计和实现
MFC通过CDialog来封装对话框的功能。CDialog从CWnd继承了窗口类的功能(包括CWnd实现的有关功能),并添加了新的成员变量和函数来处理对话框。
CDialog的成员变量
CDialog的成员变量有:
protected:
UINT m_nIDHelp; // Help ID (0 for none, see HID_BASE_RESOURCE)
LPCTSTR m_lpszTemplateName; // name or MAKEINTRESOURCE
HGLOBAL m_hDialogTemplate; // indirect (m_lpDialogTemplate == NULL)
// indirect if (m_lpszTemplateName == NULL)
LPCDLGTEMPLATE m_lpDialogTemplate;
void* m_lpDialogInit; // DLGINIT resource data
CWnd* m_pParentWnd; // parent/owner window
HWND m_hWndTop; // top level parent window (may be disabled)
成员变量保存了创建对话框的模板资源、对话框父窗口对象、顶层窗口句柄等信息。三个关于模板资源的成员变量m_lpszTemplateName、m_hDialogTemplate、m_lpDialogTemplate对应了三种模板资源,但在创建对话框时,只要一个模板资源就可以了,可以使用其中的任意一类。
CDialog的成员函数:
构造函数:
CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL );
CDialog( );
CDialog重载了三个构造函数。其中,第三个是缺省构造函数;第一个和第二个构造函数从指定的对话框模板资源创建,pParentWnd指定了父窗口或所属窗口,若空则设置父窗口为应用程序主窗口。
初始化函数
BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );
BOOL CreateIndirect( LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd = NULL );
BOOL CreateIndirect( HGLOBAL hDialogTemplate, CWnd* pParentWnd = NULL );
BOOL InitModalIndirect( LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd = NULL );
BOOL InitModalIndirect( HGLOBAL hDialogTemplate, CWnd* pParentWnd = NULL );
Create用来根据模板创建无模式对话框;CreateInDirect用来根据内存中的模板创建无模式对话框;InitModalIndirect用来根据内存中的模板创建模式对话框。它们都提供了两个重载版本。
对话框操作函数
void MapDialogRect( LPRECT lpRect ) const;
void NextDlgCtrl( ) const;
void PrevDlgCtrl( ) const;
void GotoDlgCtrl( CWnd* pWndCtrl );
void SetDefID( UINT nID );
void SetHelpID( UINT nIDR );
void EndDialog( int nResult );
虚拟函数
virtual int DoModal( );
virtual BOOL OnInitDialog( );
virtual void OnSetFont( CFont* pFont );
virtual void OnOK( );
virtual void OnCancel( );
分享到:
相关推荐
在MFC(Microsoft Foundation Classes)库中,CDialog类是用来创建对话框的基类,而当我们需要在对话框中添加可滚动的子窗口时,就需要进行一些特殊的处理。本篇文章将详细探讨如何在CDialog中嵌入一个滚动的子...
而`CDialog`是MFC(Microsoft Foundation Classes)库中的一个类,它代表了Windows对话框。`CDialog`通常用于创建模式或无模式对话框,可以包含各种控件,如按钮、文本框、列表框等,当然也包括`TabCtrl`。本示例将...
在VC++编程环境中,对话框(CDialog)是常见的用户界面元素,用于提供与用户交互的窗口。在VS2008SP1中,我们有时需要实现对话框的全屏显示,同时确保对话框内的控件能自动居中,以提供良好的用户体验。本文将详细...
CDialog是MFC中的一个关键类,用于实现弹出式对话框。在一些情况下,我们希望对话框中的控件能够随着对话框本身的大小改变而动态调整大小和位置,以保持用户界面的美观和一致性。标题“可让对话框上的控件随主窗大小...
在给定的项目中,我们关注的是如何在MFC的CDialog类基础上创建一个具有自定义背景图片的对话框。这个功能对于提高应用程序的用户界面(UI)美观性和用户体验至关重要。以下是关于这个主题的详细知识: 1. **CDialog...
在VC++编程环境中,`CDialog`类是MFC(Microsoft Foundation Classes)库中的一个核心组件,主要用于创建对话框窗口。对话框在图形用户界面中起着至关重要的作用,允许用户与应用程序进行交互,接收输入数据或显示...
本教程将详细讲解如何在DLL中使用资源,特别是对话框资源,以`CDialog`类为例。 **1. 创建DLL项目** 首先,我们需要创建一个新的VC++ DLL项目。在Visual Studio中,选择“文件”>“新建”>“项目”,然后在项目类型...
### 对话框(CDialog)内显示图片的实现方法(VC++) #### 背景介绍 在使用Visual C++(VC++)进行Windows程序开发时,我们常常需要在对话框(CDialog)中显示图片,以此来增强用户界面的美观性和交互性。然而,如何将...
可随意改变大小的CDialog 可以随意拖动 但是布局不会变化
在Windows编程中,CDialog是MFC(Microsoft Foundation Classes)库中的一个重要类,它用于创建标准的对话框。本文将详细讲解如何通过自定义CDialog来实现窗口的渐显和渐隐效果,以及与之相关的自绘对话框、自绘按钮...
在这个“mfc CDialog demo”中,我们主要关注的是如何在CDialog界面上设置背景图片以及处理界面刷新问题。在Windows编程中,界面美观和用户体验是非常重要的,而添加背景图片可以提升界面的视觉效果。以下是实现这一...
在本篇中,我们将探讨如何实现`CDialog`的分割功能,以及在提供的压缩包文件中涉及到的关键代码。 首先,`CDialog`是MFC(Microsoft Foundation Classes)库中的一个类,它代表了一个模式对话框,即用户与之交互...
《深入解析MFC-CDialog计算器应用》 在编程领域,MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于简化Windows应用程序的开发。其中,CDialog类是MFC框架中的一个重要组件,用于创建对话框式界面,...
《对话框》与《对话框类CDialog》详解 对话框是Windows编程中不可或缺的一部分,它们为用户提供了一种与应用程序交互的方式,通过显示一组控件和接收用户输入。本文将深入探讨对话框的两种主要类型——模式对话框和...
本文将详细讲解对话框及其CDialog类的相关知识点。 首先,对话框分为两种类型:模式对话框(Modal Dialog Box)和无模式对话框(Modeless Dialog Box)。 1. 模式对话框 模式对话框是一种强制用户与其交互的窗口,...
`CDialogSK`是针对MFC(Microsoft Foundation Classes)库中的`CDialog`类进行扩展的一个示例,目的是实现窗体的换肤和透明效果。这个压缩包文件`CDialogSK.rar`包含了实现这一功能的相关代码和资源。 `CDialog`是...
"非客户区拖动cdialog"这个主题,主要涉及Windows API中的MFC(Microsoft Foundation Classes)库,它是C++对Windows API的一种封装,提供了更高级别的面向对象的编程接口。在MFC中,`CDialog`类是对话框的基础,它...
程序中隐藏WinMain函数,当成是头文件包含进来,我们开发就不需要改动WinMain函数, CWinApp 和CDialog类在SDK中模拟实现,程序会进入我写的InitInstance,该函数里面负责显示窗口,窗口类里面有窗口过程...
在MFC(Microsoft Foundation Classes)框架中,通常使用`AfxMessageBox`函数来创建消息框,但有时我们需要自定义消息框的样式、功能或行为,这时可以考虑扩展`CDialog`类来实现。本文将深入探讨如何利用`CDialog`类...
对话框和对话框类 CDialog 【摘要】:本文将详细探讨对话框及其CDialog类在计算机科学(CS)领域中的应用,主要涉及模式对话框和无模式对话框的区别以及如何使用它们。 对话框在Windows编程中扮演着重要角色,...