TreeView Zeilenhöhe einstellen



  • Hallo zusammen,

    ich möchte bei einem TTreeView die Zeilenhöhe für alle neu einstellen.

    Laut Mircosoft unter http://msdn.microsoft.com/en-us/library/system.windows.forms.treeview.itemheight%28v=VS.71%29.aspx

    soll das so funktionieren:
    [C++]
    private:
    void Button1_Click(Object
    /*sender*/, EventArgs* /*e*/) {
    myTreeView->ItemHeight = 5;
    myTreeView->SelectedNode->NodeFont = new System::Drawing::Font(S"Arial", 5);

    // Get the font size from combobox.
    String* selectedString = myComboBox->SelectedItem->ToString();
    int myNodeFontSize = Int32::Parse(selectedString);

    // Set the font of root node.
    myTreeView->SelectedNode->NodeFont = new System::Drawing::Font(S"Arial",
    (float)myNodeFontSize);
    for (int i = 0; i < myTreeView->Nodes->Item[0]->Nodes->Count; i++) {
    // Set the font of child nodes.
    myTreeView->Nodes->Item[0]->Nodes->Item[i]->NodeFont =
    new System::Drawing::Font(S"Arial", (float)myNodeFontSize);
    }

    // Get the bounds of the tree node.
    Rectangle myRectangle = myTreeView->SelectedNode->Bounds;
    int myNodeHeight = myRectangle.Height;
    if (myNodeHeight < myNodeFontSize) {
    myNodeHeight = myNodeFontSize;
    }
    myTreeView->ItemHeight = myNodeHeight + 4;
    }
    *

    Unter dem CBUilder 2007 finde ich das Tree->ItemHeight aber nicht; auch
    bei einem TTreeNode nicht. Was mache ich falsch bzw. geht es anders?
    Konnte sonst in Google nichts vernünftiges zu diesem Thema finden... 😕

    Danke für jeden Hinweis im Voraus. 😋

    Gruß Stefan



  • Hallo Stefan,

    bei der MSDN bist du aber völlig falsch. Du mußt hier schauen: http://docwiki.embarcadero.com/VCL/en/ComCtrls.TTreeView

    So viel ich weiß, richtet sich die Item-Höhe nach der eingestellten Fontgröße.



  • Hallo Th69,

    danke für Deinen Hinweis und Link.

    Mit der Fonthöhe klappt zwar, aber ich wollte eigentlich die
    Standardschrift behalten und nur den Abstand vergrößern, da ich
    Symbole einsetze (16pixel Höhe) und das dadurch arg gedrängelt
    aussieht.

    Jetzt könnte man natürlich den Font schön groß machen >10 und
    mittels Ownerdraw selbst schreiben, aber das finde ich beim TreeView
    doch arg aufwendig.

    Hatte auf eine Methode wie z.B. bei der Listbox gehofft; verstehe auch
    nicht ganz, warum das bei einer TreeView nicht längst implementiert wurde.

    Gruß Stefan



  • So, lässt einen ja keine Ruhe 😉

    Wer es mal selbst braucht, so habe ich es gelöst:

    void __fastcall TForm1::frm1_trv1_EintragAdvancedCustomDrawItem(TCustomTreeView *Sender, TTreeNode *Node, TCustomDrawState State, TCustomDrawStage Stage, bool &PaintImages, bool &DefaultDraw)
    {try {                                                                          // Fehlerroutine Start
     Integer iInd,iStil,iLevl,iSymb; AnsiString zInh; TColor f1,f2;                 // Vars definieren
     TFontStyles s1;                                                                // Vars definieren
     TTreeView *Tree;                                                               // vorbereiten
     TRect CRect;                                                                   // vorbereiten
     Graphics::TBitmap *bmp;                                                        // Bitmap vorbereiten
    
     Tree = dynamic_cast<TTreeView *>     (Sender);                                 // Versuchen, Sender als TTReeView anzusprechen
    
     DefaultDraw=true;                                                              // Standardzeichnen erstmal erlauben
     if(Node==NULL)          { return; }                                            // Einsprung prüfen
     if(Stage!=cdPostPaint)  { return; }                                            // wenn Aufruf nicht nach dem zeichnen des Nodes, dann Abbruch
    
     s1   =TFontStyles();                                                           // Font keine Eigenschaften
     zInh =Node->Text;                                                              // Nodebeschriftung
     iLevl=Node->Level;                                                             // Ebene ermitteln
     iInd =Node->AbsoluteIndex;                                                     // Eintragsindex über alles ermitteln
     iSymb=Node->ImageIndex;                                                        // Symbolindex
     iStil=DT_LEFT;                                                                 // Standardstil
     f1   =TColor(0x00DFFFDF); f2=clBlack;                                          // Farben Standard
     CRect=Node->DisplayRect(true);                                                 // Koord. des Texteintrages
    
     switch(iLevl) {                                                                // welche Ebene?
     case 0 : f2=clBlue;            break;                                          // EINTRAG
     case 1 : f2=clNavy;            break;                                          // ZUORDNUNG
     case 2 :                                                                       // BEZEICHNUNG
      f2   =clMaroon;                                                               // VG Farbe
      iSymb=Node->ImageIndex;                                                       // Symbol ermitteln
      break;                                                                        // und fertig
     }                                                                              // ende switch(iLevl
    
     if(oDFarbe==false)       { f1=clWhite;   }                                     // HG nicht einfärben
     if(Node->Selected==true) { f1=clSkyBlue; }                                     // Node ist selektiert
     if(Tree->Enabled==false) { f2=clGray;    }                                     // Node ist gesperrt
    
     Tree->Canvas->Brush->Color=f1;                                                 // HG Farbe
     Tree->Canvas->FillRect(CRect);                                                 // Fläche erst füllen
     Tree->Canvas->Font->Color =f2 ;                                                // VG Farbe
     Tree->Canvas->Font->Name  ="Tahoma";                                           // Schriftart
     Tree->Canvas->Font->Size  =8;                                                  // Schriftgrösse
     Tree->Canvas->Font->Style =s1;                                                 // Schriftstil
     CRect.Left+=2;                                                                 // X-Koord anpassen
     DrawText(Tree->Canvas->Handle,zInh.c_str(),-1,&CRect,iStil | DT_VCENTER | DT_SINGLELINE); // Text schreiben
    
     DefaultDraw=false;                                                             // kein Standardzeichnen mehr
     if(oESymbo==false)        { return; }                                          // keine Symbole zeichnen, fertig
     if(iSymb==-1 || iLevl!=2) { return; }                                          // kein Symbol hinterlegt, fertig
    
     bmp=new Graphics::TBitmap();                                                   // neue Bitmap anlegen
     bmp->Transparent     =true;                                                    // Transparenz einschalten
     bmp->TransparentMode =tmAuto;                                                  // Modus Automatik
     Form1->frm1_imgSymbData->GetBitmap(iSymb,bmp);                                 // und aus Imageliste holen
     bmp->TransparentColor=bmp->Canvas->Pixels[0][0];                               // Farbe für durchsichtig ermitteln
     if(Tree->Enabled==false) { bmp->Mask(clPurple); }                              // Symbole ausgegraut
     Tree->Canvas->Draw(CRect.Left-20,CRect.Top+1,bmp);                             // Symbol zeichnen
     delete bmp;                                                                    // Bitmap löschen
    
     } catch(Exception& e) { MessageBox(NULL, e.Message.c_str(), "TForm1::frm1_trv1_EintragAdvancedCustomDrawItem()", MB_OK); }  // Fehler anzeigen
    }
    

    Die TreeView (frm1_trv1_Eintrag) hat 3 Ebenen (Eintrag -> Zuordnung -> Bezeichnung). Bei mir können zusätzlich in der dritten Ebene beim Befüllen
    mit Node->ImageIndex Symbole hinterlegt werden; dies ist im Quellcode der
    letzte Absatz.

    Gruß Stefan





  • Hallo sta68,
    danke für diesen sehr hilfreichen Tip! 👍

    So klappt es jetzt:

    TreeE->Perform(TVM_SETITEMHEIGHT,16+abs(int(oESymbo*3)),0);			// Zeilenhöhe im TreeView einstellen
    

    Mit oESymbo (Boolean) wird mit Symbolen der Abstand um 3 Pixel
    vergrößert und ohne Symbole sind es 16 Pixel.

    Gruß Stefan


Anmelden zum Antworten