MFC教程(12)-- 对话框和对话框类CDialog(1)

对话框经常被使用,因为对话框可以从模板创建,而对话框模板是可以使用资源编辑器方便地进行编辑的。

模式和无模式对话框

对话框分两种类型,模式对话框和无模式对话框。

模式对话框

一个模式对话框是一个有系统菜单、标题栏、边线等的弹出式窗口。在创建对话框时指定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。

时间: 2024-10-31 07:35:30

MFC教程(12)-- 对话框和对话框类CDialog(1)的相关文章

MFC教程(3)-- CObject类

CObject是大多数MFC类的根类或基类.CObject类有很多有用的特性:对运行时类信息的支持,对动态创建的支持,对串行化的支持,对象诊断输出,等等.MFC从CObject派生出许多类,具备其中的一个或者多个特性.程序员也可以从CObject类派生出自己的类,利用CObject类的这些特性. 本章将讨论MFC如何设计CObject类的这些特性.首先,考察CObject类的定义,分析其结构和方法(成员变量和成员函数)对CObject特性的支持.然后,讨论CObject特性及其实现机制. COb

MFC教程(14)-- SOCKET类的设计和实现

WinSock基本知识 这里不打算系统地介绍socket或者WinSock的知识.首先介绍WinSock API函数,讲解阻塞/非阻塞的概念:然后介绍socket的使用. WinSock API Socket接口是网络编程(通常是TCP/IP协议,也可以是其他协议)的API.最早的Socket接口是Berkeley接口,在Unxi操作系统中实现.WinSock也是一个基于Socket模型的API,在Microsoft Windows操作系统类中使用.它在Berkeley接口函数的基础之上,还增加

MFC程序如何实现给对话框添加背景图片

1.插入一个Bitmap的资源图片,假设资源名称为:IDC_BITMAP1 2.在CXXXDialog::OnPaint()中实现: void CMyDialogDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cx

绘图-MFC界面新手提问:对话框背景图片和图片控件 的速度问题

问题描述 MFC界面新手提问:对话框背景图片和图片控件 的速度问题 新手美工,正在做前台,想知道在做一个全部由自绘和贴图完成的MFC对话框界面的时候,是直接用大图做背景图片好,还是将图片裁开成小图一个个用图片控件好? 在速度或者其它方面有什么影响吗?真心求教,膜拜大神们!!! 解决方案 关键看你这些图片需要不需要变化,如果不需要变化,还是整个一个背景好,比较简单.2d绘图对于现在级别的显卡,根本没有性能的差异. 解决方案二: 控件越多越慢.但是也要看你的图有多大(比如几M也不行).MFC(第一代

mfc入门-vs2010中mfc如何在已添加的类中再给后加的对话编辑器添加变量

问题描述 vs2010中mfc如何在已添加的类中再给后加的对话编辑器添加变量 vs2010中mfc如何在已添加的类中再给类创建之后添加的对话编辑器添加变量 解决方案 需要对话框重新绑定,生成对话框类,然后你添加变量等,你先生成类了,就只能手动修改了,没法自动绑定到资源

JAVA提高教程(12)-认识Map之HashMap

Map里面使用率最多的,应该是HashMap吧,我们先来看看这个 1.package collection.lession12; 2. 3.import java.util.HashMap; 4.import java.util.Iterator; 5.import java.util.Map; 6. 7./** 8. * 老紫竹JAVA提高教程(12)-认识Map之HashMap<br> 9. * 基于哈希表的 Map 接口的实现.<br> 10. * 一个映射不能包含重复的键:

代码-【MFC,VS2013中使用Serialport类的问题???急】

问题描述 [MFC,VS2013中使用Serialport类的问题???急] 10C 上位机软件.1.在VC6.0中用SerialPort类,数据的传输完全没有问题.[我代码没有问题]2.使用串口精灵传输命令没有问题.[我机器没有问题]3.但是我现在将代码用在VS2013发送数据就完全没有反应.[同样的代码同样的机器用VS2013就有问题]VS2013中我把数据发送分为2个部分:①初始化串口+②发送数据命令.如果每次发送格式是:①初始化串口+②发送数据命令[没有问题]如果格式是:②发送数据命令[

PHP开发框架Yii Framework教程(12) UI 组件 ClipWidget示例

CClipWidget提供了类似录制"宏"的功能,定义在CClipWidget的init和run之间的内容可以存放在Controller的Clip变量中 ,然后重新回放到任意其它位置. CClipWidget封装的是CBaseController的beginClip和 endClip,CBaseController的 beginClip和 endClip的基本用法如下: 首先定义Clip $this->beginClip('clipID'); // ... display the

Android LibGDX游戏引擎开发教程(九) 动画类的使用

对于一款成功的游戏,动画效果也是整个游戏中不可或缺的元素之一,那下面我们就来讲解一下动画类的 使用方法. 一.Animation类 1.Animation介绍 开发教程(九) 动画类的使用-android 动画引擎"> 该类存放在 com.badlogic.gdx.graphics.g2d的包下,该类继承自Object. 2.Animation定义 这 是官方API的定义,大概的意思是说:一个动画就是存放了一个列表的图片表示在设定的时间间隔序列的显示 .比如,一个正在跑步或者正在跳动的人.

vc-VC对话框嵌套对话框,移动不同步

问题描述 VC对话框嵌套对话框,移动不同步 在对话框A中Static控件上创建并显示对话框B,但是移动对话框A时对话框B无法跟着一起移动,一直没有解决,求各位大神帮忙!!能让对话框B随着对话框A一起移动. 解决方案 在对话框A中Static控件上创建并显示对话框B,是什么意思? 对话框 B 应该不是真正嵌套到对话框 A 中时,确定是无法同步移动. 可以考虑在对话框 A 中通过代码来控制对话框 B的移动,这样做同步会有一点延时的. 解决方案二: 这个需要自己编程控制了,要么就创建MDI窗体. 解决