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