2013-07-05 4 views
7

मेरे पास तीन स्तरों पर नोड्स के साथ डेल्फी में एक TTreeView है।ट्रीव्यू नोड्स में अतिरिक्त टेक्स्ट प्रदर्शित करें, न सिर्फ node.text

मैं नोड टेक्स्ट के अलावा एक और लेबल स्टोर करने के लिए नोड डेटा का उपयोग करता हूं।

Type 
    TNodeData = class 
    ExtraNodeLabel: WideString; 
    //... other members 
    end; 

मैं एक OnAdvancedCustomDrawItem घटना है, जहां मैं इस ExtraNodeLabel नोड पाठ से पहले प्रदर्शित करने के लिए चाहते हैं। मैं इस लक्ष्य को हासिल करना चाहते हैं:

  • नीले पाठ अतिरिक्त लेबल होगा।
  • higlighted आइटम:

    enter image description here

    समस्याएं::

    पहले दो शब्द भी, एक अतिरिक्त लेबल

enter image description here

क्या मैं अब तक मिल गया हैं यह है

  1. किसी कारण मैं अलग शैली अगर मैं का उपयोग DrawText/drawTextW (मैं क्योंकि यूनिकोड डेटा के drawtextW जरूरत है) के साथ पाठ आकर्षित नहीं कर सकते
  2. अन्य समस्या है, बिंदीदार फोकस आयत के बाहर है कि कुछ भी उन पर क्लिक नहीं है

क्या जरूरत है हल किया जा करने के लिए:

  1. कैसे मैं DrawText/DrawtextW
  2. का उपयोग कर कैसे im कर सकते हैं अलग शैली के साथ पाठ आकर्षित कर सकते हैं पूरे पाठ क्लिक करने योग्य है?

कोड:

procedure TMainForm.TntTreeView1AdvancedCustomDrawItem(
    Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; 
    Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean); 
var 
    txtrect, fullrect : TRect; 
    DC: HDC; 
    fs: integer; 
    fc: TColor; 
    ExtralabelRect: TRect; 
    nData: TNodeData; 
begin 
    nData := nil; 

    if assigned(Node.Data) then begin 
    nData := TNodeData(Node.Data); 
    end; 

    DC := TntTreeView1.canvas.Handle; 
    txtRect := Node.DisplayRect(True);  
    fullrect := Node.DisplayRect(False); 

    if stage = cdPostPaint then begin 
    TntTreeView1.Canvas.FillRect(txtRect); 
    if (cdsFocused In State) And (cdsSelected in State) then begin 
     DrawFocusRect(DC,txtRect); 
    end; 

    txtRect.Left := txtRect.Left + 1; 
    txtRect.Top := txtRect.Top + 1; 
    txtRect.Right := txtRect.Right - 1; 
    txtRect.Bottom := txtRect.Bottom - 1; 

    ExtralabelRect := txtRect; 

    fs := TntTreeView1.Canvas.Font.size; 
    fc := TntTreeView1.Canvas.Font.Color; 

    if (nData <> nil) And (nData.ExtraNodeLabel <> '') then begin 
     TntTreeView1.Canvas.Font.Size := 7; 
     TntTreeView1.Canvas.Font.color := clBlue; 
     DrawTextW(
     DC, 
     PWideChar(nData.ExtraNodeLabel), 
     Length(nData.ExtraNodeLabel), 
     ExtraLabelRect, 
     DT_LEFT or DT_CALCRECT or DT_VCENTER 
    ); 

     DrawTextW(
     DC, 
     PWideChar(nData.ExtraNodeLabel), 
     Length(nData.ExtraNodeLabel), 
     ExtraLabelRect, 
     DT_LEFT or DT_VCENTER 
    ); 

     txtRect.right := txtRect.Right + ExtraLabelRect.Right + 5; 
     txtRect.Left := ExtraLabelRect.Right + 5; 
    end; 

    TntTreeView1.Canvas.Font.Size := fs; 
    TntTreeView1.Canvas.Font.color := fc; 

    DrawTextW(
     DC, 
     PWideChar((Node as TTntTreeNode).Text), 
     -1, 
     txtRect, 
     DT_LEFT or DT_VCENTER 
    ); 
    end; 
