使用C#和.Net 2.0,我使用的是不规则形状的表单(TransparencyKey,FormBorderStyle = None等等),并希望允许"正常"的边界模式.
我将背面颜色从Lime更改为默认值我将FormBorderStyle更改为FixedSingle我将TransparencyKey更改为Colour.None
不幸的是,这在屏幕上看起来完全混乱,图像向下跳跃几个像素并且向侧面和Lime绿色形式.
我认为这是由于在每行代码之后重新绘制表单引起的,是否可以暂停绘制表单直到我进行了更改然后只重绘一次表单?
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); } }
该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); } }