Mein erstes Bild

Hallo,

ich hab schon einige Konsolenprogramme mit C# geschrieben jetzt wollte ich auf die grpahische Oberfläche wechseln und habe diesen Code entwickelt.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace infofux\_v1
{

 public partial class Form1 : Form
 {

 
 public Form1()
 {
 InitializeComponent();
 }
 public void DrawImagePoint(PaintEventArgs e)
 {
 // Create image.
 Image newImage = Image.FromFile("stein.bmp");
 // Create Point for upper-left corner of image.
 Point ulCorner = new Point(100, 100);
 // Draw image to screen.
 e.Graphics.DrawImage(newImage, ulCorner);
 }

 private void button1\_Click(object sender, EventArgs e)
 {
 DrawImagePoint();
 }




 }
}

Die DrawImagePoint ist eine Prozedur welches bild und wohin sage ich ihm doch innerhalb dieser Prozedur. Dann ruf ich die Prozedur auf wenn ich den Button klicke.Ich verstehe nun nicht was er noch möchte Die Fehlermeldung lautet:

Error 1 No overload for method ‚DrawImagePoint‘ takes ‚0‘ arguments C:\SF_Entwicklung\infofux_v1\infofux_v1\Form1.cs 32 13 infofux_v1

die versteh ich aber leider nicht. Kann mir bitte jemand helfen

Cu Stev

Ergänzung
Hallo @ all,

ich kann meinem Sohn leider nicht helfen, zur Verdeutlichung mein VB6-Code, der das Problem so wie gewünscht löst:

Me.PaintPicture LoadPicture("C:\Testbild.bmp"), 0, 0

Wie geht das mit C#? :smile:

Gruß, Rainer

Auch hallo.

ich hab schon einige Konsolenprogramme mit C# geschrieben
jetzt wollte ich auf die grpahische Oberfläche wechseln und
habe diesen Code entwickelt.

.NET Version 2.0 ?
Aber man kann zum Laden von Bildern einen Blick in diese Resource werfen: http://www.galileocomputing.de/openbook/visual_cshar…

Error 1 No overload for method ‚DrawImagePoint‘ takes ‚0‘
arguments C:\SF_Entwicklung\infofux_v1\infofux_v1\Form1.cs 32 13 infofux_v1

Zu deutsch: Fehler 1 Kein Überladen für Method ‚DrawImagePoint‘ nimmt 0 Argumente

mfg M.L.

Hi Markus,

http://www.galileocomputing.de/openbook/visual_cshar…

den Link kenn ich schon, damit hab ich es lange versucht zusammen zu bekommen nur hab ich halt mit C# noch nicht viel mit Objekten gearbeitet.

Cu Stev

Hallo Stev,

public void DrawImagePoint(PaintEventArgs e)
{
}

private void button1_Click(object sender, EventArgs e)
{
DrawImagePoint();
}

Ganz einfach. Wenn du den Button drückst, wird der Eventhandler gestartet. Der soll deine Methode DrawImagePoint aufrufen. Diese erwartet aber einen Parameter. Der Aufruf muss als so aussehen:

DrawImagePoint(myArgs);

Wobei myArgs vom Typ PaintEventArgs sein muss. Der Hinweis "No overload for method ‚DrawImagePoint‘ takes ‚0‘ arguments " sagt nur, das es halt keine Methode gibt die ohne Argumente auskommt. Es ist nämlich durchaus möglich, das eine Methode mit unterschiedlichen Typen und Mengen von Argumenten aufgerufen werden können.

Graphics.DrawImage (Image, Point) 
//Zeichnet das angegebene Image in seiner ursprünglichen physikalischen Größe an der angegebenen Position. 
Graphics.DrawImage (Image, Point[]) 
//Zeichnet das angegebene Image in der angegebenen Form und Größe an der angegebenen Position. 
Graphics.DrawImage (Image, PointF) 
//Zeichnet das angegebene Image in seiner ursprünglichen physikalischen Größe an der angegebenen Position. 
//und so weiter