end; 
+2

आपका नंबर 2 शायद इस तथ्य से कोई लेना देना नहीं है कि पेड़ उपायों अपने नोड के पाठ की चौड़ाई फोकस आयत निर्धारित करने के लिए और कहा कि नहीं ले करता है आपका अतिरिक्त पाठ i खाते में हल करने के लिए आपको या तो नोड के टेक्स्ट में टेक्स्ट जोड़ना होगा या अपना खुद का टीटीआरवीव वंश बनाना होगा और फोकस आयत के लिए चौड़ाई माप में ओवरराइड/हुक करने का तरीका ढूंढना होगा ([दस्तावेज़ीकरण] का एक त्वरित पठन (http://docwiki.embarcadero.com/Libraries/XE4/en/Vcl.ComCtrls.TTreeView) कोई स्पष्ट घटनाएं नहीं लाता है)। –

+1

यह @ मारजन कहते हैं। 'TVM_SETITEMRECT 'और न ही' TVM_SETITEMHEIGHT', अधिसूचना संदेश और नोड चौड़ाई को सेट करने के लिए कोई मैक्रो नहीं है। मैं कहूंगा, आपको नोड चौड़ाई के उचित विस्तार के लिए 'TTreeNode.Text' संपत्ति मान सेट करने की आवश्यकता होगी। – TLama

+0

दुर्भाग्यवश मैं TTreeNode.Text प्रॉपर्टी सेट नहीं कर सकता, क्योंकि इस मान को नोड टेक्स्ट के साथ सहेजा नहीं जाना चाहिए। – beerwin

उत्तर

2

समाधान ओपी

मैं आंशिक रूप से, कस्टम ड्राइंग हल करने के लिए एक TFont चर को परिभाषित करने, और SelectObject और setTextColor का उपयोग करके कामयाब द्वारा। फ़ॉन्ट रंग और स्टाइल काम सेट करना, लेकिन फ़ॉन्ट आकार सेट करना नहीं है।

var 
    nFont: TFont; 
begin 
    DC := TntTreeView1.Canvas.Handle; 
    NFont := TFont.Create; 

    // rest of the code here ... 

    // i tried to set nFont.Size, but it doesn't seem to work 
    nFont.Size := 7; 
    nFont.Color := colorToRGB(clBlue); 
    nFont.Style := TntTreeview1.Font.Style + [fsBold]; 

    SelectObject(DC,NFont.Handle); 
    SetTextColor(DC,colortoRGB(clBlue)); 

    DrawTextW(
    DC, 
    PWideChar(nData.nodeLabel), 
    Length(nData.nodeLabel), 
    ExtraLabelRect, 
    DT_LEFT or DT_VCENTER 
); 

    // rest of the code here 
end; 

स्रोत: I used the idea from here


अद्यतन 2

मैं सत्य पर treeview के RowSelect संपत्ति की स्थापना द्वारा दूसरी समस्या को हल किया। इसके लिए, काम करने के लिए, मुझे ShowLines संपत्ति को झूठी पर सेट करना पड़ा, और कस्टम लाइनों और बटनों को आकर्षित करना था। यह अब काम करता है।


अद्यतन 3

मैं पहली समस्या के लिए समाधान में सुधार, एक नया फ़ॉन्ट बनाने नहीं है, लेकिन पाठ प्रदर्शित करने के लिए कैनवास फ़ॉन्ट का चयन करके, और इस तरह से मैं किसी भी पहलू को बदलने में सक्षम था फ़ॉन्ट, और सिस्टम ClearType सेटिंग भी लागू किए गए:

// set font size for the canvas font (font style can be set the same time) 
TntTreeView1.Canvas.Font.Size := 7; 

// select canvas font for DC 
SelectObject(DC,TntTreeView1.Canvas.Font.Handle); 

// set font color 
SetTextColor(DC,colortoRGB(clBlue)); 
संबंधित मुद्दे