`
lijunabc
  • 浏览: 47263 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Windows窗口、控件和对话框

    博客分类:
  • c++
阅读更多

from:http://www.zbitedu.com/?action-viewthread-tid-24616

Windows窗口、控件和对话框

windows应用程序是通过窗口(window)、控件(control)和对话框(dialog box)来和用户交互的,windows系统预定义了很多基本的交互行为和外观,也预定义了很多共用的控件和对话框,让应用程序开发者更容易开发出一致的、标准的交互界面,降低最终用户的学习曲线,并提高用户体验。


mfc(microsoft foundation classes)是对windows api的一套封装,特别是和visual studio的结合,它曾一度简化了windows应用程序的开发,风靡一时。
随着技术的不断发展,windows原有的一套界面技术已经逐渐被.net windows forms或wpf(windows presentation foundation)取代,但窥探其中的一些基本概念和机制,对维护遗留系统和理解新的技术,都是有一定积极作用的。



窗口是什么?窗口类又是什么?


窗口是windows系统中基本的界面元素,由线程来创建。窗口的创建通过createwindow()或createwindowex(),需要提供一个窗口类的名字,标明该窗口属于特定的窗口类。窗口类定义了一些共有属性,包括图标(icon)、窗口的风格(window style)、消息处理函数(window procedure)等。窗口类需要先通过registerclass()注册到系统中,而窗口类的使用范围也是有区别的,分为application local、application global和system defined,系统查找窗口类的顺序也是如此。

windows控件、对话框、窗口的关系是什么?它们的本质区别是什么?

windows系统启动以后会启动桌面(desktop window),这是windows系统实现的,当应用程序启动时一般会创建一个窗口,它包含标题栏(title bar)、菜单(menu),边框(border)等等,这个窗口常常被称为主窗口(main window)。
当然应用程序还需要创建很多别的窗口来完成用户交互,比如对话框,而对话框往往又包含很多控件。


控件和对话框从本质上说都属于窗口,或者可以理解成窗口的子类。
窗口分为以下这几个类型:


overlapped window
pop-up window
child window
layered window
message-only window


其实主窗口就属于overlapped窗口,而对话框属于pop-up窗口,控件属于child窗口。
反应在程序上就是对应于不同的窗口风格(window style):ws_overlapped, ws_popup, ws_child。


窗口之间的关系?窗口之间的消息路由是怎样的?


窗口有一个父窗口(parent)属性,一个窗口只能有一个父窗口。
在创建窗口时如果不指定父窗口那么这个窗口就是顶层的窗口(top-level window)。主窗口应该是一个顶层窗口,它会和windows系统的任务栏(task bar)绑定,在任务栏显示其图标和标题,同时只有一个窗口处于激活状态,称为激活窗口(active window)。
而对于激活窗口内,包括其所有子窗口的在内,只会有一个窗口拥有焦点(focus),拥有焦点的窗口是当前响应消息的窗口。


而通常,主窗口可能会拥有某些对话框,对话框又包含一些控件。控件是child窗口,所以一定属于某个父窗口。所以的窗口都有自己的消息处理函数(window procedure),所以当拥有焦点的窗口处理消息时,它可以选择是否通知父窗口。一般来说消息是不会发送到父窗口的,除非这个控件的状态是disable的,其父窗口负责处理消息并决定是否enable这个控件。


控件从何而来?如何创建控件?


windows系统预定义了很多类型的控件,包括按钮(button)、文本框(edit)、树视图(tree view)等,这些被称为公共控件(common controls),它们被定义在comctl32.dll中,并且其版本也一直在更新。
可以想象对每一种控件windows系统都注册了特定的窗口类,在创建控件时只要指定窗口类名称即可,比如按钮的窗口类名称为“button”。


对话框从何而来?如何创建对话框?


windows系统实际没有为对话框定义多种窗口类,它其实是一种容器(container),多变的是它管理的控件。但是,windows系统却预定义和很多基本功能的对话框,比如打开文件、打印、提取日期时间等等。


windows系统对对话框提供了一定的封装,创建对话框有两类函数:dialogbox()和createdialog()。
这两类函数分别创建模态对话框(model dialog box)和非模态对话框(modeless dialog box)。模态对话框创建后,要求用户完成特定任务后才能返回先前的窗口,比如打印设置对话框,而非模态对话框允许用户切换回原来的窗口但它还是浮动在最上方,比如查找对话框。


在创建对话框时,还需要提供两个重要的参数,一个是对话框模板(template),另一个是对话框的消息处理函数(dialog box procedure)。


先看看模板,其实就是所谓的资源(resource)。它其实就是一段二进制数据,用来描述对话框的一些属性和其中包含的控件,创建对话框的函数根据这些数据创建相应的对话框和控件,通过定义资源,可以简化创建对话框的编码工作,同时比较容易维护。


在编辑资源时,微软为其定义了一套语法,通过文本的方式定义,当然借助ide可以通过图形化的方式生成这些文本。最后编译器会将资源文本编译成资源文件并链接到模块中(module)。除了这种方式,对话框的模板也可以动态的在内存中生成。


再来看看对话框处理函数,它和窗口处理函数有什么区别呢?这里只是另一种封装,对话框是一种窗口也有自己的窗口处理函数,不过系统预实现了这个函数来调用对话框的处理函数。在对话框处理函数中,如果一个消息得到处理则返回true,否则返回false,这是窗口处理函数会再处理这些消息。
一般来说对话框处理函数中仅处理wm_initdialog,wm_command,wm_parentnotify, 和color change等消息,很多消息都由窗口处理函数的默认实现处理了。


资源还有其他什么类型?


资源其实就是一段二进制数据,可以是自定义的任何内容。常见的资源有:图标(icon),光标(cursor),菜单(menu),对话框(dialog box),字符串表(string table),加速键(accelerator),版本信息(version)等等。


可以用findresource()来定位资源,loadresource()来加载资源,也有一些特定的函数比如loadmenu()、loadstring()等来处理特定的资源。
16 位和32 位窗口系统的区别
        窗口之间的父子关系、归属所有关系、以及根据 Z 轴来显示的这些规则在16 位和32 位窗口系统中都是相同的。这样可以是在两种窗口系统中高度的兼容。两种窗口系统的区别在于安全和多线程。
        Window Nt 在原有的窗口层次关系中多增加了一层,每一个运行着Window NT 的系统中都有一个Window 工作站对象,这个对象是安全对象的第一层,是所有用户安全对象的继承之源,每一个Window 工作站对象可以拥有一些桌面对象,每一个桌面都拥有上面描述的那样的窗口关系。Window Nt 用了两个桌面窗口对象,一个是用来处理登陆界面、屏蔽、锁住工作站等,一个是我们登陆之后进来操作的窗口了。J 通常用户是不能够创建和删除桌面的,不过那是通常,实际上在Window 下面也可以实现类似 Linux 中的多个桌面的效果,每一个桌面都是一个独立的世界。
  
  两种窗口系统还有两位一个区别,在16 位窗口系统中不支持多线程,所以应用程序开发者在创建窗口的时候不必考虑线程的问题了。而在32 位窗口系统中由于又支持了窗口的父子关系,归属与拥有关系,同一个窗口下面的所有线程都拥有相同的一个输入队列,应用程序开发者应该明白输入队列是共享的,在同一个时刻只能有一个线程处理消息,其他的线程都在等待输入队列一直到GetMessage 或者PeekMessage 返回,而且必须注意的是父窗口和子窗口或者是归属与拥有窗口共用同一个线程。
  
  在32 窗口系统中定义两种新的窗口类型,前台窗口和背景窗口,这两种窗口没有列到窗口的层次关系中,前台窗口就是用户当前操作的窗口,其他的所有窗口都是背景窗口。 32 位窗口系统中支持两个函数来处理前台窗口SetForegroundWindow 和GetForegroundWindow。
分享到:
评论

相关推荐

    MFC窗口控件随窗口大小进行自适应

    此工程实现了MFC窗口控件随窗口大小进行自适应,封装了WidgetResize类用来调整控件大小位置,非常好用。

    MFC控件讲解(使用Windows标准控件)

    我们在前面曾提到过,控件是一些行为标准化了的窗口,一般用于对话框或其它窗口中充当与用户交互的元素。在Visual C++中,可以使用的控件分成三类: (1) Windows标准控件 Windows标准控件由Windows操作系统提供,在...

    MFC动态创建控件+对话框滚动条

    开发环境windows, VC++2003 使用ON_COMMAND_RANGE绑定控件事件 封装了三种创建控件 CreateDynControl(CTRLT_BUTTON,"我是按钮",10,20,100,40,NULL); CreateDynControl(CTRL_STATIC,"我是静态文本",150,20,100,45,...

    VC++6[1].0入门【第七章_windows标准控件】.doc

    在前一章,已经学习了在一个对话框中增加控件,用户通过对话框中的控件与应用程序进行交互的方法,在这一章,主要详细讨论不同Windows标准控件的使用特性,你将学会静态控件、按钮控件、编辑框控件、列表框控件、...

    Win32对话框编程

    里面含有6个工程,分别实现各种类型的对话框程序,模态对话框:包括基本对话框,含复杂控件的对话框,自定义按钮对话框;非模态对话框包括:含有父窗口的模态对话框,利用脚本加载的自定义对话框,不含父窗口的...

    VC++ 对话框的使用

     对话框是一种弹出式的特殊窗口,几乎所有的Windows应用程序都要借助于对话框来和用户打交道;它主要用来实现应用程序和用户之间的信息交互。对话框上必须有相应的控件,通过控件,对话框可以收集用户的信息或向...

    MFC控件大全

    我们在前面曾提到过,控件是一些行为标准化了的窗口,一般用于对话框或其它 窗口中充当与用户交互的元素。在Visual C++中,可以使用的控件分成三类: (1) Windows 标准控件 Windows 标准控件由Windows 操作系统提供...

    VC++用对话框控件发消息、获取控件指针

     本源码演示如何利用VC++对话框类的成员函数向控件发送消息和获取对话框控件的类指针,以及如何直接利用对话框控件类操纵对话框控件(发送消息和直接调用成员函数)、如何在程序运行时产生和销毁控件。对话框控件的...

    vc实例精通源码,windows基本控件的使用Demo

    02_CheckBoxDemo 演示复选框和单选按钮控件的使用方法。 03_ComboBoxDemo 演示组合框和列表框控件的使用方法。 04_ScrollBarDemo 演示滚动条控件的使用方法。 05_SpinDemo 演示数值调节按钮的使用方法。 06...

    MFC_对话框和常用教程.doc

    MFC_对话框和常用教程.doc对话框是Windows应用程序中最重要的用户界面元素之一,是与用户交互的重要手段,在程序运行过程中,对话框可用于扑捉用户的输入信息或数据。对话框是一个特殊类型的窗口,任何对窗口进行的...

    MFC各类控件入门学习

    我们在前面曾提到过,控件是一些行为标准化了的窗口,一般用于对话框或其它 窗口中充当与用户交互的元素。在 Visual C++中,可以使用的控件分成三类: (1)Windows 标准控件 Windows 标准控件由 Windows 操作系统提供...

    Windows窗口样式-PDF

    本文全面的概括了基本Windows控件的窗口样式,并以中文注释这些样式,方便开发时快速查看。 1 窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用) WS_CHILDWINDOW 子窗口(不能与WS_POPUP合用) WS_...

    贺兰_通用对话框 Ver 1.0.2

    使用API创建Windows窗口控件 用API实现WINDOWS下的通用对话框 用MCI命令来实现多媒体的播放功能 增强型打开_保存对话框类 自定义系统的打开对话框 wave格式详解.txt 常见的影音及图片文件后缀名(按字母...

    动态调整窗口控件布局的类:CDlgResizeHelper

    该对象帮助在对话框窗口大小改变时保持控件布局,更一般地,它可用于包含子窗口的窗口。它不是继承于CDialog,因此对任何窗口都适用。 参考:...

    WINDOWS CE 6.0开发者参考.part01.rar

    第6章 对话框和属性表 第二部分 windows ce编程 第7章 内存管理 第8章 模块、进程和线程 第9章 windows ce文件系统 第10章 注册表 第11章 windows ce数据库 第12章 通知 第三部分 高级windows ce 第13章 windows ce...

    WINDOWS CE 6_0开发者参考.part05.rar

    第6章 对话框和属性表 第二部分 windows ce编程 第7章 内存管理 第8章 模块、进程和线程 第9章 windows ce文件系统 第10章 注册表 第11章 windows ce数据库 第12章 通知 第三部分 高级windows ce 第13章 windows ce...

    WINDOWS CE 6.0开发者参考.part11.rar

    第6章 对话框和属性表 第二部分 windows ce编程 第7章 内存管理 第8章 模块、进程和线程 第9章 windows ce文件系统 第10章 注册表 第11章 windows ce数据库 第12章 通知 第三部分 高级windows ce 第13章 windows ce...

    MFC设置对话框焦点的方法简述

    1. 设置对话框控件的tab order。 按Ctrl+D即可看见。将需要被设置到焦点的空间的tab order设为1. 2. 对话框的OnInitDialog返回FALSE。解释如下:(摘抄至msdn)   If OnInitDialog returns nonzero, Windows sets the...

    SplitterCtrl:该控件对于将对话框,程序的主窗口或子窗口按几部分进行分区是必需的。 MFC控件,使用GDI绘图

    分离器Ctrl介绍该控件对于将对话框,程序的主窗口或子窗口按几部分进行分区是必需的。您可以将窗口分配给SplitterCtrl将管理的窗口的每个部分。结果,我们将获得带有控件的矩阵。 SplitterCtrl派生自CWnd ,是基于...

    visual C++/mfc入门教程

    VC/MFC入门教程,介绍了WINDOWS的消息机制,图形输出,文档/视结构,窗口控件,对话框,网络通信开发

Global site tag (gtag.js) - Google Analytics