Ich mache eine Art ms paint Anwendung, die eine Kontur zeichnet und füllt. Ich habe eine rekursive Funktion geschrieben, die die Kontur füllt. Es funktioniert gut, aber wenn die Kontur zu groß ist, wirft das Programm eine Stackoverflow-Ausnahme. Wie kann ich dieses Problem lösen?? ich kann diese Ausnahme nicht einmal abfangen((
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
[DllImport( "user32.dll" )]
static extern IntPtr GetDC( IntPtr hWnd );
[DllImport( "user32.dll" )]
static extern int ReleaseDC( IntPtr hWnd, IntPtr hDC );
[DllImport( "gdi32.dll" )]
static extern int GetPixel( IntPtr hDC, int x, int y );
[DllImport( "gdi32.dll" )]
static extern int SetPixel( IntPtr hDC, int x, int y, int color );
static public Color GetPixel( Control control, int x, int y )
{
Color color = Color.Empty;
if (control != null)
{
IntPtr hDC = GetDC( control.Handle );
int colorRef = GetPixel( hDC, x, y );
color = Color.FromArgb(
(int)(colorRef & 0x000000FF),
(int)(colorRef & 0x0000FF00) >> 8,
(int)(colorRef & 0x00FF0000) >> 16 );
ReleaseDC( control.Handle, hDC );
}
return color;
}
static public void SetPixel( Control control, int x, int y, Color color )
{
if (control != null)
{
IntPtr hDC = GetDC( control.Handle );
int argb = color.ToArgb();
int colorRef =
(int)((argb & 0x00FF0000) >> 16) |
(int)(argb & 0x0000FF00) |
(int)((argb & 0x000000FF) << 16);
SetPixel( hDC, x, y, colorRef );
ReleaseDC( control.Handle, hDC );
}
}
int oldX, oldY;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Graphics g = panel1.CreateGraphics();
g.Clear(panel1.BackColor);
}
bool paint;
private void Form1_Load(object sender, EventArgs e)
{
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
oldX = e.X;
oldY = e.Y;
paint = true;
}
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
paint = false;
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (paint)
{
Graphics g = panel1.CreateGraphics();
Pen p = new Pen(Color.Black);
g.DrawLine(p, oldX, oldY, e.X, e.Y);
oldX = e.X;
oldY = e.Y;
}
}
private void panel1_MouseDoubleClick(object sender, MouseEventArgs e)
{
fill(e.X, e.Y, Color.Black, Color.Red);
Color c = GetPixel(panel1, e.X, e.Y);
ClearButton.BackColor = c;
label1.Text = e.X + " " + e.Y;
}
private void fill(int x, int y, Color border, Color c) {
Color PointedColor = GetPixel(panel1, x, y);
try {
if (PointedColor.R != border.R && PointedColor.G != border.G && PointedColor.B != border.B &&
PointedColor.R != c.R && PointedColor.G != c.G && PointedColor.B != c.B &&
x >= 0 && x < panel1.Size.Width && y >= 0 && y < panel1.Size.Height)
{
SetPixel(panel1, x, y, c);
fill(x - 1, y, border, c);
fill(x + 1, y, border, c);
fill(x, y - 1, border, c);
fill(x, y + 1, border, c);
}
}
catch(System.StackOverflowException e)
{
label1.Text = e.Message;
}
}
}
}