最近做界面的时候遇到一个问题,在WM_SIZE的消息处理函数中需要调整多个控件的位置,发现在2K下可以顺利工作,可是在xp下就有很强的闪烁感。Google了一下,发现java awt的一个bug(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4959178)提到这个错误。主要原因也是2k和xp下WM_SIZE消息有一些区别。
before xp, e.g. windows 2000:
WM_SIZING
WM_ERASEBKGND <- erase background here is ok
WM_SIZE
WM_PAINT
in xp:
WM_SIZING
WM_ERASEBKGND <- erase here doesnt work some times
WM_SIZE
WM_ERASEBKGND <- need to do the erase here
WM_PAINT
但是并没有详细提到如何解决这个bug,对java没有太多认识,也就没有继续跟进awt。又Google了很久,在"The Old New Thing"上找到了一篇好文章"What's the point of DeferWindowPos?" http://blogs.msdn.com/oldnewthing/archive/2005/07/06/436043.aspx
我的问题本身的解决用DeferWindowPos代替了MoveWindow和SetWindowPos就好了,关键是在那篇文章后面一些人的跟贴比较精彩,尤其是WM_WINDOWPOSCHANGED和WM_SIZE之间的一些关系,和使用DeferWindowPos的一些经验谈。