原文来自:www.fishc.com

ShowWindow

CreateWindowEx 建立窗口以后,eax 中传回来的是窗口句柄,注意要把它先保存起来,因为这时候,窗口虽已建立,但还没有在屏幕上显示出来。
要用 ShowWindow 把它显示出来,主要用来控制窗口的显示状态(显示或隐藏),大小控制(最大化、最小化或原始大小)和是否激活(当前窗口还是背后的窗口),它用窗口句柄做第一个参数,第二个参数则是显示的方式。
ShowWindow 函数显示方式(第二个参数)的定义:
预定义值 等 效 值
 SW_HIDE  隐藏窗口,大小不变,激活状态不变
 SW_MAXIMIZE  最大化窗口,显示状态不变,激活状态不变
 SW_MINIMIZE  最小化窗口,显示状态不变,激活状态不变
 SW_RESTORE  从最大化或最小化恢复正常大小,显示状态不变,激活状态不变
 SW_SHOW  显示并激活窗口,大小状态不变
 SW_SHOWMAXIMIZED  显示并激活窗口,以最大化显示
 SW_SHOWMINIMIZED  显示并激活窗口,以最小化显示
 SW_SHOWMINNOACTIVE  显示窗口并最小化,激活状态不变
 SW_SHOWNA  显示窗口,大小状态不变,激活状态不变
 SW_SHOWNOACTIVATE  显示并从最大化或最小化恢复正常大小,激活状态不变
 SW_SHOWNORMAL  显示并激活窗口,恢复正常大小(初始化时用这个参数)
窗口显示以后,用 UpdateWindow 绘制客户区,它实际上就是向窗口发送了一条 WM_PAINT 消息。到此为止,一个顶层窗口才算正常建立并显示!
另外,CreateWindowEx 也可以用来建立子窗口,Windows中有很多预定义的子窗口类,如按钮和文本框的类名分别是”Button”和”Edit”。建立一个按钮,只要把 lpClassName 指向”Button”字符串就可以。

消息循环

Windows是以消息驱动的操作系统。
Windows 中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能创建的各种窗口的消息。
应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。

消息循环的一般形式

程序中的以下代码就是通常的消息循环:
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break?.if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
消息循环中的几个函数要用到一个MSG结构,用来做消息传递:
MSG STRUCT
Hwnd  DWORD  ?
Message DWORD  ?
WParam DWORD  ?
LParam  DWORD  ?
Time  DWORD  ?
Pt      POINT <>
MSG ENDS
它的各个字段的含义是:
hwnd —— 消息要发向的窗口句柄。
message —— 消息标识符,在头文件中以WM_开头的预定义值(意思为Windows Message)。
wParam —— 消息的参数之一。
lParam —— 消息的参数之二。
time —— 消息放入消息队列的时间。
pt —— 这是一个POINT数据结构,表示消息放入消息队列时的鼠标坐标。
这个结构定义了消息的所有属性,GetMessage函数就是从消息队列中取出这样一条消息来的:
invoke  GetMessage, lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax
函数的lpMsg指向一个MSG结构,函数会在这里返回取到的消息,hWnd参数指定要获取哪个窗口的消息,例子中指定为NULL,表示获取的是所有本程序所属窗口的消息,wMsgFilterMin 和wMsgFilterMax 为0表示获取所有编号的消息。
GetMessage 函数从消息队列里取得消息,填写好MSG结构并返回。
如果获取的消息是WM_QUIT 消息,那么 eax 中的返回值是0,否则 eax 返回非零值,所以用 .break .if eax == 0来检查返回值。
TranslateMessage 将 MSG 结构传给Windows进行键盘消息的转换。
当有键盘按下和放开时,Windows 产生WM_KEYDOWN 和 WM_KEYUP 或WM_SYSKEYDOWN 和 WM_SYSKEYUP 消息。
这些消息的参数中包含的是按键的扫描码,我们使用很不方便。
TranslateMessage 的作用是遇到键盘消息则将扫描码转换成ASCII码并在消息队列中插入WM_CHAR 或 WM_SYSCHAR 消息,参数就是转换好的ASCII码。
如此一来,要处理键盘消息的话只要处理 WM_CHAR 消息就好了。
遇到别的消息则TranslateMessage不做处理。
最后,由 DispatchMessage 将消息发送到窗口对应的窗口过程去处理。
窗口过程返回后 DispatchMessage 函数才返回,然后开始新一轮消息循环。
GetMessage 函数是程序空闲的时候主动将控制权交还给 Windows 的一种方式,Windows 是一个抢占式的多任务系统,任务之间每 20ms 切换一次。
试想一下,如果窗口程序在主窗口中采用死循环等待,消息由 Windows 直接发送到窗口过程,那么程序会是下列这种样子 -->
invoke CreateWindow,…
invoke ShowWindow,…
invoke UpdateWindow,…
.while dwQuitFlag == 0
;要退出时在窗口过程中设置dwQuitFlag
.endw
invoke ExitProcess,…
但这样一来,即使程序在空闲状态,轮到自己的20 ms 时间片的时候,CPU时间就会全部消耗在 .while循环中。
使用 GetMessage 的时候,轮到应用程序时间片的时候,如果消息队列里还没有消息,那么程序还是停留在 GetMessage 内部。
这时如果可以由Windows 当家做主没收这 20ms 的时间片,如此保证了CPU资源的合理应用。
应用程序想把所有时间充分用回来,消息队列里没有消息的时候不让 GetMessage 在 Windows内部等待,拱手交出属于自己的CPU时间,那么消息循环可以是下列这种样子:
.while TRUE
invoke  PeekMessage,addr @stMsg,NULL,0,0,PM_REMOVE
.if eax
.break .if @stMsg.message == WM_QUIT
invoke  TranslateMessage, addr @stMsg
invoke  DispatchMessage, addr @stMsg
.else
<做其他工作>
.endif
.endw
PeekMessage 是一个类似于 GetMessage 的函数,区别在于当消息队列里有消息的时候,PeekMessage 取回消息,并在 eax 中返回非零值,没有消息的时候它会直接返回,并在 eax 中返回零。
PeekMessage 的前面4个参数和 GetMessage 是相同的,增加了最后一个参数,PM_REMOVE 表示取回消息的同时从消息队列里删除,否则用PM_NOREMOVE。
返回非零值的时候,程序检查消息是否是 WM_QUIT,是则结束消息循环,不是则用标准流程处理消息;
返回零的时候,表示是空闲时间,程序就可以做其他工作了,但插入做其他工作的代码执行时间不能过长,以不超过10 ms为好,否则会影响正常的消息处理,使窗口的反应看起来很迟钝。
如果必须处理很长时间的工作,那么应该将它分成很多小部分处理,以便有足够的频率来用 PeekMessage 来检查消息。

