C# .NET UserControl:Size属性在调整大小事件时给出了不正确的值

C# .NET UserControl:Size属性在调整大小事件时给出了不正确的值,c#,winforms,events,resize,user-controls,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);

请原谅代码转储,这些是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#相当陌生,所以可能有一些明显的错误,或者我在错误的时间读取了大小值。有什么想法吗?

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

您是否考虑过重写OnPaint方法并将代码放在该方法中?这将导致在需要重新绘制控件的任何时候执行图形代码,而不管原因是什么


调整大小事件不一定要等到您完成调整父容器的大小。当引发调整大小事件时,它需要等待代码退出,然后才能捕获新的调整大小事件。因此,当窗口/控件快速调整大小时,它无法保持良好状态,您得到的是它最后一次能够捕获事件,而不必是控件的最终状态。。。如果这有意义的话。

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

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

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

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

使用这种方法,您将获得双缓冲,您所需要的只是在OnPaint方法中绘制图形。您可以在Msdn中了解更多信息。

非常感谢。我使用了DoubleBuffer属性而不是SetStyle。另外,我一开始没有意识到使用作为OnPaint方法一部分提供的图形对象。