मेरे पास तीन स्तरों पर नोड्स के साथ डेल्फी में एक TTreeView है।ट्रीव्यू नोड्स में अतिरिक्त टेक्स्ट प्रदर्शित करें, न सिर्फ node.text
मैं नोड टेक्स्ट के अलावा एक और लेबल स्टोर करने के लिए नोड डेटा का उपयोग करता हूं।
Type
TNodeData = class
ExtraNodeLabel: WideString;
//... other members
end;
मैं एक OnAdvancedCustomDrawItem घटना है, जहां मैं इस ExtraNodeLabel
नोड पाठ से पहले प्रदर्शित करने के लिए चाहते हैं। मैं इस लक्ष्य को हासिल करना चाहते हैं:
- नीले पाठ अतिरिक्त लेबल होगा।
- higlighted आइटम:
समस्याएं::
पहले दो शब्द भी, एक अतिरिक्त लेबल
क्या मैं अब तक मिल गया हैं यह है
- किसी कारण मैं अलग शैली अगर मैं का उपयोग
DrawText
/drawTextW
(मैं क्योंकि यूनिकोड डेटा के drawtextW जरूरत है) के साथ पाठ आकर्षित नहीं कर सकते - अन्य समस्या है, बिंदीदार फोकस आयत के बाहर है कि कुछ भी उन पर क्लिक नहीं है
क्या जरूरत है हल किया जा करने के लिए:
- कैसे मैं
DrawText
/DrawtextW
- का उपयोग कर कैसे 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 शायद इस तथ्य से कोई लेना देना नहीं है कि पेड़ उपायों अपने नोड के पाठ की चौड़ाई फोकस आयत निर्धारित करने के लिए और कहा कि नहीं ले करता है आपका अतिरिक्त पाठ i खाते में हल करने के लिए आपको या तो नोड के टेक्स्ट में टेक्स्ट जोड़ना होगा या अपना खुद का टीटीआरवीव वंश बनाना होगा और फोकस आयत के लिए चौड़ाई माप में ओवरराइड/हुक करने का तरीका ढूंढना होगा ([दस्तावेज़ीकरण] का एक त्वरित पठन (http://docwiki.embarcadero.com/Libraries/XE4/en/Vcl.ComCtrls.TTreeView) कोई स्पष्ट घटनाएं नहीं लाता है)। –
यह @ मारजन कहते हैं। 'TVM_SETITEMRECT 'और न ही' TVM_SETITEMHEIGHT', अधिसूचना संदेश और नोड चौड़ाई को सेट करने के लिए कोई मैक्रो नहीं है। मैं कहूंगा, आपको नोड चौड़ाई के उचित विस्तार के लिए 'TTreeNode.Text' संपत्ति मान सेट करने की आवश्यकता होगी। – TLama
दुर्भाग्यवश मैं TTreeNode.Text प्रॉपर्टी सेट नहीं कर सकता, क्योंकि इस मान को नोड टेक्स्ट के साथ सहेजा नहीं जाना चाहिए। – beerwin