前面我们说到窗口过程是可以重入的,怎么证明?就用上面列的程序来说明。首先对上面的程序说明一下。上面的程序使用VC的向导生成的一个标准的“Win32 Application”,运行的结果是在一个窗口里打印楚“Hello World”。在菜单里选择Help/About...,会弹出一个“关于窗口”。看看第151行,这里会弹出“关于窗口”,并且 DialogBox这个函数在弹出窗口没关闭前是不会返回的。我们在菜单里选择“关于”后,就可以弹出这个对话框,现在拖着这个对话框在我们的主程序窗口里移动,我们就会发现这个窗口从被盖住的Hello World上移开后Hello World会重新出现。这说明了什么问题?在回答这个问题前有几点说明:1)在我们的程序里,只有在响应WM_PAINT的时候会绘制"Hello World"字符串。2)系统不会替我们保存窗口客户区的内容,系统客户区的内容全部要我们自己绘制,也就是说当覆盖"Hello World"的窗口移走后新出现的"Hello World"还是我们自己画的,而这段绘制代码只有在WM_PAINT的相应函数里才有。OK,综合上面两点,在“关于窗口”活动期间,显然我们程序是在第151行,而重绘窗口的代码是在165行,这只有一个解释:(WNDPROC)WndProc在返回前(也就是DialogBox返回前),(WNDPROC)WndProc又被系统调用了用来处理WM_PAINT。也就是说DispatchMessage会导致(WNDPROC)WndProc的调用,系统在必要的时候也会调用(WNDPROC)WndProc,并且这两者的调用是异步进行的。所以有时候程序出现异常情况说不定就和这个有关。呵呵,不过这个情况我还没有遇到过。 对了,大家可以看看hInstance的值,是0x400000,和前面说得程序起始地址一样,呵呵,难道是巧合吗,大家可以研究一下。 另外补上一句,函数About是“关于窗口”的窗口函数,它是在DialogBox函数里传递给系统的。 GDI和DirectDraw的关系 =================================================== 本来以为《箴言》会指出两者在底层的实现上的关系,谁揽赐旰蟛胖赖扔谑裁炊济挥锌吹健!扼鹧浴分皇羌虻サ慕樯芰?其实都谈不上是介绍)DirectDraw,然后给出了一个24位图到16位图的转换程序。其实,GDI显然在DirectDraw之前出现的,而DirectDraw是Microsoft为了便于游戏,多媒体等需要快速访问显示设备而定义的一个软/硬件的规范。好像在最新的DirectX SDK里,DirectDraw已经被合到DirectShow中去了。《箴言》中提到的双缓冲技术是很重要的,DirectX直接支持显示缓冲的切换,我们在用GDI或者诸如Java AWT这些慢速的方法绘制动画的时候就更需要这种技术了,否则就会出现讨厌的屏幕闪烁现象。在我们设计自己的比较大的(外观比较大)控件的时候,有两个原则就特别重要,一是尽量只更新需要更新的区域,另外就是双缓冲了。 |
正在阅读:《编程高手箴言》读后感(3)《编程高手箴言》读后感(3)
2004-04-07 10:02
出处:CSDN
责任编辑:sdq
键盘也能翻页,试试“← →”键