Pixelgrafik (Punkt, Linie, Kreis) ...?
-
Hallo Leute,
wie kann man in C# Grafik programmieren.
Ich dachte da so an eine Bibliothek, in der es Befehle wie
Linie(x1,y1,x2,y1,color) oder Point(x,y,color) gibt.Was gibt es da unter C# und .Net Framework?
Danke für Eure Tipps im Voraus!
Gruß,
Micha
-
-
Das Problem ist, das die in der Hilfe kein vernünftiges Beispiel drin haben, an dem man sieht, wie man das mit der Linie oder dem Punkt macht.
public void DrawLineInt(PaintEventArgs e) { // Create pen. Pen blackPen = new Pen(Color.Black, 3); // Create coordinates of points that define line. int x1 = 100; int y1 = 100; int x2 = 500; int y2 = 100; // Draw line to screen. e.Graphics.DrawLine(blackPen, x1, y1, x2, y2); }
Dieses Beispiel findet man in der Hilfe von MS Visual C# 2005 Express Edition.
Aber wenn ich es mal ausführen will, geht es nicht. Ich weiss nicht wohin ich den Programmausschnitt einfügen muß. Es gibt ja 3 Registerkarten mit Code:
Form1.Designer.cs*
Programm.cs*
und Form1.cs*Ich habe alles mögliche schon probiert, aber es klappt nicht!
Entweder ich bekomme die Fehlermeldung:Fehler 1 Der Typ- oder Namespacename "PaintEventArgs" konnte nicht gefunden werden. (Fehlt eine using-Direktive oder ein Assemblyverweis?) C:\Dokumente und Einstellungen\Micha\Lokale Einstellungen\Anwendungsdaten\Temporary Projects\Linie\Form1.Designer.cs 49 33 Linie
oder diese Zeilen werden garnicht ausgeführt. Das Form wird nur dargestellt und dann wartet das Programm darauf, dass ich das Form wieder schließe.
Dass man eine using-direktive braucht muß man sich denken!
Wo kommt die Zeileusing System.Drawing.Drawing2D;
aber hin?
Denke mal, an den Programmanfang! Aber wo ist der Programmanfang!
Wenn man ein neues Windows Applikation Projekt startet, werden ja automatisch mehrere Registerkarten erzeugt, in denen sich überall Code befindet:
Form1.Designer.cs*
Programm.cs*
und Form1.cs*Ich denke mal, dass in der Registerkarte Programm.cs* das Programm anfängt, da der Debugger ja auch dort anfängt.
wer kann mir mal helfen?
Danke im Voraus!
Gruß,
Micha
-
Du musst erstmal überhaupt programmieren lernen, bevor du dich schon mit Computergrafik beschäftigst. Du scheinst ja sogar Probleme bei der Bedienung der IDE zu haben. Das ist nicht böse gemeint, aber ich würde das mit der Grafik jetzt erstmal noch zurückstellen und ein paar Konsolen-Programme schreiben. Ich weiß, nicht so aufregend, aber so ist das nun mal.
-
Tut mir leid, dass ich das nun sagen muss, aber beschäftige dich doch bitte erst mit den Grundlagen der Grundlagen. Kauf dir nen Anfängerbuch, oder such nach nem Tutorial und les erst mal. In deinem anderen Thread hast du schon sehr merkwürdige Fragen gestellt, die man mit einem Anfängerbuch sehr leicht beantworten kann.
Es ist keineswegs böse gemeint, aber so wirst du bald auf die Nase fallen. Erarbeite dir - als gut gemeinter Rat - wenigstens die Grundlagen selber, sonst lernst du nichts dabei.
Form1.Designer.cs*
Programm.cs*
und Form1.cs*Ich vermute mal - man kann seine CS Dateien ja nennen wie man will:
Naja Form1.Designer.cs ist ja selbsterklärend. Das ist - wenn du mal darauf klickst wirste es auch merken - der Designer deines Fensters.
Form1.cs ist der dazugehörige "Code behind".
Und Programm.cs ist vermutlich eine externe Klassendatei.
Die Fehlermeldung sagt ja schon alles. Es fehlt die using - direktive und diese kommt immer ganz oben hin. Da stehtja standardmäßig (ausser du machst nen leeres Projekt) auch meist schon die ein oder andere drinnen.
using System; using System.Drawing; // usw usf.
Man kann dir hier keine komplette einstiegshilfe bieten. Fragen werden gern beantwortet. Aber das ganze grundsächliche zeuch bring dir bitte - wie o.g. - mit einem Buch / Tutorial / ... bei.
MFG
-
Hallo Ihr beiden,
sagt mal, arbeitet Ihr mit MS Visual C# Express Edition oder habt Ihr eine andere IDE? Ich frage, weil
Konsoleprogramme bekomme ich schon hin. Ich will ja auch nur für den Hausgebrauch programmieren, da muß ich nicht unbedingt verstehen, was
"Delegate" ist, denke ich mal.Ich will ja auch nicht unbedingt verstehen, wie Windowsprogrammierung richtig funktioniert, ist mir viel zu kompliziert.
Aber ich möchte die Möglichkeit haben, ein Formular darzustellen und dort ein paar Linien oder Punkte auszugeben. Das darf nicht so kompliziert sein! wenn doch, dann muß ich sagen, war GW-Basic oder Turbo-Pascal vor 16 Jahren besser für den Hausgebrauch als dieses C#.
Formulare mit Buttons oder Textfelder kann ich bereits darstellen das ist nicht weiter kompliziert.
Ich kann mir nicht vorstellen, dass das Zeichnen einer Linie mehr als 3 - 4 Zeilen Code erfordert.
Wer kann mir mal helfen, wo der Beispielcode aus der Hilfe hineinkopiert werden muß?
Danke!
Gruß,
Micha
-
Es ist auch nicht kompliziert. Und es braucht auch nicht mehrals ein paar Zeilen Code.
Aber deine Fragen ala:
Wo kommt die Using directive hin?
Wo muss ich den Code hinschreiben?usw usf.
sind nunmal reinste Grundlagen. und dafür solltest du wirklich erstmal nen grundlagen- Buch/Tutorial lesen. Anders wirst du es nicht hinbekommen.
Es ist wie gesagt nicht bös gemeint!
Du wirst aber kaum was auf die Reihe bekommen, wenn du nicht die Grundlagen verstehst.
OOP, Codestruktur, IDE - Umgang,.....
Das ist schon wichtig!
Zu deiner Frage: Ich verwende VS 2003.
[Edit:] Den Beispielcode kannst du zum beispiel ins Load - Event hinkopieren. Dann Zeichnet er die Linie beim Laden des Fensters.
-
Micha369 schrieb:
Ich will ja auch nur für den Hausgebrauch programmieren, da muß ich nicht unbedingt verstehen, was
"Delegate" ist, denke ich mal.*lol* Delegates sind eigentlich nen sehr wichtiges Konzept in .Net, wie willst du sonst verstehen was Events sind? Und die brauchst du wohl für Windows Forms Anwendungen.
-
Lyrix schrieb:
[Edit:] Den Beispielcode kannst du zum beispiel ins Load - Event hinkopieren. Dann Zeichnet er die Linie beim Laden des Fensters.
Es gibt in meiner Windows-Applikation kein Load - Event.
Also ich habe lediglich ein neues Windows-Projekt geöffnet und habe dann den von der IDE erzeugten Code im Einzelschrittmodus verfolgt.Erstaunlich und absolut unverständlich ist, welcher Zauberer in der 3. code-Zeile das Form1 auf den Bildschirm bringt.
using System; using System.Collections.Generic; using System.Windows.Forms; namespace Linie { static class Program { /// <summary> /// Der Haupteinstiegspunkt für die Anwendung. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } }
Ich hätte erwartet, dass da innerhalb der Methode Run eine Methode "Form1.Show" oder ähnliches kommen muß.
Dann, innerhalb der Methode Application.Run werden vom Programm Sprünge vollzogen, die mir schier schleierhaft sind!
Zuerst geht's in die Klasse Form1, ok, das ist halt das Argument in der Methode
Application.Run(new Form1())
Dort arbeitet das Programm eine einzige Zeile ab, zu der es auch keine Hilfe gibt, nämlich:private System.ComponentModel.IContainer components = null;
Was das sein soll? keine Ahnung, aber warum es dann danach sofort zur abgeleiteten Klasse Form1 geht, das kann ein gelernter Prozeduren - Hobbyprogrammierer kaum nachvollziehen, da in der o.a. Zeile überhaupt nichts von Form1 geschrieben steht!
namespace Linie { public partial class Form1 : Form { public Form1() { InitializeComponent(); } } }
Na, gut, ich lass mich nicht beirren, ich werde noch weiter studieren.
Aber wie gesagt, wo man diese Zeilen hinkopieren könnte, damit man mal diese Linie in das Formular gemalt kriegt, weiss ich immer noch nicht. *stöhn!
Habt Ihr noch einen anderen Tipp als das Form - Load Event, was ich nicht entdecken kann?
Evtl. in die Ereignisprozedur, sorry Prozeduren gibt es hier ja nicht mehr, also Ereignis-Methode "Button1_klick"?
-
Micha369 schrieb:
Es gibt in meiner Windows-Applikation kein Load - Event.
Deine Form bietet ein solches Event an. Dieses Event wird sinnigerweise ausgeführt, wenn die Form geladen wird. Du kannst auf dieses Ereignis reagieren, indem du einen Eventhandler an dem Load-Event anmeldest:
myForm.Load += MyEventHandler;
Auch der GUI-Designer kann das für dich machen. Mehr zum Thema Events gibt's hier: http://msdn2.microsoft.com/en-us/library/awbftdfh.aspx
Erstaunlich und absolut unverständlich ist, welcher Zauberer in der 3. code-Zeile das Form1 auf den Bildschirm bringt.
[...]
Ich hätte erwartet, dass da innerhalb der Methode Run eine Methode "Form1.Show" oder ähnliches kommen muß.Jo, kommt auch da drin.
Dann, innerhalb der Methode Application.Run werden vom Programm Sprünge vollzogen, die mir schier schleierhaft sind!
Zuerst geht's in die Klasse Form1, ok, das ist halt das Argument in der Methode
Application.Run(new Form1())
Dort arbeitet das Programm eine einzige Zeile ab, zu der es auch keine Hilfe gibt, nämlich:private System.ComponentModel.IContainer components = null;
Was das sein soll? keine Ahnung, aber warum es dann danach sofort zur abgeleiteten Klasse Form1 geht, das kann ein gelernter Prozeduren - Hobbyprogrammierer kaum nachvollziehen, da in der o.a. Zeile überhaupt nichts von Form1 geschrieben steht!
Ja, da tun sich jetzt deine ganzen Lücken auf (nicht böse gemeint!). Die Methoden, in die er nach Run() reingeht, sind Callback-Methoden. Das sind Methoden, die als Event-Handler bei den verschiedenen Events angemeldet sind, beispielsweise Load, Click, ...
Entscheidend ist die Erkenntnis, dass der Programmablauf bis das Form geschlossen wird, in Run() bleibt. In Run() schläft das Programm, frisst keine Prozessor-Zeit und wartet nur auf Events.
Aber wie gesagt, wo man diese Zeilen hinkopieren könnte, damit man mal diese Linie in das Formular gemalt kriegt, weiss ich immer noch nicht. *stöhn!
Habt Ihr noch einen anderen Tipp als das Form - Load Event, was ich nicht entdecken kann?
Ja, sieh dir Events an. Der Link von mir müsste alles notwendige liefern. Den Code zum Zeichnen musst du als Reaktion auf das Paint-Event ausführen. Damit ist sichergestellt, dass wenn immer irgendwas vom Fenster neu gezeichnet werden muss, auch deine Linie neu gezeichnet wird.
-
Hallo Optimizer,
danke erst mal für Deine Hilfe!
Nun mal eine Frage zum += Operator (siehe Listing):Ich habe gelernt, dass x += y identisch ist mit x = x + y.
Also habe ich, weil mir diese Schreibweise noch nicht so geläufig ist, die Zeile im Listing umgeschrieben zupictureBox1.Paint = pictureBox1.Paint + new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
Das ging aber nicht! Fehlermeldung:
Das Ereignis "System.Windows.Forms.Control.Paint" kann nur links von += oder -= verwendet werden.
Ich habe nun Probleme. diese Zeile zu verstehen.
private void button1_Click(object sender, EventArgs e) { // http://msdn2.microsoft.com/de-de/library/f956fzw1(VS.80).aspx // Dock the PictureBox to the form and set its background to white. pictureBox1.Dock = DockStyle.Fill; pictureBox1.BackColor = Color.White; // Connect the Paint event of the PictureBox to the event handler method. pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint); // Add the PictureBox control to the Form. this.Controls.Add(pictureBox1);
Ist das richtig, wenn ich die Zeile mit dem "+=" folgendermaßen lese:
"Die Methode pictureBox1.Paint soll ausgeführt werden, wenn das Ereignis auftritt, "Führe die Methode pictureBox1_Paint aus!"Bei den englischsprachigen Beispielen kommt für das Verständnis noch erschwerend hinzu, dass man nicht so recht erkennt, was jetzt vom Programmierer gewählte Namen sind und was C# Schlüsselwörter sind.
Für Neulinge wie mich sind deutschsprachige Beispiele besser zu verstehen!Iich versuche, Deinen Link
http://msdn2.microsoft.com/en-us/library/ms173168(VS.80).aspx
zu verstehen, ist aber ziemlich schwer.Gibt es evtl. auch was deutschsprachiges im Netz?
Stopp mal, hier ist etwas:
http://www.zdnet.de/builder/program/0,39023551,20000858,00.htm
Muß ich mir gleich mal ansehen!
Bis dann!
Gruß,
Micha
-
Wie du richtig vermutest, hat += in diesem Fall nichts mit ... = ... + ... zu tun sondern dient nur dazu, einen Eventhandler hinzuzufügen. Lesen kann man es allerdings trotzdem als "Die neue Liste aller Eventhandler ist die alte Liste plus diesen zusätzlichen neuen Eventhandler".
Man kann viele Handler bei ein- und demselben Event anmelden. Es gibt auch das Gegenstück -=, mit man sich wieder abmelden kann.