GDI及Windows的消息机制
什么是GDI?
GDI, Graphics Device Interface
GDI在以下位置已经被微软列为Legacy Graphics,不建议使用来开发应用程序(http://msdn.microsoft.com/zh-CN/library/windows/desktop/hh309470(v=vs.85).aspx)。
但是这里我们需要了解的是GDI的原理,比如为什么能够用它来做出透明的效果。
(事实上这个问题的答案是LayeredWindow是怎么工作的)
GDI就一系列的Windows API函数的集合,负责代表用户程序来进行图像图形的操作。
GDI+:
Windows GDI+ is a class-based API for C/C++ programmers.
Other topic(Windows消息机制:http://msdn.microsoft.com/zh-CN/library/windows/desktop/ff381405(v=vs.85).aspx)
To pass a message to a window, the operating system calls the window procedure registered for that window. (And now you know what the window procedure is for.)
一个窗口程序,需要对外界发生的事件进行一定的响应,比如:
- 用户按下了某个键
- 系统的状态发生了改变,应用程序必须做相应的反馈(笔记本电池电量低)
这是通过消息机制完成的。
向一个窗口发送消息,是通过调用那个窗口注册到Windows操作系统的窗口过程函数(Windows Procedure Function)来完成的。
For each thread that creates a window, the operating system creates a queue for window messages. This queue holds messages for all of the windows that are created on that thread. The queue itself is hidden from your progam. You can't manipulate the queue directly, but you can pull a message from the queue by calling the GetMessage function.
对于每一窗口,它都要接收很多消息,这些消息不能一次性的都立即得到响应,因此需要一种缓存机制,把消息缓存到queue里面,然后在窗口过程函数处理完上一个消息后,可以从队列里再取出下一条消息进行处理。
而实际上,操作系统采用了更加高效的处理办法,并不是为每个窗口过程都维护一个窗口队列,而是为创建了窗口的线程维护一个消息queue,这样做的好处是,如果一个线程创建了多个窗口的话,那么并不需要维护多个消息队列,维护一个就够了。
之所以这么做,还有一个重要的原因,是Windows操作系统为认为创建窗口的这个线程是要为窗口的一生去负责的。因此下面讲到的消息循环函数,也是在这个线程中的。
The DispatchMessage function tells the operating system to call the window procedure of the window that is the target of the message. In other words, the operating system looks up the window handle in its table of windows, finds the function pointer associated with the window, and invokes the function.
这样,消息队列就变成了与线程相关的一个数据结构,可以预见,这是通过类型TLS(线程局部存储)类似的手段来管理的。
在这个线程中,编写消息循环函数,就像是一个泵一样,它负责源源不断地把消息从queue中抽出来,再经过TranslateMessage和DispatchMessage的处理,将消息发送到它所负责维护的相应的窗口过程中去。
我们能用GDI来做些什么?
哪里有关于GDI最详细的文档?
GDI的局限性有哪些?
GDI有什么替代或者相关的技术吗?
GDI及Windows的消息机制的更多相关文章
- windows程序消息机制(Winform界面更新有关)
windows程序消息机制(Winform界面更新有关) 转自:http://www.cnblogs.com/blosaa/archive/2013/05/31/3109586.html 1. Win ...
- windows程序消息机制(Winform界面更新有关)--转
1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵.这个消息泵让windows程序生生不息. Windows程序有个消息队列,窗体上的所有消息是这个队 ...
- 【笨嘴拙舌WINDOWS】消息机制
如果将WINDOWS比做一个人,那么他就是为你提供各种服务的巫师,他手上有各式各样,奇形怪状的奇葩物品.他脑子充满了智慧,能够为你解决你所不能解决的疑难杂症.但是他不认识你! 你从小立志要想考状元,去 ...
- Windows程序消息机制浅析
1.消息 消息是由MSG结构体来表示的.如下: typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lPar ...
- Windows 消息机制浅析
1. Windows 的历史 中国人喜欢以史为鉴,而事实也确实是,如果你能知道一件事情的来龙去脉,往往可以更容易地理解事物为什么会表现为当前这样的现状.所以,我的介绍性开场白通常会以一段历 ...
- 深入理解windows 消息机制
深入理解Windows消息机制 今天我们来学一学Windows消息机制,我们知道在传统的C语音程序中,当我们需要打开一个文件时,我们可以调用fopen()函数,这个函数最后又会调用操作系统提供的函数以 ...
- 基础篇-Windows消息机制
1在介绍Windows 消息运行机制之前,首先介绍一下消息的概念: 消息(Message)指的就是Windows 操作系统发给应用程序的一个通告[5],它告诉应用程序某个特定的事件发生了.比如,用户单 ...
- <Win32_1>深入浅出windows消息机制[转自crocodile_]
上学期学习了Java ,感觉Java写一个窗口真心简单,很易上手,也就难怪很多开发人员选择Java作为自己的开发编程语言.但是由于自身对windows的热爱,让我觉得c.c++语言才是我亲睐的编程语言 ...
- 深入Delphi -- Windows 消息机制
http://www.txsz.net/xs/delphi/3/Windows%20%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.htm Windows 消息机制 by m ...
随机推荐
- java.lang.IllegalAccessException: Class XXXcan not access xxx with modifiers "private"
field 或者 method 是 provate的 field.setAccessible(true); method.setAccessible(true); 有时候是因为 newinstance ...
- PAT_A1104#Sum of Number Segments
Source: PAT A1104 Sum of Number Segments (20 分) Description: Given a sequence of positive numbers, a ...
- 使用latex绘制多层神经网络结构图
1,使用Tikz包: 2,参考官方例程单层神经网络结构,绘制了一个含有3隐藏层的BP神经网络节点图 代码如下: \documentclass{article} \usepackage{tikz} \b ...
- shell编程:expr的数学运算
运算符两种方式 方式一:expr $num1 operator $num2 方式二:$(($num1 operator $num2)) (方式二在运算符“=”时候会出错) 1+2.sh 这个代码有点问 ...
- 【题解】sweet
题目描述 为了防止糖果被小猫偷吃,John把他的糖果放在了很多的高台上,一个高台可以认为是一段平行于X轴的线段,并且高台的y坐标都是大于0的,每个高台都有左端点和高台的长度,每个高台都有糖果.所有的高 ...
- python- 属性 静态方法,类方法
一,面向对象结构与成员 1,1 面向对象结构分析: 那么每个大区域又可以分为多个小部分: class A: company_name = '老男孩教育' # 静态变量(静态字段) __iphone = ...
- vim的基本快捷操作(二)——可视模式
va{ 选中{}中间内容,包括{} va[ 选中[]中间内容,包括{} va( 选中()中间内容 ,包括{} vi< 选中<>中间内容,包括<> 将上面的a换成i,就不包 ...
- 后端大佬给我配置的deploy serves文件以便学习
serves apiVersion: v1 kind: Service metadata: labels: com.wise2c.service: ui-ll-2 com.wise2c.stack: ...
- Python第五节 元组
Python第八节 元组补充 元组从形式上看,和列表唯一不同的在于,列表是中括号,元组是小括号 元组内的元素不可更改 一. 创建 创建直接在小括号内写元素,用逗号隔开就好 创建空元祖只写一个小括号 元 ...
- Codeforces 1175F 尺取法 性质分析
题意:给你一个数组,问有多少个区间,满足区间中的数构成一个排列. 思路(大佬代码):我们发现,一个排列一定含有1,所以我们不妨从1开始入手计算构成排列的区间个数.对于每个扫描到的1(假设处于位置i), ...