开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2387|回复: 1
收起左侧

[图文资料] win32 窗口分类(转)

[复制链接]
结帖率:43% (3/7)
发表于 2012-2-27 19:40:17 | 显示全部楼层 |阅读模式   广东省揭阳市
  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()等来处理特定的资源。



结帖率:13% (1/8)
发表于 2013-4-14 22:19:13 | 显示全部楼层   江西省宜春市
顶。。。。不错学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表