Brauche hilfe!! Grafik



  • Hallo Leute

    Erst mal keine Ahnung ob nun hier oder doch in C++/cli .Net.

    Habe da ein Problem mit einem eingebautem Panel und dem Timer.

    Ich habe ein Programm in dem ich einen Strich, ein Rechteck und eine Kreis in das Panel zeichne. Das funktioniert soweit, doch mit dem Timer stehe ich auf Kriegsfuß.

    Ich möchte erreichen, dass in der tickFunktion die Figuren sich die Figuren Kreis und Rechteck von innen nach außen und der Strich von der Mitte nach Oben und Unten bewegen. (Animation). Der Timer soll erst bei der Auswahl 2Fach oder 4Fach aktiv werden.

    Hier mein Code:

    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 
    		 {
    			 zeichenflaeche = panel1 -> CreateGraphics();
    		 }
    

    Der Startbutton

    private: System::Void buttonStart_Click(System::Object^  sender, System::EventArgs^  e) 
    		 {
    			 Pen ^stift = gcnew Pen(Color::Black);
    
    			 /*panel1.Width = 100;
    			 panel1.Height =100;*/
    
    			 if(radioButtonLinie -> Checked == true)
    			 {
    				 zeichenflaeche -> DrawLine(stift, 100,150,200,150);
    			 }
    
    			 if(radioButtonRechteck -> Checked == true)
    			 {
    				 zeichenflaeche -> DrawRectangle(stift, 100,100,100,100);
    			 }
    
    			 if(radioButtonKreis -> Checked == true)
    			 {
    				 zeichenflaeche -> DrawEllipse(stift, 100,100,100,100);
    			 }
    
    		 }
    

    Diese Zeichnung funktioniert.

    Jetzt mit dem Timer

    private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) 
    		 {			
    			 Pen ^stift = gcnew Pen(Color::Black);
    
    			 if(radioButtonOhne -> Checked == true)
    			 {
    
    			 }
    
    			 if(radioButtonRechteck -> Checked == true && radioButton2Fach -> Checked == true)
    			 {				 
    				  zeichenflaeche -> DrawRectangle(stift, 100,100,100,100);
    
    				  for(Int32 i = 0; i < 22; i++)
    				  {
    					  zeichenflaeche.Location = Point(zeichenflaeche.Location.X - 5, zeichenflaeche.Location.Y - 5);
    
    					  zeichenflaeche -> DrawRectangle(stift,100,100,100,100);
    				  }
    			 }
    

    Ist zwar noch nicht ganz vollständig, aber ich denke um zu üben reicht es wenn er zu mindest das Rechteck bewegt.

    protected:
    /// <summary>
    /// Verwendete Ressourcen bereinigen.
    /// </summary>
    ~Form1()
    {
    if (components)
    {
    delete components;
    }
    }

    private:

    Graphics ^zeichenflaeche;

    private: System::Windows::Forms::Panel^ panel1;........
    ...

    Nach dem Compilieren mit ausführen erhalte ich diese Fehlermeldung:

    1>------ Erstellen gestartet: Projekt: test4, Konfiguration: Debug Win32 ------
    1> test4.cpp
    1>c:\users\lehwald\desktop\c++_cli\cpbs 13c\hausaufgabe\test4\test4\test4\Form1.h(275): error C2228: Links von ".Location" muss sich eine Klasse/Struktur/Union befinden.
    1> Typ ist 'System::Drawing::Graphics ^'
    1> Wollten Sie stattdessen '->' verwenden?
    1>c:\users\lehwald\desktop\c++_cli\cpbs 13c\hausaufgabe\test4\test4\test4\Form1.h(275): error C2228: Links von ".Location" muss sich eine Klasse/Struktur/Union befinden.
    1> Typ ist 'System::Drawing::Graphics ^'
    1> Wollten Sie stattdessen '->' verwenden?
    1>c:\users\lehwald\desktop\c++_cli\cpbs 13c\hausaufgabe\test4\test4\test4\Form1.h(275): error C2228: Links von ".X" muss sich eine Klasse/Struktur/Union befinden.
    1>c:\users\lehwald\desktop\c++_cli\cpbs 13c\hausaufgabe\test4\test4\test4\Form1.h(275): error C2228: Links von ".Location" muss sich eine Klasse/Struktur/Union befinden.
    1> Typ ist 'System::Drawing::Graphics ^'
    1> Wollten Sie stattdessen '->' verwenden?
    1>c:\users\lehwald\desktop\c++_cli\cpbs 13c\hausaufgabe\test4\test4\test4\Form1.h(275): error C2228: Links von ".Y" muss sich eine Klasse/Struktur/Union befinden.
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Schreibe ich die Tickfunktion so:

    private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) 
    		 {			
    			 Pen ^stift = gcnew Pen(Color::Black);
    
    			 if(radioButtonOhne -> Checked == true)
    			 {
    
    			 }
    
    			 if(radioButtonRechteck -> Checked == true && radioButton2Fach -> Checked == true)
    			 {				 
    				  zeichenflaeche -> DrawRectangle(stift, 100,100,100,100);
    
    				  for(Int32 i = 0; i < 22; i++)
    				  {
    					  panel1 -> Location = Point(panel1 -> Location.X - 5, panel1 ->Location.Y - 5);
    
    					  zeichenflaeche -> DrawRectangle(stift,panel1);
    				  }
    			 }
    		 }
    

    Erhalte ich folgende Fehlermeldung

    1>------ Erstellen gestartet: Projekt: test4, Konfiguration: Debug Win32 ------
    1> test4.cpp
    1>c:\users\lehwald\desktop\c++_cli\cpbs 13c\hausaufgabe\test4\test4\test4\Form1.h(277): error C2664: 'void System::Drawing::Graphics::DrawRectangle(System::Drawing::Pen ^,System::Drawing::Rectangle)': Konvertierung des Parameters 2 von 'System::Windows::Forms::Panel ^' in 'System::Drawing::Rectangle' nicht möglich
    1> Es ist kein benutzerdefinierter Konvertierungsoperator verfügbar, oder
    1> Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Das Panel wurde aus der Toolbox eingefügt. Wie kann ich dieses Panel auch im Timer richtig ansprechen?

    Leiben Dank für Eure Hilfe

    champman



  • Der Compiler sagt doch schon fast das richtige. Du schreibst was von zeichenflaeche.Location, aber er weiß nicht was zeichenflaeche ist und hat demzufolge keinen Plan was er bei zeichenflaeche.Location tun soll. Irgendwo steht bestimmt was zeichenflaeche ist, wahrscheinlich in einem Header den du includen kannst. (Wenn das bei .Net auch so geht, vielleicht schreiben die ja ^include$ %Datei& oder so)
    Oder sag es ihm per extern [TypVonZeichenflaeche] zeichenflaeche;.



  • Hey

    werde mich mal auf die Suche machen und dann berichten. Mal schauen wie ich im das mitteilen kann.

    Gruß

    champman



  • Nicht "zeichenflaeche" ist das Problem (denn sonst würde der Fehler bei den anderen Zeilen ja auch kommen), sondern

    Wollten Sie stattdessen '->' verwenden?



  • Hey Th69

    Auf den Gedanken bin ich auch gekommen und habe den Punkt durch Pfeil ersetzt. Leider ohne Erfolg. Das heißt, da ist mir doch gerade ein Gedanke gekommen. Mal sehen ob funktioniert.

    Gruß

    champman

    Nee, funkt. auch nicht. Was ist den jetzt die Klasse von "Location". Scheine ich irgendwie nicht zu verstehen.



  • ...



  • Hey Swordfish

    Hier der ganze Code:

    #pragma once
    
    namespace test4 {
    
    	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>
    	/// Zusammenfassung für Form1
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    
    	private:
    
    	Graphics ^zeichenflaeche;
    
    	private: System::Windows::Forms::Panel^  panel1;
    	protected: 
    	private: System::Windows::Forms::GroupBox^  groupBox1;
    	private: System::Windows::Forms::RadioButton^  radioButtonKreis;
    	private: System::Windows::Forms::RadioButton^  radioButtonRechteck;
    	private: System::Windows::Forms::RadioButton^  radioButtonLinie;
    	private: System::Windows::Forms::GroupBox^  groupBox2;
    	private: System::Windows::Forms::RadioButton^  radioButton4Fach;
    	private: System::Windows::Forms::RadioButton^  radioButton2Fach;
    	private: System::Windows::Forms::RadioButton^  radioButtonOhne;
    	private: System::Windows::Forms::Button^  buttonStart;
    	private: System::Windows::Forms::Button^  buttonBeenden;
    	private: System::Windows::Forms::Timer^  timer1;
    	private: System::ComponentModel::IContainer^  components;
    
    	private:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Erforderliche Methode für die Designerunterstützung.
    		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			this->components = (gcnew System::ComponentModel::Container());
    			this->panel1 = (gcnew System::Windows::Forms::Panel());
    			this->groupBox1 = (gcnew System::Windows::Forms::GroupBox());
    			this->radioButtonKreis = (gcnew System::Windows::Forms::RadioButton());
    			this->radioButtonRechteck = (gcnew System::Windows::Forms::RadioButton());
    			this->radioButtonLinie = (gcnew System::Windows::Forms::RadioButton());
    			this->groupBox2 = (gcnew System::Windows::Forms::GroupBox());
    			this->radioButton4Fach = (gcnew System::Windows::Forms::RadioButton());
    			this->radioButton2Fach = (gcnew System::Windows::Forms::RadioButton());
    			this->radioButtonOhne = (gcnew System::Windows::Forms::RadioButton());
    			this->buttonStart = (gcnew System::Windows::Forms::Button());
    			this->buttonBeenden = (gcnew System::Windows::Forms::Button());
    			this->timer1 = (gcnew System::Windows::Forms::Timer(this->components));
    			this->groupBox1->SuspendLayout();
    			this->groupBox2->SuspendLayout();
    			this->SuspendLayout();
    			// 
    			// panel1
    			// 
    			this->panel1->BackColor = System::Drawing::Color::White;
    			this->panel1->Location = System::Drawing::Point(12, 12);
    			this->panel1->Name = L"panel1";
    			this->panel1->Size = System::Drawing::Size(300, 300);
    			this->panel1->TabIndex = 0;
    			// 
    			// groupBox1
    			// 
    			this->groupBox1->Controls->Add(this->radioButtonKreis);
    			this->groupBox1->Controls->Add(this->radioButtonRechteck);
    			this->groupBox1->Controls->Add(this->radioButtonLinie);
    			this->groupBox1->Location = System::Drawing::Point(344, 12);
    			this->groupBox1->Name = L"groupBox1";
    			this->groupBox1->Size = System::Drawing::Size(200, 100);
    			this->groupBox1->TabIndex = 1;
    			this->groupBox1->TabStop = false;
    			this->groupBox1->Text = L"Figuren";
    			// 
    			// radioButtonKreis
    			// 
    			this->radioButtonKreis->AutoSize = true;
    			this->radioButtonKreis->Location = System::Drawing::Point(6, 71);
    			this->radioButtonKreis->Name = L"radioButtonKreis";
    			this->radioButtonKreis->Size = System::Drawing::Size(48, 17);
    			this->radioButtonKreis->TabIndex = 2;
    			this->radioButtonKreis->Text = L"Kreis";
    			this->radioButtonKreis->UseVisualStyleBackColor = true;
    			// 
    			// radioButtonRechteck
    			// 
    			this->radioButtonRechteck->AutoSize = true;
    			this->radioButtonRechteck->Location = System::Drawing::Point(6, 48);
    			this->radioButtonRechteck->Name = L"radioButtonRechteck";
    			this->radioButtonRechteck->Size = System::Drawing::Size(72, 17);
    			this->radioButtonRechteck->TabIndex = 1;
    			this->radioButtonRechteck->Text = L"Rechteck";
    			this->radioButtonRechteck->UseVisualStyleBackColor = true;
    			// 
    			// radioButtonLinie
    			// 
    			this->radioButtonLinie->AutoSize = true;
    			this->radioButtonLinie->Checked = true;
    			this->radioButtonLinie->Location = System::Drawing::Point(6, 25);
    			this->radioButtonLinie->Name = L"radioButtonLinie";
    			this->radioButtonLinie->Size = System::Drawing::Size(47, 17);
    			this->radioButtonLinie->TabIndex = 0;
    			this->radioButtonLinie->TabStop = true;
    			this->radioButtonLinie->Text = L"Linie";
    			this->radioButtonLinie->UseVisualStyleBackColor = true;
    			// 
    			// groupBox2
    			// 
    			this->groupBox2->Controls->Add(this->radioButton4Fach);
    			this->groupBox2->Controls->Add(this->radioButton2Fach);
    			this->groupBox2->Controls->Add(this->radioButtonOhne);
    			this->groupBox2->Location = System::Drawing::Point(344, 142);
    			this->groupBox2->Name = L"groupBox2";
    			this->groupBox2->Size = System::Drawing::Size(200, 100);
    			this->groupBox2->TabIndex = 2;
    			this->groupBox2->TabStop = false;
    			this->groupBox2->Text = L"Animation";
    			// 
    			// radioButton4Fach
    			// 
    			this->radioButton4Fach->AutoSize = true;
    			this->radioButton4Fach->Location = System::Drawing::Point(6, 74);
    			this->radioButton4Fach->Name = L"radioButton4Fach";
    			this->radioButton4Fach->Size = System::Drawing::Size(58, 17);
    			this->radioButton4Fach->TabIndex = 2;
    			this->radioButton4Fach->TabStop = true;
    			this->radioButton4Fach->Text = L"4 Fach";
    			this->radioButton4Fach->UseVisualStyleBackColor = true;
    			// 
    			// radioButton2Fach
    			// 
    			this->radioButton2Fach->AutoSize = true;
    			this->radioButton2Fach->Location = System::Drawing::Point(6, 51);
    			this->radioButton2Fach->Name = L"radioButton2Fach";
    			this->radioButton2Fach->Size = System::Drawing::Size(58, 17);
    			this->radioButton2Fach->TabIndex = 1;
    			this->radioButton2Fach->TabStop = true;
    			this->radioButton2Fach->Text = L"2 Fach";
    			this->radioButton2Fach->UseVisualStyleBackColor = true;
    			// 
    			// radioButtonOhne
    			// 
    			this->radioButtonOhne->AutoSize = true;
    			this->radioButtonOhne->Location = System::Drawing::Point(6, 28);
    			this->radioButtonOhne->Name = L"radioButtonOhne";
    			this->radioButtonOhne->Size = System::Drawing::Size(51, 17);
    			this->radioButtonOhne->TabIndex = 0;
    			this->radioButtonOhne->TabStop = true;
    			this->radioButtonOhne->Text = L"Ohne";
    			this->radioButtonOhne->UseVisualStyleBackColor = true;
    			// 
    			// buttonStart
    			// 
    			this->buttonStart->Location = System::Drawing::Point(360, 353);
    			this->buttonStart->Name = L"buttonStart";
    			this->buttonStart->Size = System::Drawing::Size(75, 23);
    			this->buttonStart->TabIndex = 3;
    			this->buttonStart->Text = L"Start";
    			this->buttonStart->UseVisualStyleBackColor = true;
    			this->buttonStart->Click += gcnew System::EventHandler(this, &Form1::buttonStart_Click);
    			// 
    			// buttonBeenden
    			// 
    			this->buttonBeenden->Location = System::Drawing::Point(488, 353);
    			this->buttonBeenden->Name = L"buttonBeenden";
    			this->buttonBeenden->Size = System::Drawing::Size(75, 23);
    			this->buttonBeenden->TabIndex = 4;
    			this->buttonBeenden->Text = L"Beenden";
    			this->buttonBeenden->UseVisualStyleBackColor = true;
    			this->buttonBeenden->Click += gcnew System::EventHandler(this, &Form1::buttonBeenden_Click);
    			// 
    			// timer1
    			// 
    			this->timer1->Tick += gcnew System::EventHandler(this, &Form1::timer1_Tick);
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(584, 382);
    			this->Controls->Add(this->buttonBeenden);
    			this->Controls->Add(this->buttonStart);
    			this->Controls->Add(this->groupBox2);
    			this->Controls->Add(this->groupBox1);
    			this->Controls->Add(this->panel1);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
    			this->groupBox1->ResumeLayout(false);
    			this->groupBox1->PerformLayout();
    			this->groupBox2->ResumeLayout(false);
    			this->groupBox2->PerformLayout();
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    	private: System::Void buttonBeenden_Click(System::Object^  sender, System::EventArgs^  e) 
    			 {
    				 Close();
    			 }
    private: System::Void buttonStart_Click(System::Object^  sender, System::EventArgs^  e) 
    		 {
    			 Pen ^stift = gcnew Pen(Color::Black);
    
    			 /*panel1.Width = 100;
    			 panel1.Height =100;*/
    
    			 if(radioButtonLinie -> Checked == true)
    			 {
    				 zeichenflaeche -> DrawLine(stift, 100,150,200,150);
    			 }
    
    			 if(radioButtonRechteck -> Checked == true)
    			 {
    				 zeichenflaeche -> DrawRectangle(stift, 100,100,100,100);
    			 }
    
    			 if(radioButtonKreis -> Checked == true)
    			 {
    				 zeichenflaeche -> DrawEllipse(stift, 100,100,100,100);
    			 }
    
    		 }
    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 
    		 {
    			 zeichenflaeche = panel1 -> CreateGraphics();
    		 }
    private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) 
    		 {		
    			 /*Graphics ^zeichenflaeche;
    
    			 zeichenflaeche = panel1 -> CreateGraphics();*/
    
    			 Pen ^stift = gcnew Pen(Color::Black);
    
    			 if(radioButtonOhne -> Checked == true)
    			 {
    
    			 }
    
    			 if(radioButtonRechteck -> Checked == true && radioButton2Fach -> Checked == true)
    			 {				 
    
    				  for(Int32 i = 0; i < 22; i++)
    				  {
    					  zeichenflaeche -> DrawRectangle(stift, 100,100,100,100);
    
    					  panel1.Location = Point(panel1.Location.X - 5, panel1.Location.Y - 5);
    
    					  zeichenflaeche -> DrawRectangle(stift,paenl1);
    				  }
    			 }
    		 }
    };
    }
    

    Ist mein erster Gehversuch mit Grafik in C++/CLI. (Trotz dem Bekannten lieber C# dafür zu nehmen)

    Dank und Gruß

    champman



  • ...



  • Hallo Swordfish

    Ist zwar noch nicht ganz nach meiner Vorstellung, aber es lässt sich schon mal compilieren.

    Warum C++/CLI? Nun ich mache einen Fernlehrgang mit diesem Programm und habe den Unterschied erst später bemerkt. Jetzt einfach durch und dann weiter sehen.

    Diese Übung bereitet mich auf die Einsendeaufgabe vor, die ein wenig komplexer gestaltet ist als meine kleine Übung. Wie soll ich die Aufgabe lösen, wenn ich noch nicht mal einfache Dinge in diesem Thema beherrsche.

    Meine Fragen zu Deiner Lösung warum this in dieser Anweisung?

    panel1->Location = Point( this->panel1->Location.X - 5, panel1->Location.Y - 5);

    und warum this -> panel1 -> DisplayRectangle?

    zeichenflaeche->DrawRectangle( stift, this->panel1->DisplayRectangle );

    Werde versuchen in den mir zur Verfügung stehenden Heften und Büchern etwas zu finden, aber die sind mit diesem recht dürftig bestückt. Darum wäre es nett, wenn Du mir das etwas anschaulicher erklären würdest.

    Lieben Dank

    champman



  • ...



  • So ein Quatsch war er denn nun doch nicht, denn dadurch hat sich das Programm ja wenigstens ohne zu mucken compilieren lassen.

    Gruß

    champman



  • ...



  • Davor hat er nur die Fehlermeldungen rausgeschmissen. Also nach Deiner Bemühung zumindest läuft das Compilieren ohne Meckern. Werde also in der Richtung weiter ansetzen müssen.

    Gruß

    champman



  • ...


Anmelden zum Antworten