一、基本概念<?xml:namespace prefix = o />

1、Windows系统是消息(Message)驱动的。当用户操作输入设备,产生硬件中断后,系统内核会得到这此硬件中断,硬件在系统中经过复杂的运算和处理最终变成消息。消息被系统发送给指定窗口。

所有的对用户界面的操作都会产生消息,包括鼠标单击、按钮、菜单选择、窗口创建、窗口移动等。

在创建窗口时,需指定窗口所属的窗口类,每一个窗口类都对应一个消息处理函数,因此每一个窗口都具有自己的消息处理函数。消息处理函数是一个回调(Call Back)函数,由系统调用。

应用程序向系统注册了窗口类,创建了窗口,系统在消息产生后,需要窗口消息处理函数来处理时,调用窗口所对应的消息处理函数。

并不是只有用户的输入才会产生消息。一些随机发生的事件也会产生消息,如系统关机、外设插入、计时器计时到达等。

2、常用控件类型

◇文本框(Edit、Rich Edit等);

◇按钮(Button,包括Check Boxes、Group Boxes、Push Buttons、Radio Buttons);

◇下拉菜单(ComboBox);

◇列表框(List Box);

◇分组列表( List View);

◇分页(Pager);

◇进度条(Process Bar);

◇属性页(Property Sheet);

◇工作条(ToolBar);

◇树(Tree View)

控件实际是一种特殊的窗口。每一种控件有固定的样式、消息处理过程等,系统将这此属性做了固定的模式化的处理,并提前注册为窗口类。

这些控件在程序设计时不用再重新注册,也不用再去定义其消息处理函数、界面样式、窗口大小等,可以直接使用。

在程序使用控件前,最好先调用InitCommonControls以保证调用控件所需使用的动态链接库被加载。[1,P258]

3、资源是应用程序在运行中可能会使用到的一些数据。资源包括图标、位图、菜单等。在程序设计时,在资源脚本(.rc)中配置资源,在程序构建时,资源编译器会将资源编译为资源文件(.res),然后由链接器将资源链接到可执行文件中。

4、对话框是一种临时窗口,一般用来显示信息、获取用户的输入等。但对话框又是一种特殊的窗口,可以通过资源来创建对话框,对话框及对话框上所显有的控件都可以在资源脚本中配置,而窗口不可以。对话框具有所属窗口,在对话框处理完成,关闭之前,拥有对话框的窗口不能进行操作。

二、窗口

1、常见的窗口消息

2、DefWindowProc

DefWindowProc是一个API函数。

窗口会收到很多消息,但是这些消息消息处理函数不一定需要处理,有些消息可能直接让系统来处理。DefWindowProc的作用是处理窗口消息处理函数没有处理完、或者不需要处理的函数。

实际上很多程序员没有关注的消息都是由DefWindowProc来处理的。如果在消息处理函数中不把消息交给DefWindowProc处理,那么对窗口的动作几乎不会有响应,包括移动窗口、关闭窗口等,甚至有很多窗口样式不能显示。

一般情况下,除非程序员确定一个消息不再需要DefWindowProc来处理,那么最好将不需要的消息统一交由DefWindowProc函数来处理。

3、消息循环

GetMessage是从其所在的线程的消息队列中得到一条消息。在TranslateMessage函数对消息进行转换后,DispatchMessage将消息发送到消息处理函数,通常用于分配GetMessage函数获得的消息。

Windows系统为每一个线程创建消息队列,从消息队列中获取消息使用GetMessage函数;也可以调用API函数将消息添加到消息队列中。PostMessage与SendMessage不同的是,PostMessage只是将消息放置在线程的消息队列之后便立即返回,而SendMessage是直接将消息交给窗口消息处理函数。PostQuitMessage函数将WM_QUIT消息放置在消息队列中,GetMessage函数在获得了WM_QUIT消息后,会返回0,退出消息循环。

注意的是,GetMessage只是获取了其所在的线程的消息池中的消息。在开发多线程的图形用户界面程序时,将所有的窗口创建设置在同一个线程中,子窗口的创建最好在主窗口的消息处理函数中,这样能保证消息都集中在同一个线程,如果在其他线程中需要操作界面,可以直接使用PostThreadMessage,SendMessage等函数向窗口发送自定义的消息,然后再在窗口消息处理函数中处理这些自定义的窗口消息时进行窗口操作。

4、资源及其文件的编写[1,P269]

►关于窗口的讲解,可以参见[1~3]等系列文章。

Windows[4]

Menus[5]

Dialog Boxes[6]

[1] 精通Windows API 函数、接口、编程实例

[2] http://blog.163.com/zhoumhan_0351/blog/static/3995422720103129131208/

[3] http://blog.163.com/zhoumhan_0351/blog/static/3995422720103401415721/

