前几天在写一个看图的小程序时无意中发现Windows窗口系统的一个小缺陷。我们知道当一个Windows窗口的位置改变、大小改变、被别的窗口覆盖的部分重新可见时,该windows程序必须负责重新绘制窗口无效部分的内容。一般情况下,程序员只需负责窗口客户区的部分的重画工作,窗口边框、滚动条、状态栏等非客户区部分由Windows系统负责重画。让我觉得惊讶的是,在处理滚动条时,windows却没能正确的重画。当一个窗口同时出现水平滚动条和垂直滚动条时,windows没有正确重画两滚动条交叉的部分(通常在一个窗口或子窗口的最右下角)。要观察这个现象很简单:随便打开一个windows窗口程序,改变窗口大小使其同时出现水平和垂直滚动条,然后上下拖动窗口,使窗口下半部分被任务栏遮挡然后又重新显示;或者随便拖动一个窗口经过目标窗口的右下角部分,你都可以观察到两滚动条交叉的那个小矩形区域没有正确重画。
下面图一中的红色矩形指出了Windows没有正确重画的区域。
<图一>
下面图二中显示的是正常的绘制(文件管理器):
<图二>
下面是文件管理器中没有正确重画的例子(拖动窗口被状态栏覆盖,然后再拖上来),请注意圈注部分:
<图三>
下面是Windows自带的画图板中不正确重画的例子(拖动一个窗口从其上经过):
<图四>
大家可以亲自去试试的,Windows Media Player,NotePad,具有双滚动条的Win32窗口程序等等都有这个问题。我用的OS是Windows XP和Windows 2003 Server,经试验,两个系统平台上都有这个问题。如果要在Windows 2003 Server上观察这个问题,你应该先把 Windows Theme服务打开,然后在Performance options中的Visual Effects中选择Adjust for best appearance,让Windows调整为最佳外观。在Windows XP中这是默认的设置,不用进行任何的设置。
由于自己和周围的人都没有装有Windows 2000、Windows 9X系统,所以没有去试有没有上面说到的问题。希望有装这些系统的朋友试一试,顺便告知一下结果,在此先谢过了:-)