DirectX游戏编程入门——第一部分(Windows和DirectX游戏编程引言)——认识Windows

本系列文章由 net_assassin 编写,转载请注明出处。

http://blog.csdn.net/net_assassin/article/category/1100363


作者:net_assassin    邮箱: net_assassin@hotmail.com    期待着与志同道合的朋友们相互交流

认识Windows

        这是开始DirectX编程之前必须掌握的基础知识。

对于游戏编程,Windows是一个重要的操作系统。

  1. 首先,Windows下有许多很棒的编译器和语言。
  2. 其次,它是世界上最流行的操作系统,任何针对Windows写的游戏都有流行起来的潜力。
  3. 有令人惊异的DirectX SDK 为我们效劳。
       在开始编写DirectX 代码之前,需要学习如何编写简单的Windows应用程序,并且学习Windows处理消息的方法。
Windows是一个多任务、多线程的操作系统。根据所编写的程序类型不同,windows编程可简可繁。如果你有编写应用程序的经验和开发背景,那么就会对图形用户界面(GUI)编程的复杂性有很好的理解。作为多任务的操作系统,windows非常优秀,因为它是 消息驱动的。
下面让我们逐一揭开windows操作系统的神秘面纱:

windows消息机制

我们来详细八一八消息机制,这部分内容可能挺多,不过没关系,很容易理解。

什么是消息?

        消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录(一般在 C/Java/汇编 中称为“结构体”)中包含了消息的类型以及其他信息。例如,对单击鼠标所产生的消息来说,这个记录(结构体)中包含了单击鼠标的消息号(WM_LBUTTONDOWN)、单击鼠标时的坐标(由X,Y值连接而成的一个32位整数)。
       在C语言中,这个结构体叫Msg。

消息中有什么?

       hwnd
  32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。
  message
  用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。
  wParam
  通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。
  lParam
  通常是一个指向内存中数据的指针。

  由于WParam、lParam和Pointer都是32位的,即等同于DWORD。因此,它们之间可以相互转换。

Windows的消息系统

        Windows的消息系统是由3个部分组成的:
  1. 消息队列Windows能够为所有的应用程序维护一个消息队列。应用程序必须从消息队列中获取消息,然后分派给某个窗口。
  2. 消息循环通过这个循环机制应用程序从消息队列中检索消息,再把它分派给适当的窗口,然后继续从消息队列中检索下一条消息,再分派给适                   当的窗口,一次进行。
  3. 窗口过程每个窗口都有一个窗口过程来接收传递给窗口的消息,它的任务就是获取消息然后响应它。窗口过程是一个回调函数,处理了一个                       消息后,它通常要返回一个值给Windows。
一个消息从产生到被一个窗口响应,其中有5个步骤:
       1) 系统中发生了某个事件。
  2) Windows把这个事件翻译为消息,然后把它放到消息队列中。
  3) 应用程序从消息队列中接收到这个消息,把它存放在TMsg记录中。
  4) 应用程序把消息传递给一个适当的窗口的窗口过程。
  5) 窗口过程响应这个消息并进行处理。
  • 其中步骤3和4构成了应用程序的消息循环。消息循环往往是Windows应用程序的核心,因为消息循环使一个应用程序能够响应外部的事件。消息循环的任务就是从消息队列中检索消息,然后把消息传递给适当的窗口。如果消息队列中没有消息,Windows就允许其他应用程序处理它们的消息。
Windows操作系统最大的特点就是其图形化的操作界面,其图形化界面是建立在其消息处理机制这个基础之上的。如果不理解Windows消息处理机制,肯定无法深入的理解Windows编程。可惜很多程序员对Windows消息只是略有所闻,对其使用知之甚少,更不了解其内部实现原理,本文试着一步一步向大家披露我理解的Windows消息机制。可以说,掌握了这一部分知识,就是掌握了Windows编程中的神兵利器,灵活运用它,将会极大的提高我们的编程能力。

消息实现概述

Windows操作系统中包括以下几种消息:
  1、标准Windows消息:
             这种消息以WM_打头。
  2、通知消息
       通知消息是针对标准Windows控件的消息。这些控个包括:按钮(Button)、组合框(ComboBox)、编辑框(TextBox)、列表框                                         (ListBox)、 ListView          控件 、Treeview控件、工具条(Toolbar)、菜单(Menu)等。每种消息以不同的字符串打头。
  3、自定义消息
          编程人员还可以自定义消息。

关于Windows句柄

不是每个控件都能接收消息,转发消息和绘制自身,只有具有句柄(handle)的控件才能做到。有句柄的控件本质上都是一个窗体(window),它们可以独立存在,可以作为其它控件的容器,而没有句柄的控件,如Label,是不能独立存在的,只能作为窗口控件的子控件,它不能绘制自身,只能依靠父窗体将它绘制来。
  句柄的本质是一个系统自动维护的32位的数值,在整个操作系统的任一时刻,这个数值是唯一的。但该句柄代表的窗体释放后,句柄也会被释放,这个数值又可能被其它窗体使用。也就是说,句柄的数值是动态的,它本身只是一个唯一性标识,操作系统通过句柄来识别和查找它所代表的对象
       句柄就好像是一个人的身份证,有了它,你就可以从事各种社会活动;否则的话,你要么是一个社会看不到的黑户,要么跟在别人后面,通过别人来证明你的存在。

消息的传送

      1、从消息队列获取消息:
  可以通过PeekMessage或GetMessage函数从Windows消息队列中获取消息。Windows保存的消息队列是以线程(Thread)来分组的,也就是说每个线程都有自己的消息队列。
  2、发送消息
  发送消息到指定窗体一般通过以下两个函数完成:SendMessage和PostMessage。两个函数的区别在于:PostMessage函数只是向线程消息队列中添加消息,如果添加成功,则返回True,否则返回False,消息是否被处理,或处理的结果,就不知道了。而SendMessage则有些不同,它并不是把消息加入到队列里,而是直接翻译消息和调用消息处理(线程向自己发送消息才是这样),直到消息处理完成后才返回。所以,如果我们希望发送的消息立即被执行,就应该调用SendMessage。

消息与事件

  事件本质上是对消息的封装,是IDE编程环境为了简化编程而提供的有用的工具。这个封装是在窗体过程中实现的。每种IDE封装了许多Windows的消息,例如:
  
事件 消息
OnActivate WM_ACTIVATE
OnClick WM_XBUTTONDOWN
OnCreate WM_CREATE
OnDblClick WM_XBUTTONDBLCLICK
OnKeyDown WM_KEYDOWN
OnKeyPress WM_CHAR
OnKeyUp WIN_KEYUP
OnPaint WM_PAINT
OnResize WM_SIZE
OnTimer WM_TIMER

多线程

         多线程对游戏编程非常有用。在一个游戏循环中涉及的许多任务都可以交付给可独立执行的不同线程实现,每个线程都与主程序通信。大多数流行的游戏引擎都是多线程的,也就是说它们天生就支持多处理器。这对于那些为了买多核系统而花费更多的游戏者而言,实在是物有所值。


  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值