.NET UserControl:Size属性在Resize事件上给出不正确的值

时间:2009-06-24 17:45:19

标签: c# winforms events resize user-controls

请原谅代码转储,这些是UserControl中的函数

private void PNGQuantPreviewControl_Resize(object sender, EventArgs e)
{
    createOffScreenBm();
    draw();           
} 
private void createOffScreenBm()
{
    offScreenBm = new Bitmap(this.Size.Width, this.Size.Height);
    offScreenGfx = Graphics.FromImage(offScreenBm);
}
private void draw()
{
    // draw background
    offScreenGfx.FillRectangle(transTexture, 0, 0, offScreenBm.Width, offScreenBm.Height);
    // draw image preview
    offScreenGfx.DrawImage(pngQuantPreview, getTopLeftPosition());
    // apply to picture box
    this.CreateGraphics().DrawImage(offScreenBm, 0, 0);
}

因此,当控件更改大小时,它会重新创建屏幕外位图以反映新大小并重新绘制图像。

但是,如果我快速调整控件大小,位图不会填充它,则在右侧和/或底部留有间隙。

我对C#很新,所以可能有一些明显我做错了,或者我在错误的时间读取大小值。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

首先,您需要覆盖OnPaint方法,或者订阅Paint事件并在那里绘制所有内容。

其次,您不需要为双缓冲创建屏幕外位图,因为.net已存在用于此类目的的类BufferedGraphics

第三,创建UserControl descedant并启用内部.net双缓冲更好,如下所示:

public UserControl2
{
    SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
}

使用这种方法,您将获得双缓冲,您只需要在OnPaint方法中绘制图形。您可以在Msdn。

中阅读有关此control styles的更多信息

答案 1 :(得分:1)

您是否考虑过覆盖OnPaint方法并将代码放在该方法中?这将导致您的绘图代码在需要重新绘制控件时执行,无论原因如何。

调整大小事件不一定等到完成父容器大小调整后。当引发resize事件时,它需要等到代码退出才能捕获新的resize事件,这样当窗口/控件快速调整大小时,它就无法保持良好状态,你得到的是上次它能够捕获事件,不一定是控制的最终状态......如果这是有道理的。

答案 2 :(得分:0)

您的控件上是否有类似分割器,或者声明了MinSize或MaxSize?