首页 > 解决方案 > SWT 控件 setRedraw 行为

问题描述

在 Windows 上使用 SWT 进行实验Control#setRedraw,我发现WM_SETREDRAW并不总是发送。

停止/开始重绘的 OS 消息由变量 保护drawCount
这似乎意味着如果我执行以下操作:

control.setRedraw(true);  // drawCount: -1
control.setRedraw(true);  // drawCount: -2
control.setRedraw(true);  // drawCount: -3
control.setRedraw(false); // drawCount: -2

然后WM_SETREDRAW: 0永远不会发送。
我不明白。为什么是这样?

相关的代码:

public void setRedraw (boolean redraw) {
    checkWidget ();

    if (drawCount == 0) {
        int bits = OS.GetWindowLong (handle, OS.GWL_STYLE);
        if ((bits & OS.WS_VISIBLE) == 0) state |= HIDDEN;
    }
    if (redraw) {
        if (--drawCount == 0) {
            long topHandle = topHandle ();
            OS.SendMessage (topHandle, OS.WM_SETREDRAW, 1, 0);
            if (handle != topHandle) OS.SendMessage (handle, OS.WM_SETREDRAW, 1, 0);
            if ((state & HIDDEN) != 0) {
                state &= ~HIDDEN;
                OS.ShowWindow (topHandle, OS.SW_HIDE);
                if (handle != topHandle) OS.ShowWindow (handle, OS.SW_HIDE);
            } else {
                int flags = OS.RDW_ERASE | OS.RDW_FRAME | OS.RDW_INVALIDATE | OS.RDW_ALLCHILDREN;
                OS.RedrawWindow (topHandle, null, 0, flags);
            }
        }
    } else {
        if (drawCount++ == 0) {
            long topHandle = topHandle ();
            OS.SendMessage (topHandle, OS.WM_SETREDRAW, 0, 0);
            if (handle != topHandle) OS.SendMessage (handle, OS.WM_SETREDRAW, 0, 0);
        }
    }
}

标签: javaswt

解决方案


JavadocsetRedraw

对该方法的嵌套调用被堆叠

drawCount 代码正在执行此操作。

这将允许代码调用setRedraw(false)然后调用其他代码来打开/关闭重绘,而嵌套的 setRedraw 调用不会过早地再次打开绘图。


推荐阅读