[4] http://msdn.microsoft.com/en-us/library/ms632595%28VS.85%29.aspx

[5] http://msdn.microsoft.com/en-us/library/ms647553%28VS.85%29.aspx

[6] http://msdn.microsoft.com/en-us/library/ms632588%28VS.85%29.aspx

转载于:https://www.cnblogs.com/mydomain/archive/2011/01/09/1931327.html

18、Windows API 图形用户界面(2)相关推荐

  1. 17、Windows API 图形用户界面(1)

    一.基本概念 Windows的用户界面分为两个部分:字符图形界面和图形用户界面.字符图形界面较为简单,主要内容包括如何在界面上读取用户输入,如何向界面终端输出信息.如何控制界面的字体.背景.颜色等. ...

  2. 服务器系统核心和带gui区别,Windows Server 2012图形用户界面(GUI)和服务器核心(Server Core)之间的切换...

    当安装 Windows Server 2012 时,咱们能够在"服务器核心安装"和"彻底安装"之间任选其一."带 GUI 选项的服务器"选项 ...

  3. Windows API GetLastError错误代码解释大全(最完整的一篇)

    这个也很好获取,循环FormatMessage即可. 0 操作成功完成. 1 函数不正确. 2 系统找不到指定的文件. 3 系统找不到指定的路径. 4 系统无法打开文件. 5 拒绝访问. 6 句柄无效 ...

  4. Windows API参考大全

    第一章 Win32 API概论 1.1为什么使用 Wu32 API 在Windows程序设计领域处于发展初期时,Windows程序员可使用的编程工具唯有API 函数.这些函数在程序员手中犹如" ...

  5. Python图形用户界面设计-Delphi For Python高级开发教程

    目录 简介........................................................................ 5 谁应该阅读这本教程........... ...

  6. windows api打开文件对话框

    用windows api 写打开文件对话框主要使用OPENFILENAME ,GetOpenFileName, GetSaveFileName; 1.OPENFILENAME 结构体介绍:要使用Get ...

  7. python图形用户界面设计报告_19.1 Python图形用户界面开发工具包

    ,赠送一本"Python相关图书".咨询方式:加[51CTO-关老师付费群]523714201 验证消息:咨询赠书 本视频采用**Python 3.X版 本书是智捷课堂开发的立体化 ...

  8. C++ WINDOWS API 第2章 Windows API概要

    目录 2.1       Windows数据类型.. 1 2.1.1       Windows数据类型示例.. 1 2.1.2       Windows 数据类型与标准C 数据类型的关系.. 5 ...

  9. Delphi 下用Windows API 创建窗体

    Delphi 下用Windows API 创建窗体 副标题: 作者:佚名 文章来源:大富翁 点击数:119 更新时间:2005-2-25     Delphi 下用Windows API 创建窗体 / ...

  10. 《树莓派Python编程入门与实战》——2.3 使用Raspbian图形用户界面

    本节书摘来异步社区<树莓派Python编程入门与实战>一书中的第2章,第2.3节,作者:[美]Richard Blum,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

最新文章

  1. 创建mysql数据库,在新数据库中创建表,再尝试删除表
  2. 你在打王者农药,有人却用iPhone来训练神经网络
  3. led大屏按实际尺寸设计画面_“差评”不断的LED户外大屏,到底缺了什么?
  4. 线性表----顺序表
  5. bdd cucumber_如何使用BDD构建坚如磐石的Ruby on Rails应用
  6. 如何进行.NET高效开发
  7. python判断字符类型编程_Python检测数据类型的方法总结
  8. jetty9更改post请求长度
  9. python获取app信息的库_Python学习教程:另辟蹊径,appium抓取app应用数据了解一下...
  10. python学习总结----异常处理
  11. [算法]华为笔试题——字母和十进制数映射
  12. 地统计学中的插值问题
  13. 魅族pro5 刷机 android,魅族Pro5刷通用固件方法教程[多图]
  14. 物联网(lot)特定场景最佳实践
  15. SteamVR简介(Yanlz+Steam+VR+Unity+AR+MR+XR+=)
  16. Python实现过采样和欠采样
  17. 001-三阶魔方-概述及层先法
  18. 验证中国的座机号的正则表达式
  19. 模块加载失败请确保该二进制存储在指定路径中
  20. 闲云旅游项目开发-(第一篇:使用Element-ui实现主页轮播图)

热门文章

  1. 如何在分组报表中实现组内数据补空行及组内页码
  2. 将url参数转为json对象
  3. row_number() over
  4. 常用命令2——VNC
  5. SQL Server MYSQL 对外键建立索引的必要性
  6. Symbian手记【二】 —— Symbian对象构造
  7. ASP.NET【3】--ASHX
  8. Webbench学习笔记二:getopt_long函数和build_request函数
  9. STM32 IWDG时间计算方法
  10. v-for key的作用