gpt4 book ai didi

.net - 在我执行完所有更新之前,我可以暂停重新绘制表单吗?

转载 作者:行者123 更新时间:2023-12-04 09:38:33 27 4
gpt4 key购买 nike

使用 C# 和 .Net 2.0,我使用不规则形状的表单(TransparencyKey、FormBorderStyle = None 等)并希望允许“正常”边框模式。

我将背景颜色从 Lime 更改为默认值
我将 FormBorderStyle 更改为 FixedSingle
我将 TransparencyKey 更改为 Colour.None

不幸的是,这在屏幕上看起来一团糟,图像向下跳跃了几个像素,并以石灰绿色形式出现在侧面。

我认为这是由于在每行代码之后重新绘制表单造成的,是否可以暂停绘制表单,直到我进行更改,然后只重新绘制一次表单?

G

最佳答案

新答案:在应用新的 Window 属性时覆盖 WndProc 并阻止 WM_PAINT 消息。

旧答案:覆盖 WndProc,并阻止 WM_ERASEBKGND信息。

解释以下代码的作用:

当窗口的区域无效时,Windows 会向控件发送一系列消息,从而生成新绘制的小部件。本系列的早期消息是 WM_ERASEBKGND .通常,为了响应此消息,控件会为自己涂上纯色。后来回复了WM_PAINT消息(通常由我们在 OnPaint 事件中使用)实际绘制完成。如果此绘图不重要,则在小部件更新之前会有延迟,并且您会看到烦人的闪烁。

再次查看您的代码,我显然正在解决一个不同的问题。试试这个新例子。如果bAllowPaint,它将阻止窗体/控件的绘制。标志未设置。

新的例子:

    private const int WM_PAINT = 0x000F;

protected override void WndProc(ref Message m)
{
if ((m.Msg != WM_PAINT) ||
(bAllowPaint && m.Msg == WM_PAINT))
{
base.WndProc(ref m);
}
}

旧示例:
    private const int WM_ERASEBKGND = 0x0014;

protected override void WndProc(ref Message m)
{
if (m.Msg != WM_ERASEBKGND) // ignore WM_ERASEBKGND
{
base.WndProc(ref m);
}
}

关于.net - 在我执行完所有更新之前,我可以暂停重新绘制表单吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/615781/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com