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