[VB.net/C#] In Picturebox malen ähnlich wie bei Paint

Hallo Spyke,

weisst du auch noch wie man die Deckkraft/Durchsichtikeit der Line verändern kann?

Danke schonmal für deine Bemühungen.
 
Hallo duke007,

Die Transparenz kannst du einstellen indem du den Alpha-wert änderst.

Code:
Color.FromArgb(128,0,255,0)

Der erste Wert ist der Alpha-Wert, dann kommt der rotanteil, dann grün, dann blau.

Mein Beispiel würd jetzt ein halbtransparentes grün ergeben.

mfg xela123
 
Hi!
Ich als Anfänger wollt bloß mal fragen (da ich grad ein Koordinatensystem zeichnen muss, und den Inhalt ständig als BMP speichern, damit er nicht verloren geht), wie es eigentlich funktioniert, dass die Variablen list und bmp, die ja nicht (zumindest das bmp) als globale Variablen deklariert werden können, eigentlich z.B. im MouseDown - Ereignis verfügbar sind?
Ich tipp einfach mal, dass es was mit this. zum tun hat - aber wie schaut des dann in VB aus?

Edit:
Vielleicht sollt ich noch hinzufügen, dass die Height und Width Eigenschaft eines Bitmaps schreibgeschützt ist.
 
Zuletzt bearbeitet:
Wie du schon sagst sie sind global, aber halt global innerhalb ihrer eigenen Objektinstanz.

this ist dabei der Zeiger auf das eigene Objekt.
Kann man eigentlich auch weglassen und steht nur der Lesbarkeit halber da.

zu VB:
zumindest kann ich sagen das es in VB 6 dafür me gab und glaube in VB.Net auch so sein müsste. me sollte man genauso wie this weglassen können

also entweder
Code:
me.list.Add
oder nur
Code:
list.Add

Edit:
dein Satz war entwas verwirrend, aber nur nochmal zum klarstellen list und bmp sind global
 
Zuletzt bearbeitet:
Hmm, ja, sie müssen ja global sein, wenn man sie aus ner anderen Subroutine auch ansprechen kann.
Beide werden ja hier deklariert:
Code:
public Form1()
        {
            InitializeComponent();

            this.list = new List<Point>(); //Liste für Koordinaten instanziieren
            this.bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = bmp;
        }
Mein Problem ist, dass ich sie innerhalb der Klasse "Form1" dann auch nur in der Sub "Form1_Load" erreichen kann (ich schätze mal, dass in C# das Ereignis Form1_Load wie oben aussieht). Und nicht in anderen Subs wie z.B. "button1_Click".
Um aber eine globale Variable zu bekommen, müsste ich die Deklaration eine Stufe höher hinschreiben, also so:
Code:
public partial class Form1 : Form
    {
            this.list = new List<Point>(); //Liste für Koordinaten instanziieren
            this.bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            
           public Form1()
           {
            ...
Wenn ich es aber so mache, dann hagelt es Fehlermeldungen, weil ich nämlich auf eine Eigenschaft der Picturebox1 zugegriffen hab, obwohl sie noch gar nicht geladen wurde.
Die geschieht erst mit dem Ereignis "Form1_Load".
Also hab ich folgendes probiert (auf C# übertragen):
Code:
public partial class Form1 : Form
    {
            this.list = new List<Point>(); 
            this.bmp = new Bitmap(1,1);    //(1,1), weil (,) nicht funktioniert
            
           public Form1()
           {
                  bmp.width = picturebox1.width;
                  bmp.height = picturebox1.height;
            ...
Das geht aber wiederum nicht, weil die Eigenschaften "Width" und "Height" des Bitmaps "Readonly", also schreibgeschützt sind.
Die Lösung wäre deshalb, innerhalb der Sub "Form1_Load" das Bitmap zu deklarieren, aber es wäre dann außerhalb davon eben nicht mehr erreichbar.
Zu dem "Me": Das stimmt schon, das gibts, es wäre in dem Fall ein Verweis auf die Klasse Form1. Ich hab halt gedacht, das "this" wäre ne Möglichkeit, unter C# in einer Sub eine globale Variable zu deklarieren.

ODER:
Ich liege komplett falsch mit der Annahme, dass
Code:
 public Form1()
           {
           ...
           }
aus C# identisch ist mit
Code:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ...
End Sub
aus VB.
In dem Fall bräuchte ich eine Möglichkeit in VB, erst die Form mit allen Steuerelementen zu laden, und anschließend die Bitmap zu erstellen.

Ich hoffe, dass ich es ned zu blöd erklärt hab ;)
 
prüfe mal ob im Konstruktor die Funktion InitializeComponent(); als erstes aufgerufen wird.
Code:
public Form1()
           {
                 InitializeComponent();
                 ...
Dies ist eine vom Designer generierte Funktion und kümmert sich um das erstellen der Objekte und setzen der eingestellten Eigenschaften im Designer.


Hmm, ja, sie müssen ja global sein, wenn man sie aus ner anderen Subroutine auch ansprechen kann.
Beide werden ja hier deklariert:
Code:
public Form1()
        {
            InitializeComponent();

            this.list = new List<Point>(); //Liste für Koordinaten instanziieren
            this.bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = bmp;
        }
Nein, das was das ist, ist der Konstruktor. Dort wird nur der Speicher für das Bitmap und die Liste angefordert.

Deklariert hab ich die Objekte in meinem ersten Codeausschnitt (siehe Seite 1) unten am ende meiner Klasse:
Code:
        private bool mouseDown; //ob Maustaste gedrückt wird (zur Speicherung der Maus koordinaten)
        private readonly List<Point> list; //Mauskoordinaten
        private readonly Bitmap bmp; //Bitmap zum speichern des gezeichneten
    }



ODER:
Ich liege komplett falsch mit der Annahme, dass
Code:
 public Form1()
           {
           ...
           }
aus C# identisch ist mit
Code:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ...
End Sub
Du liegst falsch. ;)

Code:
 public Form1()
Dies ist der Konstruktor meiner Klasse, dieser ist im allgemeinen da um Speicher für das Objekt anzufordern.
http://de.wikipedia.org/wiki/Konstruktor

Code:
Private Sub Form1_Load
Ist mehr eine Funktion die einem Ereignis zugeordnet wurde welches aufgerufen wird wenn das Objekt das erste mal geladen wird. (Beachten der Konstruktor wurde schon aufgerufen, Speicher wurde schon angefordert)
http://de.wikipedia.org/wiki/Ereignis_(Programmierung)

In dem Fall bräuchte ich eine Möglichkeit in VB, erst die Form mit allen Steuerelementen zu laden, und anschließend die Bitmap zu erstellen.
Starte ein neues VB Projekt als Windows Application. Dann müsstest du dort ein erstes Formular Names Form1 sehen. Schaut dir denn dort generierten Code an ;)
Dann wird dir auffallen das das Form einen Konstruktor hat der die besagte Funktionen InitializeComponent() aufruft.
 
Hey! Vielen Dank!
Wie gesagt, ich bin nochn Anfänger.. ;)
Das mitm Konstruktor hab ich noch gar nicht gewusst; dass man schon vorher Speicher reservieren kann, das is ja Klasse! Das würd einige Probleme erklären, die ich schon früher gehabt hab... ^^
Wenn ich ne neue WinApp erstell, dann kommt immer bloß
Code:
Public Class Form1
End Class
Nix von nem Konstruktor...
Aber ich hab die Lösung gefunden (für Leute, dies auch brauchen):
Man muss es folgendermaßen machen:
Code:
Public Class Form1
    Sub New()
        InitializeComponent()
        'Hier z.B. die Variablen eintragen
    End Sub
End Class

mfg, Tobi
 
Hallo,

ich weiß das dieses Thema schon Länge her ist aber kann mir dennoch einer sagen
wie ich das entstande Bild aus dem Source von spike speicher kann ?

Danke schon mal im voraus
lg beyoNd
 
das Image (Bitmap) Objekt hat eine Methode Save, mit dieser Methode kannst du das Bild als Datei oder in ein Stream speichern.
 

Neue Beiträge

Zurück