Ist es denn notwendig, dass ein solches Objekt übergeben wird? Anscheinend willst du ja nur an einer Stelle ein Bild malen. Ist eine Picturebox vorhanden gehts wohl so (aus der c# Hilfe):

 image1 = new Bitmap(@"C:\Documents and Settings\All Users\" 
 + @"Documents\My Music\music.bmp", true);

 // Set the PictureBox to display the image.
 PictureBox1.Image = image1;

mfg

Dirk.Pegasus

Hi Dirk,

ich misch mich mal ein, mein Großer ist gerade beschäftigt und kann selbst nicht antworten.

In der Schule werden nur Konsolenprogramme geschrieben, das soll der erste Versuch mit der grafischen Oberfläche werden, nur klappt gar nichts. Ich kann kein C#, kann also nicht helfen.

public void DrawImagePoint(PaintEventArgs e)
{
}

private void button1_Click(object sender, EventArgs e)
{
DrawImagePoint();
}

Ganz einfach. Wenn du den Button drückst, wird der
Eventhandler gestartet. Der soll deine Methode DrawImagePoint
aufrufen. Diese erwartet aber einen Parameter. Der Aufruf muss
als so aussehen:

DrawImagePoint(myArgs);

Wobei myArgs vom Typ PaintEventArgs sein muss. Der Hinweis "No
overload for method ‚DrawImagePoint‘ takes ‚0‘ arguments "
sagt nur, das es halt keine Methode gibt die ohne Argumente
auskommt. Es ist nämlich durchaus möglich, das eine Methode
mit unterschiedlichen Typen und Mengen von Argumenten
aufgerufen werden können.

Graphics.DrawImage (Image, Point)
//Zeichnet das angegebene Image in seiner ursprünglichen
physikalischen Größe an der angegebenen Position.
Graphics.DrawImage (Image, Point[])
//Zeichnet das angegebene Image in der angegebenen Form und
Größe an der angegebenen Position.
Graphics.DrawImage (Image, PointF)
//Zeichnet das angegebene Image in seiner ursprünglichen
physikalischen Größe an der angegebenen Position.
//und so weiter

Ist es denn notwendig, dass ein solches Objekt übergeben wird?
Anscheinend willst du ja nur an einer Stelle ein Bild malen.

Das Ziel ist ein Feld von 7 X 7 Bildern, dieses Spiel soll am Ende herauskommen. http://www.infofux.info/gamedesc.html
Alles was in dem Code überflüssiges steht, steht da nur, weil mein Großer den Code nur kopiert, aber nicht verstanden hat.

Ist eine Picturebox vorhanden gehts wohl so (aus der c#
Hilfe):

image1 = new Bitmap(@„C:\Documents and Settings\All Users“

  • @„Documents\My Music\music.bmp“, true);

// Set the PictureBox to display the image.
PictureBox1.Image = image1;

das liefert doch nur ein Bild, oder? Die Zeichen sollen Reihenweise verschoben werden, ein Zeichen wird auf einer Seite eingefügt, verschiebt die Reihe, am Ende fällt ein Zeichen heraus und wird zurückgegeben.

Beispiele hat mein Großer eine Menge gefunden, alles mögliche kopiert, probiert … und eine Fehlermeldung bekommen. Der Frust wird immer größer. :smile: Schön wäre mal ein lauffähiges Projekt, das nur ein kleines Bild (von Platte oder aus einer Picturebox ist erst mal egal) in eine größere Picturebox an frei wählbaren Koordinaten einfügt. Ein Code, den man mit copy and paste einfügt, die Steuerelemente auf die Form legt und startet, der dann einfach nur läuft und den man verstehen lernen kann. Möglichst ohne alles Beiwerk, was mit dem eigentlichen Problem nichts zu tun hat. Die gefundenen Beispiele sind alle nicht gelaufen. :frowning:

Danke für den Tipp, das wird gleich alles ausprobiert.

Gruß, Rainer

Hallo Rainer,

das wird ja was werden …

hier mal was Code:

 protected void makePictureBoxes()
 {

 Array pictureBoxes = Array.CreateInstance(typeof(PictureBox), 7, 7);
 for (int i=0; i

Das in eine Form hinter der Deklaration der Klasse kopieren die Methode makePictureBoxes() aufrufen.

Beispiel dazu:


    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsApplication1
    {
     public partial class startForm : Form
     {
     protected Image dummyForImage;
     protected PictureBox picBox;
     protected Button buttons;
    
     public startForm()
     {
     InitializeComponent();
     makePictureBoxes();
     }
     //eingefügter Code
     }
    }





Im EventHandler muss man noch was tuen ...

In dem Beispiel soll ja ein Wort entstehen,das aus zufälligen Buchstaben entsteht. Warum dann eigentlich Images?

mfg

Dirk.Pegasus

Hallo Dirk,

das wird ja was werden …

ja, ein Übungsprogramm :smile: Probleme sollen auftauchen, dann können sie gelöst werden und man lernt etwas dabei, das ist richtig so.

hier mal was Code:

protected void makePictureBoxes()
{

Array pictureBoxes =
Array.CreateInstance(typeof(PictureBox), 7, 7);

ahhhh! OK das wird mein Großer auch probieren.

for (int i=0; i

Das in eine Form hinter der Deklaration der Klasse kopieren
die Methode makePictureBoxes() aufrufen.

Beispiel dazu:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
public partial class startForm : Form
{
protected Image dummyForImage;
protected PictureBox picBox;
protected Button buttons;

public startForm()
{
InitializeComponent();
makePictureBoxes();
}
//eingefügter Code
}
}

Im EventHandler muss man noch was tun …

hmmm, was?

Daß das eigentliche Programm in einem Array läuft und nur der Inhalt des Arrays sichtbar gemacht wird, ist ja klar. Inzwischen klappt das auch, Grafiken auf die Form zu painten, der Ansatz war falsch.

Damit geht’s …

 public partial class Form1 : Form
 {
 // Dieses Image wollen wir zeichnen:
 Image img;

 public Form1()
 {
 InitializeComponent();
 // Paint-Event abfangen:
 this.Paint += Form1\_Paint;
 }
 public void DrawImagePoint()
 {
 // Create image.
 img = Image.FromFile("stein.bmp");
 }

 private void button1\_Click(object sender, EventArgs e)
 {
 DrawImagePoint();
 }

 private void Form1\_Paint(object sender, PaintEventArgs e)
 {
 if (img != null)
 e.Graphics.DrawImage(img, 100, 100);
 }
 }

In dem Beispiel soll ja ein Wort entstehen,das aus zufälligen
Buchstaben entsteht. Warum dann eigentlich Images?

1.) Weil’s schöner aussieht, 2.) Weil’s schwierig war. :smile:

Die Buchstaben sind nur am Anfang zufällig und werden im Laufe des Programms immer mehr durch absichtlich gewählte Zeichen ersetzt.
Spielen werden ja auch nicht Spieler, sondern die KI-engines der Spieler gegeneinander.

Das Gerüst, so daß zwei Spieler gegeneinander spielen könnten habe ich mal in VB getipp und ausprobiert, so ist das nicht spielbar es gibt keinen Gewinner. Das ist wirklich nur dafür geeignet, KI gegeneinander antreten zu lassen. Ob es dann Gewinner gibt, wenn die KI gut ist, bezweifle ich aber auch noch. :smile:

Danke für die Hilfe!

Gruß, Rainer

Hallo Rainer,

hier der Eventhandler komplett:

void buttonsClick(object sender, EventArgs e)
 {
 Button clickedButton = (Button)sender;
 Array ZS = (Array) clickedButton.Tag;

 //ZS hat dann die Indizes für die Buttons:
 int ausZeile= (int) ZS.GetValue(1);
 int inZeile = (int)ZS.GetValue(1);
 int ausSpalte = (int)ZS.GetValue(1);
 int inSpalte = (int)ZS.GetValue(1);

 //zs[0] ist der Button block (0= 1. horizontale, 1 = 2. ho, 2=1. sen, 3 = 2. senk)
 //zs[1] ist der Index des Buttons im Set
 //jetzt verschieben!
 switch ((int) ZS.GetValue(0))
 {
 case 0:
 inZeile = 0;
 ausZeile = 6;
 break;
 case 2:
 inZeile = 6;
 ausZeile = 0;
 break;
 case 1:
 ausSpalte = 6;
 inSpalte = 0;
 break; 
 case 3:
 ausSpalte = 0;
 inSpalte = 6;
 break;
 }

 pictureBoxDummy.Image = ((PictureBox)pictureBoxes.GetValue(ausSpalte, ausZeile)).Image;

 switch ((int)ZS.GetValue(0))
 {
 case 0: 
 for (int i = 6; i \> 0; i--)
 ((PictureBox)pictureBoxes.GetValue((int)ZS.GetValue(1), i)).Image =
 ((PictureBox)pictureBoxes.GetValue((int)ZS.GetValue(1), i - 1)).Image;
 break;
 case 2:
 for (int i = 0; i 0; i--)
 ((PictureBox)pictureBoxes.GetValue(i, (int)ZS.GetValue(1))).Image =
 ((PictureBox)pictureBoxes.GetValue(i-1, (int)ZS.GetValue(1))).Image;
 break;
 case 3:
 for (int i = 0; i 

Hoffe das hilft erstmal.

mfg

Dirk.Pegasus

hallo Dirk,

soweit schon mal danke. Ich hab nochmal den Code in einem extra Projekt zusammengestellt:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace tst7
{
 public partial class Form1 : Form
 {
 public Form1()
 {
 InitializeComponent();
 }

 private void Form1\_Load(object sender, EventArgs e)
 {

 }
 void buttonsClick(object sender, EventArgs e)
 {
 Button clickedButton = (Button)sender;
 Array ZS = (Array)clickedButton.Tag;

 //ZS hat dann die Indizes für die Buttons:
 int ausZeile = (int)ZS.GetValue(1);
 int inZeile = (int)ZS.GetValue(1);
 int ausSpalte = (int)ZS.GetValue(1);
 int inSpalte = (int)ZS.GetValue(1);

 //zs[0] ist der Button block (0= 1. horizontale, 1 = 2. ho, 2=1. sen, 3 = 2. senk)
 //zs[1] ist der Index des Buttons im Set
 //jetzt verschieben!
 switch ((int)ZS.GetValue(0))
 {
 case 0:
 inZeile = 0;
 ausZeile = 6;
 break;
 case 2:
 inZeile = 6;
 ausZeile = 0;
 break;
 case 1:
 ausSpalte = 6;
 inSpalte = 0;
 break;
 case 3:
 ausSpalte = 0;
 inSpalte = 6;
 break;
 }
 }
 protected void bu()
 {
 //Buttons einbauen
 //1. horizontale
 for (int i = 0; i 

Nun habe ich erwartet das er auf myButton\_Click reagiert und in das Label1 den Text schreibt, aber das tut er nicht.

Was hab ich falsch gemacht?

Cu Stev

Hallo Stev,

soweit schon mal danke. Ich hab nochmal den Code in einem
extra Projekt zusammengestellt:

Ich nehme mal an, du meinst eine extra Klasse. In einem extra Projekt kann das schon mal garnicht (zumnidest nicht so einfach) funktionieren.

Wenn du ein Objekt (hier einen Button) generierst, kann das erstmal nix. Alle Events müssen, wenn was passieren soll, einen Eventhandler kennen lernen. Daher auch die Zeile:

myButton.Click += new EventHandler(buttonsClick);

in der Routine, die das Spielfeld malt. Allen erzeugten Buttons wird damit ein Eventhandler zugeordnet, und zwar immer der selbe!

Ergänze den Handler in dem ersten Code, wo ich den nicht ausformuliert hatte.

Das Zerlegen des Codes in mehrere Klassen, und bisher sehe ich keinen Grund mehr zu machen, soltest du später angehen.

mfg

Dirk.Pegasus