java - 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);
}
}
}
解决方案
JavadocsetRedraw
说
对该方法的嵌套调用被堆叠
drawCount 代码正在执行此操作。
这将允许代码调用setRedraw(false)
然后调用其他代码来打开/关闭重绘,而嵌套的 setRedraw 调用不会过早地再次打开绘图。
推荐阅读
- python - 有没有办法在 python 的 streamlit 包的多选小部件中添加“全选”选项?
- javascript - Mongo DB 和 NodeJS 部分文本匹配加密列
- kubernetes - 如果我在使用 Spring Data (Jedis) 连接到 Redis 集群的 Spring Boot 应用程序中,如何在 Redis 集群中使用 K8s 的自动缩放?
- linux - 将环境变量设置为 ExternalProject_Add 上下文
- r - geom_text 失败,标题为空(有时)
- spring-boot - Spring Boot 管理员未显示 Spring Boot 客户端的安全端点
- html - LMS 内课程菜单列表中元素的 CSS 效果
- c++ - 运行时错误 - 地址释放后堆使用
- php - 如何将 Woocommerce 多参与者自定义元数据包含到新订单电子邮件中
- excel - 减少 M 查询响应时间