18、Windows API 图形用户界面(2)

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

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

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

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

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

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

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

2、常用控件类型

◇文本框(EditRich Edit等);

◇按钮(Button,包括Check BoxesGroup BoxesPush ButtonsRadio Buttons)

◇下拉菜单(ComboBox)

◇列表框(List Box);

◇分组列表( List View)

◇分页(Pager);

◇进度条(Process Bar)

◇属性页(Property Sheet)

◇工作条(ToolBar);

◇树(Tree View)

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

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

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

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

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

二、窗口

1、常见的窗口消息

wps_clip_image-6912

wps_clip_image-7844

2DefWindowProc

    DefWindowProc是一个API函数。

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

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

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

3、消息循环

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

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

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

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

目录
相关文章
|
11月前
|
数据可视化 前端开发 Java
为什么说Windows这么强大呢?— 原来是因为图形化界面
为什么说Windows这么强大呢?— 原来是因为图形化界面
113 0
|
11月前
|
数据可视化 前端开发 Java
打破你对Windows系统的认知?— 原来是因为图形化界面
打破你对Windows系统的认知?— 原来是因为图形化界面
112 0
|
10月前
|
网络协议 Linux 网络安全
Windows远程连接centos7图形化界面,安装xrdp
Windows远程连接centos7图形化界面,安装xrdp
289 0
|
20天前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
64 0
|
4月前
|
API Python Windows
python3应用windows api对后台程序窗口及桌面截图并保存的方法
python3应用windows api对后台程序窗口及桌面截图并保存的方法
403 1
|
4月前
|
移动开发 前端开发 API
HTML5 Canvas 提供丰富的绘图API,支持绘制图形、文本、渐变和图像,助力游戏开发
【5月更文挑战第13天】HTML5 Canvas 提供丰富的绘图API,支持绘制图形、文本、渐变和图像,助力游戏开发。关键功能包括绘制基本形状、文本渲染、图像处理及渐变图案。在游戏开发中,Canvas用于绘制游戏元素、实现动画效果、精确的物理碰撞检测,并具有跨平台兼容性,为创造多样化视觉体验和互动游戏提供强大工具。随着技术进步,Canvas在游戏领域的应用将持续增长。
52 4
|
4月前
|
Windows
LabVIEW在Windows平台上的图形导入
LabVIEW在Windows平台上的图形导入
46 0
|
9月前
|
JavaScript 前端开发 测试技术
一文带你了解图形测试用例|API 自动化测试
Eolink Apikit 的图形用例是指通过图形化的方式去表现 API 流程测试。它包括了条件选择器、单个 API 步骤和操作集等组件。 相较于前面推荐的表格化的通用用例,图形用例可以让测试人员更方便地设计和管理 API 流程测试,同时也更加的灵活。
79 0
|
11月前
|
存储 缓存 API
[总结]Windows Crypto API 自动更新根证书问题原因及解决方案
[总结]Windows Crypto API 自动更新根证书问题原因及解决方案
127 0
|
11月前
|
API Windows
[笔记]Windows核心编程《番外篇》常用的NT API及使用示例
[笔记]Windows核心编程《番外篇》常用的NT API及使用示例
155 0