当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在我执行所有更新之前,我可以暂停重新绘制表单吗?》经验,为你挑选了1个好方法。

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

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

不幸的是,这在屏幕上看起来完全混乱,图像向下跳跃几个像素并且向侧面和Lime绿色形式.

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

G



1> overslacked..:

新答案:在应用新的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);
        }
    }

OLD例如:

    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);
        }
    }

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有