如何保留我绘制在绘图盒上的绘画?在调整大小或刷新后保留绘画
我画了一个圆圈,并通过ExtFloodFill API填充它。 这工作正常。
当我调整窗体大小(或最小化)并将其大小调整回原始大小时,部分绘画消失了。
当我刷新图片框画会完全消失
我试图重新绘制它的Paint事件,但是这造成它不断为自己引发的绘画重绘绘画事件也是如此。
请参阅下面的测试项目。
- 当您单击图片框时,绘画将被绘制。
- 当你双击画框时会刷新。
[1个表格1个PictureBox的命名pictureBox1]
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace FloodFill
{
public partial class Form1 : Form
{
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
[DllImport("gdi32.dll")]
public static extern IntPtr CreateSolidBrush(int crColor);
[DllImport("gdi32.dll")]
public static extern bool ExtFloodFill(IntPtr hdc, int nXStart, int nYStart, int crColor, uint fuFillType);
[DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
[DllImport("gdi32.dll")]
public static extern int GetPixel(IntPtr hdc, int x, int y);
public static uint FLOODFILLSURFACE = 1;
public Form1()
{
InitializeComponent();
}
private void pictureBox1_Click(object sender, EventArgs e)
{
DrawCircle();
FillGreen();
}
private void DrawCircle()
{
Graphics graBox = Graphics.FromHwnd(pictureBox1.Handle);
graBox.DrawEllipse(Pens.Red, 10, 10, 100, 100);
}
private void FillGreen()
{
Graphics graBox = Graphics.FromHwnd(pictureBox1.Handle);
IntPtr ptrHdc = graBox.GetHdc();
IntPtr ptrBrush = CreateSolidBrush(ColorTranslator.ToWin32(Color.Green));
SelectObject(ptrHdc, ptrBrush);
ExtFloodFill(ptrHdc, 50, 50, GetPixel(ptrHdc, 50, 50), FLOODFILLSURFACE);
DeleteObject(ptrBrush);
graBox.ReleaseHdc(ptrHdc);
}
private void pictureBox1_DoubleClick(object sender, EventArgs e)
{
pictureBox1.Refresh();
}
}
}
我怎样才能保持我画画的时候做我的窗体或PictureBox的调整大小或以任何其他方式被刷新?
[编辑]
我改变了我的Paint事件如下:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
DrawCircle();
FillGreen();
}
而现在的圆圈是大小后重绘正,但此时,floodFill不是
(我还给了picturebox一个浅蓝色的背景作为另一个测试)
[EDIT2]
我改变Paint事件使用Graphics克如下:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
DrawCircle(g);
FillGreen(g);
}
private void DrawCircle(Graphics g)
{
g.DrawEllipse(Pens.Red, 10, 10, 100, 100);
}
private void FillGreen(Graphics g)
{
IntPtr ptrHdc = g.GetHdc();
IntPtr ptrBrush = CreateSolidBrush(ColorTranslator.ToWin32(Color.Green));
SelectObject(ptrHdc, ptrBrush);
ExtFloodFill(ptrHdc, 50, 50, GetPixel(ptrHdc, 50, 50), FLOODFILLSURFACE);
DeleteObject(ptrBrush);
g.ReleaseHdc(ptrHdc);
}
但是,当我调整回原来的大小此时,floodFill的一些行被跳过,尤其是当我调整慢慢
你需要使用绘图参数中的e.Graphics绘制或绘制事件。图片框的图像位图。使用从位图创建的图形!其他任何东西都不会像你所看到的那样持续下去。我也看不出为什么你不使用gdi +绘图,假设你正在使用winforms .. – TaW 2015-03-03 11:58:14
我来自VB6,并试图将我的应用程序转换为C#...我编辑我的问题添加一个新的Paint事件我试过,其结果是:圆圈现在正在重绘,但填充不是 – Hrqls 2015-03-03 12:52:48
您能否解释如何使用Paint参数中的e.Graphics?和我做什么相比,gdi +绘图呢? – Hrqls 2015-03-03 12:54:08