Win32之ShowWindow相关推荐

  1. 【Visual C++】游戏开发笔记四十一 浅墨DirectX教程之九 为三维世界添彩:纹理映射技术(一)...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8523341 作者:毛星云(浅墨 ...

  2. 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界:光照与材质专场...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨)    邮箱: happylifemxy@163.com 本篇文章里,我们对Direct3D之中固定功能流水线中的3D ...

  3. 【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术:Direct3D渲染五步曲...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8223965 作者:毛星云(浅墨 ...

  4. 【Visual C++】游戏开发四十八 浅墨DirectX教程十六 三维地形系统的实现

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  5. 【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器 DirectInput专场

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  6. 【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界 摄像机的实现

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由zhm ...

  7. 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界 光照与材质专场

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  8. 【Visual C++】游戏开发笔记四十三 浅墨DirectX教程十一 为三维世界添彩:纹理映射技术(二)...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨)    邮箱: happylifemxy@163.com 本篇文章里,我们首先对Direct3D之中固定功能流水线中的 ...

  9. 【Visual C++】游戏开发笔记三十三 浅墨DirectX提高班之二 化腐朽为神奇:DirectX初始化四步曲

    这篇文章里,我们将迈出精通DirectX的第一步,先了解典型Direct3D程序的书写流程,然后学习COM接口的对象的一些思想,然后按照"四步曲"的思路,系统地学习DirectX的 ...

最新文章

  1. 不同类的方法 事务问题_深入理解 Spring 事务原理
  2. 睢县职教中心计算机专业18年高考 成绩,南模18年高考成绩喜人!想进这所学校,你需要知道这些~...
  3. Strange Memory Gym - 102832F
  4. 5930. 两栋颜色不同且距离最远的房子
  5. 看了交大自产的电影《我的太阳》
  6. 滤镜应用——制作车辆行驶效果
  7. Excel数据导入数据库(Java)
  8. Numpy ndarry按行、列求和
  9. [转]ACM之java速成
  10. JDK安装环境变量配置以及java命令可用但javac命令不可用解决方案
  11. Backtrader量化平台教程(五)Signal
  12. 腾讯云--OOS对象存储服务--java程序封装
  13. GIS功能区类型识别
  14. Linux如何安装FTDI D2XX驱动
  15. oracle grid infrastructure 安装,安装Oracle Grid Infrastructure for a Standalone Server
  16. sql触发器(insert,update,delete)
  17. require.js库
  18. CodeForces - 768B Code For 1(找规律)
  19. Linux基础学习(1)
  20. 从零开始单排学设计模式「代理模式」青铜 III

热门文章

  1. Silvaco学习笔记(六)毕设相关
  2. 347.前K个高频元素 C++
  3. 一个额外的小问题——关于jdk和Language level的关系
  4. java大数据量调优(超赞值得收藏)
  5. excel更改页眉页脚_如何在Excel的页眉和页脚中键入“&”号
  6. 夏侯王朝 - (王室族谱)
  7. 赋能型生态演化路径与六大竞争制高点——保险科技生态建设
  8. shell——命令排序
  9. ps 的一些常见的键位技巧
  10. 什么是低电压处理器 笔记本CPU标准与低电压区别对比