DrawLine() im Konstruktor
-
Hallo,
in dem folgenden Beispiel erzeuge ich im Konstruktor von Form1 ein Graphics-Objekt zu einem Panel (Zeile 25,33), und zeichne dann eine gelbe Linie in das Panel (Zeile 34).
Weiter unten in button1_Click zeichne ich eine rote Linie in das gleiche Panel (Zeile 100). Wenn ich auf Button1 klicke, wird die rote Linie wie erwartet gezeichnet. Aber die gelbe Linie wird nie gezeichnet. Warum geht das nicht?Gruss Michael
#pragma once namespace test_7_7_2010 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Summary for Form1 /// /// WARNING: If you change the name of this class, you will need to change the /// 'Resource File Name' property for the managed resource compiler tool /// associated with all .resx files this class depends on. Otherwise, /// the designers will not be able to interact properly with localized /// resources associated with this form. /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Graphics^ g; Form1(void) { InitializeComponent(); // //TODO: Add the constructor code here // g = panel1->CreateGraphics(); g->DrawLine(gcnew Pen(Color::Yellow),0,0,50,50); } protected: /// <summary> /// Clean up any resources being used. /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::Panel^ panel1; protected: private: System::Windows::Forms::Button^ button1; private: /// <summary> /// Required designer variable. /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> void InitializeComponent(void) { this->panel1 = (gcnew System::Windows::Forms::Panel()); this->button1 = (gcnew System::Windows::Forms::Button()); this->SuspendLayout(); // // panel1 // this->panel1->Location = System::Drawing::Point(72, 32); this->panel1->Name = L"panel1"; this->panel1->Size = System::Drawing::Size(352, 184); this->panel1->TabIndex = 0; // // button1 // this->button1->Location = System::Drawing::Point(80, 248); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(104, 56); this->button1->TabIndex = 1; this->button1->Text = L"button1"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(486, 338); this->Controls->Add(this->button1); this->Controls->Add(this->panel1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); } #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { g->DrawLine(gcnew Pen(Color::Red),50,50,100,100); } }; }
-
Hi,
was passiert denn, wenn du das Fenster mit der roten Linie verschiebst oder vergrösserst?
Ich denke, dann ist die rote Linie auch weg oder?
Du musst sowas in der dafür vorgesehenen Funktion (onPaint, onDraw oder sowas ähnliches) zeichnen, sonst wird das wieder übermalt.
Für genauere Informationen solltest du im richtigen Froum nachfragen.
-
micha7 schrieb:
Warum geht das nicht?
Ganz einfach...
weil DrawLine() nicht Bestandteil der Standard Library ist...

-
hallo,
Jockelx schrieb:
was passiert denn, wenn du das Fenster mit der roten Linie verschiebst
Dann bleibt die rote Linie sichtbar.
Jockelx schrieb:
oder vergrösserst?
Dann bleibt sie ebenfalls sichtbar. Wenn man das Fenster verkleinert und dann wieder vergrössert, dann wäre die Linie weg. Aber das stört mich im Moment nicht. Die Frage ist: Warum wird die gelbe Linie gar nicht erst gezeichnet?
Oder anders gefragt: Wie kann ich eine Linie zeichnen, die nach dem Programmstart sofort sichtbar sein soll?Gruss
Michael
-
Hallo,
CSpille schrieb:
micha7 schrieb:
Warum geht das nicht?
Ganz einfach...
weil DrawLine() nicht Bestandteil der Standard Library ist...

Verstehe ich noch nicht. Wieso funktioniert es dann in Zeile 100?
Gruss
Michael
-
Wie gesagt: Die gelbe Linie wird gezeichnet, aber wieder übergezeichnet (so wie die Rote, bei einem Repaint-Event).
Du musst die Paint-Funktion dafür überschreiben oder das Paint-Event abfangen.
-
micha7 schrieb:
Hallo,
CSpille schrieb:
micha7 schrieb:
Warum geht das nicht?
Ganz einfach...
weil DrawLine() nicht Bestandteil der Standard Library ist...

Verstehe ich noch nicht. Wieso funktioniert es dann in Zeile 100?
Gruss
MichaelNein... Funktioniert es nicht...
Mein (nahezu Standard-konformer) Compiler kennt keine der Klassen, die du
verwendest...
-
Zunächst bist du im falschen Unterforum gelandet. Das ist kein C++ sondern C++/CLI. Dafür gibts ein spezielles Unterforum.
Ansonsten kann ich mir vorstellen, dass die Linie zwar gezeichnet wird, aber gleich wieder übermalt wird. Gibt es eine Funktion, die aufgerufen wird, wenn die Form fertig geladen ist bzw. angezeigt wird? Also etwas wie Form_Show oder Form_Load?
Dann solltest du versuchen deinen Code zum Zeichnen dort hineinzupacken.
Sollte das alles nicht zum Erfolg führen, dann zeichne die Linie in der Paint-Funktion.
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);// Dein Code
}In dem Fall müsste die Linie in jedem Fall angezeigt werden. Außerdem dürfte sie nach dem Verkleinern des Fensters nicht verschwunden sein.
-
uuuuuuuuu schrieb:
Zunächst bist du im falschen Unterforum gelandet. Das ist kein C++ sondern C++/CLI. Dafür gibts ein spezielles Unterforum.

deswegen:
CSpille schrieb:
weil DrawLine() nicht Bestandteil der Standard Library ist...

-
Hallo,
uuuuuuuuu schrieb:
Zunächst bist du im falschen Unterforum gelandet. Das ist kein C++ sondern C++/CLI. Dafür gibts ein spezielles Unterforum.
Sorry, das war mein Fehler. Ich habe es aus Versehen ins falsche Unterforum geschrieben.
Gruss
Michael
-
Deshalb hab ich dir im ersten Post sofort geschrieben, dass du im richtigen Forum nachfragen sollst.
Die Gefahr, dass sonst einer einen hochroten Kopf und ggf. einen Herzinfakt bekommt, ist hier sonst sehr gross