Laden...

OnPaint löst beim Aufruf der WinForm nicht aus

Erstellt von freakontour vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.138 Views
F
freakontour Themenstarter:in
15 Beiträge seit 2015
vor 4 Jahren
OnPaint löst beim Aufruf der WinForm nicht aus

Hallo,

ich habe einen Code der ausgeführt wird, aber die OnPaint-MEthode wird nicht beim Start der Form ausgelöst. Ich habe die FAQ dazu schon angeschaut, finde aber den Fehler nicht.


using System;
using System.Windows.Forms;
using System.Drawing;

namespace labyrinth
{
	
    public class Program:Form
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Labyrinth lab = new Labyrinth();
			lab.ReadFile();
			lab.Print();
			
			Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
			Console.WriteLine("Test:   " + lab.maze[0,1]);
		
            Application.Run(new Form());
			

        }
		
    override protected void OnPaint(PaintEventArgs e){	
		try{
			//Initalisieren der Farben
			Labyrinth lab = new Labyrinth();
			base.OnPaint(e);
			
			SolidBrush Green = new SolidBrush(Color.Green);
			SolidBrush Red = new SolidBrush(Color.Red);
			SolidBrush Blue = new SolidBrush(Color.Blue);
			
			//Initalisieren der Schrift
			Font font = new Font("Arial",20);
			StringFormat stringF = new StringFormat();
			stringF.Alignment = StringAlignment.Center;
			stringF.LineAlignment = StringAlignment.Center;
			
			//Initialiesieren der Graphik
			Graphics g = e.Graphics;
			Console.Write("Der Wert ist :" + lab.maze[0,0]);
			
			Point point = new Point(20,20);
			
			for (int i=0; i<lab.row; i++){
				for (int j=0; j<lab.coloumn; j++){
					if (lab.maze[i,j] == '#'){
					g.DrawString(Char.ToString(lab.maze[i,j]), font, Green, point, stringF);
					point.Offset(20,0);
					
					//Console.WriteLine("{0}\n{1}",point.X, point.Y);
					}
					else if (lab.maze[i,j] == '.'){
						lab.maze[i,j] = '°';
						g.DrawString(Char.ToString(lab.maze[i,j]), font, Blue, point,stringF);
						point.Offset(20,0);
						Console.WriteLine("{0}\n{1}",point.X, point.Y);
					}
					else if (lab.maze[i,j] == '@') {
						g.DrawString(Char.ToString(lab.maze[i,j]), font, Red, point,stringF);
						point.Offset(20,0);
						Console.WriteLine("{0}\n{1}",point.X, point.Y);
					}
				}
				point.Offset(0,25);
				point.X = 20;
			}	
		}
		catch( Exception ex){
			Console.WriteLine(ex.Message);
		}
	}
	
	}
	}
	

	
	public class Labyrinth
    {
       public int coloumn, row;
       public char[,] maze = null;
       //public Point aktuellePosition = new Point();


        public void ReadFile()
        {
            try
            {
                row = Convert.ToInt32(Console.ReadLine());
                coloumn = Convert.ToInt32(Console.ReadLine());

            }
            catch (FormatException fe)
            {
                Console.WriteLine(fe.Message);
                return;
            }
            
            
            maze = new char[row, coloumn];

			try{
				for(int j=0; j<coloumn; j++){
					string sLine = Console.ReadLine();
					for(int i=0; i<row; i++){
						maze[i,j] = sLine[i];
						//Console.WriteLine(sLine[i]);
					}
				}
			}
			catch(Exception ex){
				Console.WriteLine(ex.Message);
			}
        }
		
		public void Print(){
			try{
				Console.WriteLine("{0}\n{1}",row, coloumn);
				for(int k =0; k<row; k++){
					for(int m=0; m<coloumn; m++){
						Console.Write("  {0}",maze[k,m]);
					}
					Console.Write("\n");
				}
			}
			catch (Exception ex)
				{Console.WriteLine(ex.Message);}
		}
	

	
	
	
}

P
441 Beiträge seit 2014
vor 4 Jahren

Ich würde tippen, dass dein Form überhaupt nicht aufgerufen wird.
Du instanziierst ja nicht deine Form, sondern dessen Basisklasse.

Ich habe auch noch nie gesehen, dass man die Klasse Program von Form erben lässt. Alleine vom Gefühl würde ich das trennen.

F
freakontour Themenstarter:in
15 Beiträge seit 2015
vor 4 Jahren

Hi Papst,

die Form wird aufgerufen und angezeigt.
Wie sollte ich das trennen?
Sry bin da noch nicht so ganz fit.

Gruß Freakontour

P
441 Beiträge seit 2014
vor 4 Jahren

Der Name der Klasse deines Form, bei dem du OnPaint überschreibst, ist Program. Zumindest nach dem Codeschnipsel dort.

Du erstellst allerdings eine Instanz der Klasse Form:

Application.Run(new Form());

Edit:
Richtiger wäre: Eine neue Klasse (form) zu erzeugen, diese LabyrinthForm zu nennen und darin OnPain zu überschreiben. Danach erzeugst du dann in der Zeile mit Application.Run dein neues Form.

F
freakontour Themenstarter:in
15 Beiträge seit 2015
vor 4 Jahren

Ah, danke.
Manchmal sieht man den Wald vor Bäumen nicht.
Klar ich lade einfach nur ne leere Form.

4.938 Beiträge seit 2008
vor 4 Jahren

Außerdem erzeugst du in der OnPaint ein neues Labyrinth-Objekt, das nichts mit dem Labyrinth-Objekt in der Main-Methode zu tun hat!

Und der Kommentar (an der falschen Stelle)


//Initalisieren der Farben
Labyrinth lab = new Labyrinth();
base.OnPaint(e);

SolidBrush Green = new SolidBrush(Color.Green);
// ...

zeigt, daß du den restlichen Code wohl einfach nur kopiert hast (denn Testen konntest du diesen aufgrund der Angabe der falschen Form-Klasse ja bisher nicht).

Und dann noch das Mischen von Console und Form (GUI) wird auch nicht (so) funktionieren...

Vllt. solltest du erst einmal ein reines Konsolenprojekt daraus erzeugen und dann dafür eine Trennung von Ein-/Ausgabe und Logik programmiieren (auch wenn du bisher noch fast keine Logik in deinem Code hast). Danach kannst du den Logikteil für ein WinForms-Projekt übernehmen und dort dann die Ein-/Ausgabe passend ausprogrammieren.