2011-08-10 6 views
7

के केंद्र में टेक्स्ट मल्टीलाइन ड्रा करें डेल्फी में मैं एक ट्रैक्ट के अंदर टेक्स्ट खींचना चाहता हूं। मैं निम्नलिखित कार्यक्षमता के लिए उम्मीद कर रहा हूँ:डेल्फी - एक रेक्ट

  1. ड्रा पाठ TRect
  2. भीतर लंबवत रूप से केंद्रित पाठ TRect
  3. भीतर क्षैतिज रूप से केंद्रित ड्रा वहाँ है, तो पाठ (का उपयोग कर के 1 से अधिक लाइन के लिए जगह TRect के ऊंचाई), टेक्स्ट मल्टीलाइन
  4. ड्रा करें यदि टेक्स्ट TRect में फिट नहीं है (या तो एकल या बहु लाइन पर) तो टेक्स्ट में इलिप्सिस संलग्न करें।

मैं Windows.DrawText() फ़ंक्शन लगभग देख सकते हैं इस कार्यशीलता को शामिल किया गया है, लेकिन जब पाठ, बहु लेखन और ऊर्ध्व रूप से केंद्रित परस्पर अनन्य हैं।

मैं सोच रहा था कि यह कार्यक्षमता विंडोज़ (2000+) में बनाई गई है या नहीं? यदि नहीं, तो अपना खुद का कार्य लिखने के बिना ऐसा करने का कोई तरीका नहीं है?

+2

क्या आप TLabel का उपयोग नहीं कर सकते? मुझे लगता है कि इसमें सभी कार्यक्षमता की आवश्यकता है। –

+1

हां यह शायद करता है, लेकिन मैं एक लेबल का उपयोग नहीं करना चाहता, मेरे पास ड्रॉ करने के लिए कैनवास है। – Simon

उत्तर

16

क्षमा करें, यह सभी पिछले उत्तरों और टिप्पणियों का एक संयोजन है। लेकिन ऐसा लगता है कि ओपी को और सहायता चाहिए।

function DrawTextCentered(Canvas: TCanvas; const R: TRect; S: String): Integer; 
var 
    DrawRect: TRect; 
    DrawFlags: Cardinal; 
    DrawParams: TDrawTextParams; 
begin 
    DrawRect := R; 
    DrawFlags := DT_END_ELLIPSIS or DT_NOPREFIX or DT_WORDBREAK or 
    DT_EDITCONTROL or DT_CENTER; 
    DrawText(Canvas.Handle, PChar(S), -1, DrawRect, DrawFlags or DT_CALCRECT); 
    DrawRect.Right := R.Right; 
    if DrawRect.Bottom < R.Bottom then 
    OffsetRect(DrawRect, 0, (R.Bottom - DrawRect.Bottom) div 2) 
    else 
    DrawRect.Bottom := R.Bottom; 
    ZeroMemory(@DrawParams, SizeOf(DrawParams)); 
    DrawParams.cbSize := SizeOf(DrawParams); 
    DrawTextEx(Canvas.Handle, PChar(S), -1, DrawRect, DrawFlags, @DrawParams); 
    Result := DrawParams.uiLengthDrawn; 
end; 

procedure TForm1.FormPaint(Sender: TObject); 
const 
    S = 'This is a very long text as test case for my paint routine.'; 
var 
    R: TRect; 
begin 
    SetRect(R, 100, 100, 200, 140); 
    Canvas.Rectangle(R); 
    InflateRect(R, -1, -1); 
    Caption := Format('%d characters drawn', [DrawTextCentered(Canvas, R, S)]); 
end; 
+0

मैं deamon_x और इस संस्करण के बीच अंतर नहीं देख सकता लेकिन यह काम करता है !!!!धन्यवाद :) – Simon

+0

यह पंक्ति कुंजी है: DT_END_ELLIPSIS या DT_NOPREFIX या DT_WORDBREAK या DT_EDITCONTROL या DT_CENTER; – Simon

+2

मुझे पता है कि कुछ आसान हो गया है, लेकिन झंडे के किसी अन्य संयोजन ने काम नहीं किया! अगर मैं कर सकता था तो अंक अंक विभाजित कर सकते हैं :) – Simon

5

DT_CALCRECT का उपयोग कर पहले टेक्स्ट को मापें। शब्द रैपिंग सक्षम करने के लिए DT_WORDBREAK पास करें। यह आपको अपने पाठ के लिए आवश्यक ऊंचाई खोजने की अनुमति देगा। फिर आप अपने कोड में, ऊर्ध्वाधर ऑफ़सेट की गणना कर सकते हैं जो आपको लंबवत केंद्रित पाठ देता है, और उस ऑफसेट पर आकर्षित करता है।

+0

मैंने इस विधि को आजमाया, लेकिन ऐसा लगता है कि DT_WORD_ELLIPSIS को DT_WORDBREAK निर्दिष्ट होने पर अनदेखा किया जाता है। यह दिनचर्या वर्तमान में रेक्ट के बाहर पाठ पेंट नहीं करता है (और '...' नहीं दिखाता है) – Simon

+0

क्या कोई तरीका है कि मैं वास्तव में कौन सा टेक्स्ट (या लम्बाई) खींचा जा सकता हूं? – Simon

+0

@ सिमॉन 'DT_WORDBREAK' के साथ सभी टेक्स्ट खींचा गया है। क्लिपिंग के कारण आप इसे संभवतः नहीं देख रहे हैं। –

संबंधित मुद्दे