.NET Control.Update 方法在无效后需要吗?

发布于 2024-11-18 01:26:10 字数 198 浏览 2 评论 0原文

在我的代码中,仅调用 .Invalidate 会执行与调用更新相同的操作。事实上,当我随后调用 .Update 时,控件的闪烁似乎更严重。我在文档页面上读到以下内容:

“Update 方法只是强制立即绘制控件”

这对我来说很困惑,因为所有在线重绘示例都告诉我指定一个无效区域,然后调用更新以获得最少的闪烁量。根据这些示例,我假设更新调用是强制性的。

In my code, just calling .Invalidate does the same thing as if an update is called. In fact, when I call .Update afterward, the flicker for the control seems to be worse. I read on the documentation page the following:

"The Update method just forces the control to be painted immediately"

This is confusing for me as all the online examples of redrawing tell me to specify an invalidated region, then call the update in order to get the least amount of flicker. Based on those examples, I would assume that the update call is mandatory.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怼怹恏 2024-11-25 01:26:10

此博文介绍了 Control.Invalidate 和 Control 之间的差异。更新

Control.Invalidate(...)

bool参数表示是否
用户想要使孩子无效
控制他所在的控制
调用无效。长方形
参数是无效的界限
区域参数是区域
使无效。所有的超载
本质上最终会调用其中之一
RedrawWindow、InvaliateRect 或
InvalidateRgn 函数。如果
调用 RedrawWindow 那么这可能
导致 WM_PAINT 消息
发布到应用程序消息
队列(使孩子无效
控制)。

这里需要注意的重要一点是
这些功能只会“无效”
或通过添加“弄脏”客户区
它到当前的更新区域
控件的窗口。这
无效区域以及所有
更新区域中的其他区域是
标记为下次绘画时
收到 WM_PAINT 消息。作为一个
结果你可能看不到你的控件
令人耳目一新(并显示
立即无效(或
同步)。

Control.Update()

更新函数调用UpdateWindow
更新客户区的函数
通过发送 WM_PAINT 来控制
到(控件的)窗口的消息
如果窗口的更新区域不是
空的。该函数发送一个WM_PAINT
直接到 WNDPROC() 绕过
应用程序消息队列。因此,如果
窗口更新区域是以前的
“无效”然后调用“更新”
会立即“更新”(并导致
重新绘制)失效。

Control.Refresh()

现在,您可能已经猜到了什么
Refresh() 就可以了。是的,它
调用invalidate(true)使无效
控件及其子控件,然后
调用 Update() 强制绘制
控制,使失效是
同步。

This blog post describes the differences between Control.Invalidate and Control.Update

Control.Invalidate(...)

The bool parameter denotes whether the
user wants to invalidate the child
controls of the control on which he is
calling Invalidate. The Rectangle
parameter are the bounds to invalidate
and the region parameter is the region
to invalidate. All the overloads
essentially end up calling one of the
RedrawWindow, InvaliateRect or
InvalidateRgn functions. If
RedrawWindow is called then this may
result in a WM_PAINT message being
posted to the application message
queue (to invalidate the child
controls).

The important thing to note here is
that these functions only “invalidate”
or “dirty” the client area by adding
it to the current update region of the
window of the control. This
invalidated region, along with all
other areas in the update region, is
marked for painting when the next
WM_PAINT message is received. As a
result you may not see your control
refreshing (and showing the
invalidation) immediately (or
synchronously).

Control.Update()

Update function calls the UpdateWindow
function which updates the client area
of the control by sending WM_PAINT
message to the window (of the control)
if the window's update region is not
empty. This function sends a WM_PAINT
directly to WNDPROC() bypassing the
application message queue. Thus, if
the window update region is previously
“invalidated” then calling “update”
would immediately "update" (and cause
repaint) the invalidation.

Control.Refresh()

By now, you might have guessed what
Refresh( ) would be doing. Yes, it
calls invalidate(true) to invalidate
the control and its children and then
calls Update( ) to force paint the
control so that the invalidation is
synchronous.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文