天天看点

游戏编程之路 -- 《Windows游戏编程大师技巧》第2,3,4章 笔记

    从第二章开始,实在觉得又是在看以前的内容,也许这几章是为了那些以前从来没有接触过win32编程的人写的,但无论如何,还是要看一遍,于是就这周就把第2,3,4章都浏览了一遍,虽然感觉是以前都看过,但总的来说还是有收获。

    对于熟悉的章节,我加快了阅读速度,尽管也许有些内容还是理解不透彻,但为了加快步伐,也就省略了一些问题,目的是为了迅速的进入书本的第二部分。

    首先是WM_PAINT消息,以前一直没有理解透彻,这次仔细琢磨了一下,并结合了GetDC函数的理解,感觉算是真的理解了。WM_PAINT的一般响应方式是使用   hdc = BeginPaint(hwnd,&ps)    和   EndPaint(hwnd,&ps)  来包围处理代码,而且这两个函数也就只能在响应WM_PAINT消息中使用,但他们还做了一件事,就是在BeginPaint(hwnd,&ps)会使无效区变成有效,使Windows不再发送WM_PAINT 消息;而    GetDC(hwnd)   和   ReleaseDC(hwnd, hdc)   则是在任何情况下都能使用,却不会使窗口无效区变的有效,如果你在WM_PAINT消息响应里面单单的使用这两个替换掉BeginPaint和EndPaint,就会造成WM_PAINT消息的无限发送,所以,为了解决这个问题,就应该在之后调用GetClientRect(hwnd,&rect);ValidateRect(&rect)来是窗口有效化,这样就可以避免无限发送WM_PAINT消息了。

    关于无效矩形

    一直以为要是窗口无效,一定要调用InvalidateRect,而且需要自己去记录和处理无效矩形,然而InvalidateRect只是提供给程序员一种能够使一个矩形区域无效化的手段,并不是一定的调用,因为当窗口的某些区域被覆盖或者发生重绘时,WM_PAINT消息被发出,windows都会去记录无效矩形,并且在存储在PAINTSTRUCT这个数据结构里面,通过这个无效矩形,可以在你的消息处理过程中只去重绘无效的矩形,而提高绘图效率。而通过BeginPaint获得的hdc,也只能去绘制无效区域。

    SendMessage和PostMessage

    以前也想过,这两个所谓的同步和异步到底是如何实现的,其实这...非常简单,就是PostMessage是在消息队列中增加一个消息,而SendMessage就是简单的调用你的消息处理函数,从而只有在消息处理函数执行完毕以后,SendMessage才会放回,当然,这就理所当然做到了同步了。

    Making a Real-Time Event Loop

    达到这个目的,就是在更改一般的windows的无限循环模式,不是在等待消息的到来才做动作,而是使循环至始至终都在执行。所以就直接写一个while(1)循环,而获取消息这是使用PeekMessage而不是用GetMessage,并加上结束循环的操作

    if(msg.message == WM_QUIT)

    break;

    WM_CHAR 和 WM_KEYDOWN

    简单的说,WM_KEYDOWNz是检测你是否按下了键盘上的某个键,而WM_CHAR则会附带ASCII码的信息。至于信息,都在wparam和lparam中。

    以上说的,其实都只是和win32编程相关,但和游戏编程也许都没有太大的关系,这是作者在书中好几次都提到了的,好了,第四章即将完成,然后就是书本的第二部分。

继续阅读