Autor Beitrag
Molchi
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 08.11.10 13:45 
Hallo zusammen!

Mal eine blöde Frage:

was mache ich in untem abgedruckten Code (VisualStudio) falsch? Es sollte, so dachte ich es mir, ein 5*5-Pixel großes Rechteck erscheinen, dessen obere linke Ecke an den Koordinaten x=5, y=5 sitzt. Nun habe ich ehrlich gesagt dieses ganze Grafik-Konzept unter C-Sharp niemals wirklich verinnerlicht (bin ein klassischer sequentieller Konsolenprogrammierer). Nur, so in dem Stil wie hier hatte ich es schonmal in einer Windows-forms-Anwendung hinbekommen, einfache geometische Strukturen zu zeichnen. Ein Graphics-Objekt generieren. Einen Pen definieren. Den Pen zum Malen in Graphics aufrufen. Eigentlich habe ich hier genau das selbe getan. Aber irgend eine kleine Dummheit verhindert hier wohl, dass man ein Rechteck sieht.

Wie kann man diesen Code funktionstüchtig bekommen? (Vielleicht raffe ich dann endlich mal, was genau es mit dieser "Graphics"-Geschichte auf sich hat).

Danke und Grüße

Mario

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication11
{
    public partial class Form1 : Form
    {
        Graphics g;
        Pen Stift;

        public Form1()
        {
            
            InitializeComponent();
            
            Stift = new Pen(Color.Black);
            g = this.CreateGraphics();
            g.DrawRectangle(Stift, 5555);
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Mo 08.11.10 13:52 
Ich vermute mal nachdem du dein Rechteck zeichnest wird die Winform nochmal neu gezeichnet. (Event: Paint)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 08.11.10 13:55 
Dein DrawRectangle gehört ein den Paint Event der Form. In den EventArgs des Events befindet sich dann schon ein zu benutzendes Graphics Object.

So wie jetzt wird dein Rectangle 1mal gezeichnet und sofort beim ersten Paint überzeichnet.
Molchi Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 08.11.10 14:00 
Aber welches "Paint" überzeichnet da meine Grafik? Nach "InitializeComponent();" wird doch (außer den Befehlen zum Zeichnen) nichts mehr aufgerufen? Das Fenster steht doch und ist fertig, oder swehe ich das falsch?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 08.11.10 14:31 
a.) Im Constructor nach InitializeComponent ist dein Form erzeugt aber noch lange nicht angezeigt. Das kommt erst beim Show(bzw. ShowDialog).
b.) Und auch wenn das Zeichnen im Konstruktor bis zum anzeigen überleben würde. Wäre es nur kurzfristig vorhanden und beim zum nächsten zeichnen(z.B nach minimieren-maximieren, in älteren Windows Version einfach drüber ziehen eines anderen Fensters etc.) weg.
Molchi Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 08.11.10 14:56 
Okay, vielen Dank.

Auf ähnlichem Wege hatte ich schonmal erfolgreich Grafiken erzeugt, doch irgendwas habe ich da anscheinend doch anders gemacht, denn sonst würde es ja jetzt auch klappen.

Gibt es zum Thema "Paint Event" irgendwo ein hilfreiches Tutorial? Das meiste, was sich hierzu bei den ersten Google-Ergebnissen findet, ist leider nicht sehr intuitiv verständlich für jemanden, der noch nicht viel (um nicht zu sagen: gar nichts) mit eventorientierten Programmierkonzepten zu tun hatte (ich suche vorerst wirklich nur nach einer ganz simplen und praktikablen Lösung, die für rechteckige Objekte anwendbar ist).

Grüße

Mario
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Mo 08.11.10 14:59 
Na du nimmst natürlich das Paint-Event von dem Control/Form auf dem du zeichnen möchtest.

Für diesen Beitrag haben gedankt: Molchi
Molchi Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 08.11.10 15:10 
Achso, jetzt erst sehe ich, dass Visual Studio das "Paint Event" ja gleich mitliefert. Vielen Dank für den Hinweis, ich habe viel zu kompliziert gedacht. Wie es aussieht, klappt es jetzt :-)

Grüße

Mario
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 08.11.10 15:41 
Hallo Molchi,

ein gutes Tutorial gibt es unter [Tutorial] Zeichnen in Windows-Programmen (Paint/OnPaint, PictureBox).

Beachte, daß du im Paint-Ereignis dann "e.Graphics" anstatt CreateGraphics() verwenden mußt!