Grafik, Events und anderes bei eigener Komponente



  • Linien zeichnen geht ja nun.

    Verbunden mit WM_LBUTTONDOWN und WM_LBUTTONUP (Startpunkt/Endpunkt) können gerade Linien und geometrische Figuren gezeichnet
    werden. Die Pixelpositionen bekommst du ja geliefert.

    Wo ist da das Problem?



  • Wenn ich jetzt mit Canvas eine Linie Male, kann ich dann auch rausfinden ob die Maus gerade auf der Linie ist, oder muss ich das über X/Y coordinaten selber raus suchen?

    Das ist das was ich hier gefragt hatte. ich muss also die pixel coordinaten mit den Maus coordinaten vergleichen und wenn die die maus auf der linie ist das event auslösen.



  • Das bekommt man hin, Mauskoord. mit Liniekoord. vergleichen. Aber deshalb bekommt diese
    Linie sicher keinen Fokus oder wird gar markiert.

    Das spielt jetzt wieder in den anderen Thread hinein...

    mfg
    kpeter



  • class TMyGraphic : public TGraphicControl
    {
    ...
    
        public:
             __fastcall TMyGraphic(TComponent* Owner) : TGraphicControl(Owner)
            {
                Widht=100;
                Height=100;
            }
    
    }
    
    class PACKAGE TGundgrafik : public TWinControl
    {
    private:
    
            TMyGraphic *MeineGrafik;
    public:
    	__fastcall TGundgrafik(TComponent* Owner) :TWinControl(Owner)
    	{
    		MeineGrafik = new TMyGraphic(this);
    
    		MeineGrafik->Parent=this;
    		MeineGrafik->Left=0;//this->Left;
    		MeineGrafik->Top=0;//this->Top;
    //		MeineGrafik->Width=130;//this->Width ;
    //		MeineGrafik->Height=130;//this->Height;
    
            }
    }
    

    Beim Anlegen soll TMyGraphic so groß sein wie TGundgrafik.

    1.Problem: Wie komme ich an die größe von Owner? Left, Widht etc ist im Konstruktor noch 0.

    2. Problem: Wo muss ich das definieren. wenn ich das aus dem Konstuktor von TMyGraphic Weg lasse und bei TGundgrafik hinzufüge dann macht der das nicht.



  • Hi,

    die Eigenschaft auf Align = alClient; setzen

    edit:
    an die Grösse kommst du über einen Zeiger:

    TForm1* MyOwner;
       MyOwner = static_cast<TForm1*>(Form1);
       int w = MyOwner->Width;
    

    mfg
    kpeter



  • Auf Align hätte ich auch selber kommen können 🙂

    aber wiso ist im Konstruktor die breite des Objects noch nicht bekannt?

    __fastcall TGundgrafik(TComponent* Owner) :TWinControl(Owner)
        {
    
            int breite=this->Widht;  // breite ist 0
        }
    


  • Du muss deiner Grundgrafik doch erst mal sagen, wie gross sie sein soll.
    Und das, bevor du die dyn. Komponente erzeugst.

    class PACKAGE TGundgrafik : public TWinControl
    {
    private:
    
            TMyGraphic *MeineGrafik;
    public:
        __fastcall TGundgrafik(TComponent* Owner) :TWinControl(Owner)
        {
            this->Width  = 100;
            this->Height = 100;
            // nimm SetBounds ;)
    
            MeineGrafik = new TMyGraphic(this);
    
            MeineGrafik->Parent=this;
            MeineGrafik->Align = alClient;
    
            //MeineGrafik->Left=0;//this->Left;
            //MeineGrafik->Top=0;//this->Top;
            //MeineGrafik->Width=130;//this->Width ;
            //MeineGrafik->Height=130;//this->Height;
    
            }
    }
    


  • Ich raff das einfach nicht woher die die größenangaben nimmt. Wenn ich die komponente auf Form ziehe, dann sind doch in den eigenschaften (dfm datei) die größen angegeben. Aber es scheint so als ob erst der konstruktor aufgerufen wird und dann die Eigenschaften ausliest!?

    So funktioniert es auf jeden fall nicht

    class TMyGraphic : public TGraphicControl
    {
    
    public:
    		std::vector<TDWShape*> Shapes;
    		TDWCircle *Kreis;
    		TDWSquare *Kreis2;
    		POINT points[5];
    public:
    
    	__fastcall TMyGraphic(TComponent* Owner) : TGraphicControl(Owner)
    	{
    		Shapes.resize(0);
    		Kreis = new TDWCircle;
    		Kreis2 = new TDWSquare;
    
                       //this->Align= alClient    bringt auch nichts  
    		Canvas->Brush->Color = clBlack;
    		points[0].x =  0;
    		points[0].y =  0;
    		points[1].x = Width -1;  //Whidth ist 0 warum???
    		points[1].y =  0;
    		points[2].x = Width -1;
    		points[2].y = Height -1;
    		points[3].x =  0;
    		points[3].y = Height -1;
    		points[4].x =  0;
    		points[4].y =  0;
    
        }
    ...
    };
    
    class PACKAGE TGundgrafik : public TWinControl
    {
    private:
    	TMyGraphic *MeineGrafik;
    
    public:
    	__fastcall TGundgrafik(TComponent* Owner) :TWinControl(Owner)
    	{
    	   this->Top=10;
    	   this->Left=10;
    	   this->Height=100;
    	   this->Width=200;
    
    		MeineGrafik = new TMyGraphic(this); 
    		MeineGrafik->Parent=this;
    		MeineGrafik->BoundsRect=this->BoundsRect; //hier übergebe ich die größe, aber der Konstruktor ist ja schon durchlaufen!? ist also was spät
    	}
    };
    


  • JBOpael schrieb:

    MeineGrafik->BoundsRect=this->BoundsRect; //hier übergebe ich die größe, aber der Konstruktor ist ja schon durchlaufen...
    

    Der Konstruktor wird schon zwei Zeilen vorher bei new TMyGraphic(this) aufgerufen.
    Damit sind die Werte im points-Array wirkungslos.

    Um das Array richtig zu füllen und auch bei Grössenänderungen aktuell zu halten, kannst du es in die WM_PAINT reinschreiben.

    Im übrigen rate ich dir, dich zum Thema Komponentenentwicklung weiter zu informieren. Vieles wird dir dann schon mal klarer.

    mfg
    kpeter



  • Woher bekomme ich den die infos über komponentenentwicklung? bei google finden man nur wenig infos darüber. und bücher zu dem thema hab ich auch keins gefunden.

    die meisten erwähnen nur das man eine eine neue komponete erstellen kann von z.B Tedit ableiten kann um dann kleinigkeiten zu ändern. Aber wenns tiefer in die Materie geht ist dann auch schon ende.

    die besten infos die ich bis jetzt gefunden habe kommen von hier :

    http://bcb-tutorial.c-plusplus.net/inhalt.html

    Ansonsten hab ich halt nur die möglichkeit im forum nach zu fragen. Mir wäre es auch lieber wenn ich eine quelle hätte wo ich mich genauer informieren kann.

    Bin dir deswegen echt dankbar das du mir soviele tips und hilfestellungen gegeben hast.



  • JBOpael schrieb:

    Woher bekomme ich den die infos über komponentenentwicklung?

    In der Dokumentation, Kapitel "Komponentenentwicklung".

    Falls du eine neuere Version als C++Builder 6 benutzt, lade die C++Builder 6-Hilfedateien hier herunter.



  • Hi,

    Der Link ist eine sehr gute Grundlage und weitere Infos findet man. Hab mir auch kein Buch zu diesem Thema gekauft. 😉

    In den BCB-Examples sind zb. 3 Komponentenableitungen. Auch der Einsatz von Eigenschaftseditoren (Dialog wie zb. Font) ist
    dort enthalten. Wenn Zeit ist, solltest du mit diesen Projekten mal arbeiten.

    mfg
    kpeter


Anmelden zum Antworten