Eigene Label-Klasse - OnPaint überschreiben



  • Hallo,
    ich versuche für eine WinForms-Anwendung eine eigene Label-Klasse zu implementieren um das Layout der Labels anpassen zu können.
    Der Header der Klasse sieht wie folgt aus:

    #pragma once
    using namespace System::Drawing ;
    
    public ref class UserLabel : public System::Windows::Forms::Label
    
    {
    private:
    	Color ColorFrom;
    	Color ColorTo;
    
    public:
    	int BorderSize;
        Color BorderColor;
    
    	UserLabel(void);
    	void SetColor(Color FromColor, Color ToColor);
    
    protected:
    	virtual void OnPaint(System::Windows::Forms::PaintEventArgs e);  
    };
    

    Die Methoden:

    #include "StdAfx.h"
    #include "UserLabel.h"
    using namespace System::Drawing ;
    
    UserLabel::UserLabel(void)
    {
    }
    
    void UserLabel::SetColor(Color FromColor,Color ToColor)
    {
    	ColorFrom = FromColor;
    	ColorTo = ToColor;
    	Invalidate();
    }
    
    void UserLabel::OnPaint(System::Windows::Forms::PaintEventArgs^ e) 
    {
    
    	...
    }
    

    Der Compiler gibt den Fehler aus, dass er die überladene Memberfunktion OnPaint nicht finden kann.
    Woran kann das liegen?

    Gruß tompkins



  • Schau dir die Parameter bei OnPaint mal genau an.

    Du solltest ins C++/CLI .Net Forum posten um Hilfe zu bekommen 😉
    http://www.c-plusplus.net/forum/viewforum-var-f-is-58.html



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Manchmal sieht man den Wald vor lauter Bäumen nicht!
    Nachdem ich das ^ Zeichen in die Parameterliste eingefügt habe, hat es funktioniert.

    Jetzt habe ich das Problem, wie kann ich dieses Label in einem Form im gleichen Projekt nutzen? Kann ich das in die Toolbox einfügen?

    Wenn ich in der Datei Form.cpp schreibe:

    include "Userlabel.cpp"
    

    kommt die Fehlermeldung, dass die Datei bereits in der Form.obj enthalten ist.
    Tue ich das nicht kommt die Fehlermeldung "Bezeichner Userlabel nicht deklariert".



  • versuch mal

    #include "UserLabel.h"
    

    hand, mogel



  • In der .cpp stehen die Methoden der Klasse. Die müssten doch auch inkludiert werden, oder?



  • Ok, muss man wohl nicht.
    Danke für die Hilfe.



  • aus der CPP wird eine OBJ Datei ... die H Datei sagt nur den anderen CPP Dateien das da die Methoden irgendwo existieren - aber sie existieren ... spätestens der Linker mault rum wenn er Methoden nicht finden kann



  • Wie kann ich mit c++/cli aus einer abgeleiteten Klasse eine Funktion der Basisklasse aufrufen, die in der abgeleiteten Klasse überschrieben wurde.

    void UserLabel::OnPaint(System::Windows::Forms::PaintEventArgs^ e)
    {
    
        ...
    ZeigerAufBasis->OnPaint(e);
    
    }
    

    Unter VB.NET geht das mit Mybase.



  • Label::OnPaint(e);
    

    wenn mich jetzt nicht alles täuscht, mogel



  • Ich brauch aber doch einen Bezug zum aktuellen Objekt, in der Art des this-Zeigers.



  • tompkins schrieb:

    Ich brauch aber doch einen Bezug zum aktuellen Objekt, in der Art des this-Zeigers.

    Das Objekt steht implizit fest, da OnPaint eine nicht- statische Member Funktion ist.

    Simon

    using namespace System;
    
    ref struct Base
    {
        virtual void f()
        {
        }
    };
    
    ref struct Derived : public Base
    {
        virtual void f() override
        {
            Base::f();
        }
    };
    
    int main(array<System::String ^> ^args)
    {
        Derived^ d = gcnew Derived;
        d->f();
    
        return 0;
    }
    


  • Alles klar, es funktioniert.
    Danke für die Hilfe!


Log in to reply