Zelle im DBGrid mehrfarbig zeichnen?



  • Hallo,

    ich male zur Zeit eine Zelle einfarbig aus mit Brush->Color. Kann ich aber dieses Rechteck noch teilen? Vielleicht in 2 oder auch 4 Rechtecke? So dass man mehrere Farben in einer Zelle gleichzeitig haben kann.

    Lieben Gruß Michel



  • Hallo

    Du kannst die Gesamt-Fläche deiner Zelle natürlich auch mit mehreren Rechteck-Funktionsaufrufen in verschiedene Bereiche und in verschiedene Farben aufteilen.

    bis bald
    akari



  • und wie teile ich diese zelle denn auf? Sagen wir z.B. die Zelle in der mitte teilen, so dass 2 Rechtecke übereinander entstehen?



  • Hallo

    Indem du die Werte für Höhe und Breite der Rechtecke entsprechend berechnest. Willst du z.B. die Grundfläche mit Höhe H und Breite B in vier Rechtecke aufteilen, zeichnest du vier Rechtecke mit den Eckkoordinaten Links;Oben-Rechts;Unten :
    * Rechteck 1 : 0;0 - B/2;H/2
    * Rechteck 2 : B/2;0 - B;H/2
    * Rechteck 3 : 0;H/2 - B/2;H
    * Rechteck 4 : B/2;H/2 - B;H

    Geometrie aus der dritten Klasse...

    bis bald
    akari



  • Danke, dass du mir unterstellst, dass ich Mathe aus der 3. nicht kann 👎

    Mir ging es natürlich nicht um die Koordinaten, sondern um die Funktionen. Aber ich habe die jetzt herausgefunden.

    Rect Oben = _DBGrid->Canvas->Rectangle(0,0,128,32) ;
    _DBGrid->Canvas->Brush->Color = clRed ;
    _DBGrid->Canvas->FillRect(Oben) ;
    

    Kann das so funktionieren? Oder muss ich noch etwas beachten?



  • Hallo

    Ich dachte eben diese Funktion sei dir schon bekannt.
    Ja, im Prinzip passt das. Probier es doch aus.

    bis bald
    akari



  • Nee funktioniert nicht! Der Compiler meckert. Stimmt wohl was mit der Deklaration nicht:

    [BCC32 Fehler] KTPMainFrm.cpp(1380): E2379 In Anweisung fehlt ;
    [BCC32 Fehler] KTPMainFrm.cpp(1382): E2451 Undefiniertes Symbol 'Oben'



  • Hallo

    Ich sagte im Prinzip.
    Die Klasse heißt TRect und nicht Rect.

    bis bald
    akari



  • Ja ich merke gerade, dass _DBGrid->Canvas->Rectangle(...) ne void-Funktion ist ... also kann ich TRect Oben dies nicht zuweisen. Was für ein Rechteck soll ich denn dann FillRect() übergeben?





  • Ich glaube, du meinst:

    TCanvas *zf = StundenplanGrid->Canvas;
    GradientFillCanvas(zf, clWhite, zf->Brush->Color, Rect, gdVertical);
    

    aber ich verstehe trotzdem nicht, wie ich das zusammenfügen soll 😕



  • Den Link oben habe ich nur gepostet, weil dort schon ein Ansatz war.
    In DrawColumnCell bekommst du das Rect serviert, das jeweils gerade gezeichnet wird. Dieses muss nur
    den Wünschen entsprechend in weitere Zeichenflächen aufgeteilt werden.

    Etwas abgeändert für zwei-/ dreifarbige Zellen hier ein Bsp:

    void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender, const TRect &Rect,
    		  int DataCol, TColumn *Column, TGridDrawState State)
    {
       TColor colors[3] = {clRed, clInactiveCaptionText, clLime};
    
       if( Column->FieldName == "Common_Name" ) {
    
          TCanvas* cv = DBGrid1->Canvas;
    
          TRect rect[2];
          rect[0].Left   = Rect.Left;
          rect[0].Top    = Rect.Top;
          rect[0].Right  = Rect.Left + ((Rect.Right-Rect.Left)/2);
          rect[0].Bottom = Rect.Bottom;
    
          rect[1].Left 	= Rect.Left + ((Rect.Right-Rect.Left)/2);
          rect[1].Top    = Rect.Top;
          rect[1].Right  = Rect.Right;
          rect[1].Bottom = Rect.Bottom;
    
             for (int i = 0; i < 2; i++) {
                cv->Brush->Color = colors[i];
                cv->FillRect(rect[i]);
                // oder auch
                //GradientFillCanvas(cv, colors[i], colors[i+1], rect[i], gdHorizontal);
    
    	 }
    	 String Txt = DBGrid1->Fields[DataCol]->Text;
    	 SetBkMode(DBGrid1->Canvas->Handle, TRANSPARENT);
    	 DrawText(DBGrid1->Canvas->Handle, Txt.c_str(), -1, &Rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
       }
    }
    

    mfg
    kpeter



  • So, dein Beispiel habe ich jetzt erfolgreich integrieren können und es funktioniert 🙂

    Aber beim Text haperts noch ein bisschen, da gibt er mir nur den 1. Buchstaben des Strings aus ...

    String Txt = _DBGrid->Fields[DataCol]->Text ;
    SetBkMode(_DBGrid->Canvas->Handle, TRANSPARENT) ;
    DrawText(_DBGrid->Canvas->Handle, (char*)Txt.c_str(), -1, &Rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER) ;
    

    Edit:

    Habe es selber herausgefunden:

    DrawTextW(_DBGrid->Canvas->Handle, Txt.w_str(), -1, &Rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER) ;
    

Anmelden zum Antworten