关于窗口抖动的WM_NCPAINT和WM_NCCALCSIZE的有关问题

来源:互联网 发布:成都 人工智能 招聘 编辑:程序博客网 时间:2024/05/21 11:15
一直以来非客户区的绘制是一个令我非常头痛的问题,并不是因为不好画,而是因为即使你画好了,还存在许多瑕疵。但令我最不能接受的就是当鼠标拖拽左上角时,软件的又下角一直抖动个不停,而系统处理时却没有出现这种现象。对于这个问题,我发现微软自家产品VS2015在拖拽左上角时也有抖动现象,当然其他自绘非客户区的软件也都有类似的现象。期间想过很多中方法解决这个问题,比如先让Windows自绘后我再画,没有任何效果。
然而在自绘非客户区(WM_NCPAINT)时,我无意间在WM_NCCALCSIZE消息中下个断点。发现平时窗口启动时不处理的WM_NCCALCSIZE消息触发了断点。然后又在WM_NCPAINT中用DefWindowProc并下断点重新调试,发现窗口启动WM_NCCALCSIZE没有被处理。经过反复调式得出结论,默认的WM_NCPAINT处理中“拦截“了WM_NCCALCSIZE。为什么这么说呢?因为调试过程中,我反复拖拽窗口时断点触发顺序:1.当系统默认处理WM_NCPAINT时(在此消息中调用DefWindowProc即可下断点):先WM_NCCALCSIZE,再WM_NCPAINT。2.当自绘非客户去时(不在WM_NCPAINT中调用DefWindowProc):先WM_NCCALCSIZE,再WM_NCPAINT,再WM_NCCALCSIZE,再WM_NCPAINT。也就是说这两个消息循环调用了两次。所以,我猜想系统默认的WM_NCPAINT处理会拦截WM_NCCALCSIZE消息,避免重复调用。
因此,我又大胆的猜想,非客户区的抖动也许就是因为反复调用WM_NCCALCSIZE和WM_NCPAINT所引起。很遗憾没能解决这个问题,这里就当做个笔记,希望有知道或解决了此问题的高人指点一下。
原创粉丝点击