eigene windows Forms Steuerelemente bauen



  • Hast du meine Änderungen ausprobiert? Tu es bitte, dann siehst du das die Funktion sehr wohl aufgerufen wird. Und wenn du mir nicht glaubst das OnPaint eine Funktion der Form ist, dann schau in die Doku, dort stehts schwarz auf weiß.



  • So das funktioniert jetzt. Danke!



  • Kannst Du bitte mal den Code posten...
    Weil das haut so nicht hin?

    #pragma once
    
    namespace teses {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::Drawing::Drawing2D;
    
    	 public ref class Zeitanzeige : Control 
    	 { 
            virtual void  OnPaint(PaintEventArgs ^e) override
    		{ 
                Rectangle r(0, 0, this->Width, this->Height); 
                LinearGradientBrush^ b = gcnew LinearGradientBrush(r, Color::Blue, Color::White,System::Drawing::Drawing2D::LinearGradientMode::BackwardDiagonal); 
                e.Graphics->FillRectangle(b, r); 
                String^ time = gcnew String(DateTime::Now.ToShortTimeString()); 
                System::Drawing::Font^ f = gcnew System::Drawing::Font(L"Palatino Linotype", 8.25F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0)); 
                SizeF s = e.Graphics->MeasureString(time, f); 
                e.Graphics->DrawString(time, f, Brushes::YellowGreen, 
                PointF(this->Width / 2 - s.Width / 2, 
                this->Height / 2 - s.Height / 2)); 
            } 
        }; 
    
    	/// <summary>
    	/// Zusammenfassung für Form1
    	///
    	/// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
    	///          die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
    	///          das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
    	///          Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
    	///          arbeiten, die diesem Formular zugewiesen sind.
    	/// </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:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
    
    #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->Size = System::Drawing::Size(300,300);
    			this->Text = L"Form1";
    			this->Padding = System::Windows::Forms::Padding(0);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    		}
    #pragma endregion
    	};
    }
    

    Gruß, Doug_HH



  • public ref class Zeitanzeige : Control {
    		protected: virtual void  OnPaint(PaintEventArgs ^e) override {
    			Rectangle r(0, 0, this->Width, this->Height); 
    			LinearGradientBrush^ b = gcnew LinearGradientBrush(r, Color::Blue, Color::White,System::Drawing::Drawing2D::LinearGradientMode::BackwardDiagonal); 
    			e->Graphics->FillRectangle(b, r); 
    			String^ time = gcnew String(DateTime::Now.ToShortTimeString()); 
    			System::Drawing::Font^ f = gcnew System::Drawing::Font(L"Palatino Linotype", 8.25F, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0));
    			SizeF s = e->Graphics->MeasureString(time, f); 
    			e->Graphics->DrawString(time, f, Brushes::YellowGreen, PointF(this->Width / 2 - s.Width / 2, this->Height / 2 - s.Height / 2)); 
    		}
    	};
    

    Das ist der Code für das Steuerelement.
    Zum benutzen ganz einfach ganz normal ein Objekt des Typs erstellen(Ich habs mir einfach vom Designer abgeschaut weil ich Drag&Drop gewöhnt bin 🤡 )



  • Für welches Framework soll dies übersetzt werden ?



  • Das war doch genau was ich gemeint habe...

    this->zeitAnz = (gcnew Zeitanzeige());
    this->zeitAnz->Location = System::Drawing::Point(10,95);
    this->zeitAnz->Size = System::Drawing::Size(75,23);
    this->Controls->Add(this->zeitAnz);
    

    Wenn Du jetzt den Haltepunkt in OnPaint setzt, wird die Funktion auch ausgeführt...

    private: Zeitanzeige^ zeitAnz;
    

    Zuvor wußte die Form nix von Zeitanzeige...

    Hab ich mich falsch ausgedrückt?

    So einfach war die Änderung ja nun doch nicht?

    Aber sieht nett aus die Anzeige.

    Gruß, Doug_HH



  • du meintest das Delegates durch ein Wunder ausgelöst werden 😃



  • majin schrieb:

    du meintest das Delegates durch ein Wunder ausgelöst werden 😃

    Ja genau, dass meinte der Autor wohl 😃



  • Ich hole diesen Thread nochmal nach vorne, denn meine Frage bezieht sich darauf...:

    Dough_HH hatte ja ein Beispiel online gestellt(leider nicht mehr online), indem eine Komponentenklasse genutzt wurde. Ich habe nun versucht, so etwas auch zu nutzen(in diesem Fall ist es wohl sinnvoller als selbstgemalt), aber leider kann ich nicht so schön per Drag&Drop arbeiten, wie dies bei dem Beispiel der Fall war.

    Ich habe eine Komponentenklasse genommen, und aus der Toolbox ein Label darauf gesetzt, jedoch wird es nicht so angezeigt, wie bei einem Form.
    Woran liegt das, das ich das nicht so hinbekommen habe?



  • Was meinst du damit dass es nicht so angezeigt wird wie bei einer Form?



  • Das man den Designer so benutzen kann, wie bei einem normalen Form.

    Sorry für meine unverständliche und umständliche Erklärung 🙄



  • meinst du vielleicht das http://www.c-plusplus.net/forum/viewtopic-var-t-is-216041.html hier angesprochene??



  • Mr X schrieb:

    Das man den Designer so benutzen kann, wie bei einem normalen Form.

    Ja, aber welchen Aspekt meinst du vom Designer? Die Oberfläche wo man Controls hinzufügen kann, oder das Property Window wo die zusätzlichen Eigenschaften stehen sollen, oder was?



  • Die Oberfläche wo man Controls draufziehen kann und verschieben kann.



  • Und was ist da jetzt anders?

    jedoch wird es nicht so angezeigt, wie bei einem Form.

    ist ja keine Beschreibung aus der man was ableiten kann 🙂

    Hast du sowas wie nen UserControl mit von mir aus nem Panel und du willst per Drag'n Drop nen Label dort hinein tun aber es landet immer auf der Form statt in dem User Control. Meinst du vielleicht sowas?



  • Nein,
    Wenn du bei einem Form einen Button hinzufügst, siehst Du den Button, Du kannst ihn verschieben, vergrößern und verkleinern.
    Wenn man aber z.B. einen Timer, also ein nicht sichtbares Control hinzufügt, sieht man nur einen Kasten mit dem Namen des Timers. Man kann den Timer (natürlich) nicht vergrößern und verschieben des Timers ist auch nicht sinnvoll, da er nicht sichbar ist. Der ganze Timer wird ja ohnehin unterhalb des Forms angezeigt, in einem extra Feld.

    Mein Problem ist:
    Bei meiner Komponentenklasse werden auch Buttons, Labels etc. wie bei Forms die Timer behandelt, da von vornherein kein Feld da ist, indem man z.B. den Button verschieben könnte. In Doug_HHs Beispiel war aber genau das anders.


Anmelden zum Antworten