2010-03-02 9 views
8

अंदर स्ट्रिंग किसी कृपया समझा सकते हैं कि कैसे मैं एक richtextbox नियंत्रण के अंदर स्ट्रिंग को मापने के लिए इतना है कि मैं अपने आप अपनी सामग्री के अनुसार richtextbox नियंत्रण आकार बदल सकते हैं के बारे में जाना होगा?उपाय RichTextBox नियंत्रण

धन्यवाद

संपादित करें:

मैं इसके बारे में सोचा है, और नीचे इस सवाल का जवाब के बाद से अगर वहाँ RichTextBox नियंत्रण में अलग फोंट, अगर, मैं ऊपरी मिल सकता है क्या कर रहे हैं काम नहीं करेगा richtextbox नियंत्रण के बाएं कॉर्ड और फिर आरटीबी के अंदर पाठ की आखिरी पंक्ति के निचले दाएं कोर्ड्स प्राप्त करें। यह अनिवार्य रूप से मुझे RichTextBox नियंत्रण के अंदर स्ट्रिंग की चौड़ाई और ऊंचाई प्रदान करेगा। क्या यह संभव है? या क्या यह इस तरह से करना एक बुरा विचार है?

उत्तर

0

आप TextRenderer.MeasureText को फोन करके एक स्ट्रिंग माप सकते हैं।

हालांकि, अगर पाठ कई फोंट में शामिल है, यह काम नहीं करेगा।

EDIT: आप GetPositionFromCharIndex विधि की तलाश में हैं।
ध्यान दें कि यदि कई रेखाएं हैं, तो आपको प्रत्येक पंक्ति पर अंतिम वर्ण के एक्स समन्वय अधिकतम लेना चाहिए।

+0

धन्यवाद। मैं उस पृष्ठ को काफी समझ नहीं पा रहा हूं। यह पाठ क्यों आकर्षित करता है? क्या यह मुझे सिर्फ चौड़ाई और ऊंचाई मान वापस भेज सकता है, इसलिए मैं RichTextBox के आकार को नए आकार में रीसेट कर सकता हूं? –

+0

शायद अगर मैं एक अलग सवाल पूछता हूं तो यह चीजों को सरल बना देगा ... –

+0

'TextRenderer.MeasureText' कुछ भी नहीं खींचता है; यह बस पिक्सेल में पाठ का आकार देता है। – SLaks

2

यह मानते हुए कि किसी को कंट्रोल में लिख रहा है, तो आप एक चरित्र दर्ज किया गया है हर बार (वेतन वृद्धि काउंटर) और घटती आग जब यह हटा दी जाती है एक घटना इस्तेमाल कर सकते हैं। यह आपको एक वास्तविक गिनती देगा।

संपादित करें:

आप इस की कोशिश की है ऊंचाई को समायोजित करने के लिए?

richTextBox1.Height = (int)(1.5 * richTextBox1.Font.Height) + richTextBox1.GetLineFromCharIndex(richTextBox1.Text.Length + 1) * richTextBox1.Font.Height + 1 + richTextBox1.Margin.Vertical; 

richTextBox1.SelectionStart = 0; 

richTextBox1.SelectionStart = richTextBox1.Text.Length; 

या आप इस चौड़ाई का उपयोग कर सकते हैं:

Graphics g = Graphics.FromHwnd(richTextBox1.Handle); 

SizeF f = g.MeasureString(richTextBox1.Text, richTextBox1.Font); 
richTextBox1.Width = (int)(f.Width)+5; 
+0

यह वर्तमान में मैं कर रहा हूं, हालांकि आप इस तरह फ़ॉन्ट शैलियों/आकारों के लिए खाते नहीं ले सकते हैं, और अंत में आरटीबी जारी नहीं रहेगा और पाठ –

+0

ओवरफ़्लो ओवरफ़्लो –

+0

कोई अपराध नहीं होगा, लेकिन यह बहुत बदसूरत परिणाम पैदा करता है। RichTextBox की तरह दिखने के बिना ऐसा करने का कोई तरीका होना चाहिए मेरे मॉनिटर के माध्यम से विस्फोट करना है। –

3

GetPreferredSize(Size.Empty) कॉल करके देखें। इसे कंट्रोल क्लास में परिभाषित किया गया है, और यदि RichTextBoxControl द्वारा अधिभारित संपत्ति को आपको वह देना चाहिए जो आप खोज रहे हैं।

आप विधि में Size.Empty के अलावा कुछ पार कर लेते हैं, तो यह है कि मूल्य अधिकतम बाधा के रूप में प्रयोग करेंगे। आकार का उपयोग करना। लक्षण का मतलब है कि संभावित आकार असंबद्ध है।

+0

आप इसे चौड़ाई 'GetPreferredSize (नया आकार (चौड़ाई, 0)) के साथ भी कॉल कर सकते हैं और आप उस रिटर्न से ऊंचाई प्राप्त कर सकते हैं कॉल –

6

ContentsResized घटना में निम्नलिखित कोड डालें:

Private Sub rtb_ContentsResized(ByVal sender As Object, ByVal e As System.Windows.Forms.ContentsResizedEventArgs) Handles txtQuestion.ContentsResized 
     Dim h = e.NewRectangle.Height, w = e.NewRectangle.Width 
     h = Math.Max(h, sender.Font.Height) 
     h = Math.Min(h, Me.ClientSize.Height - 10 - sender.Top) 
     h += sender.Height - sender.ClientSize.Height + 1 
     sender.Height = h 
End Sub 
+0

'सामग्री रेजिज्ड' और 'e.NewRectangle' ने मेरे लिए चाल बनाई। अन्य सामान्य संदिग्ध उदा। 'ऑटोसाइज', 'GetPreferredSize'' RichTextBox' के लिए ठीक से काम नहीं कर रहा है। –

0

मैं रिच टेक्स्ट बॉक्स ऊंचाई मसलों के लिए हल मिल गया .. मैं सामान्य उपयोग के लिए यह एक बदलाव कर दिया है ..

निम्नलिखित बनाएं आपके आवेदन में structs ....

[StructLayout(LayoutKind.Sequential)] 
    public struct RECT { 
     public Int32 left; 
     public Int32 top; 
     public Int32 right; 
     public Int32 bottom; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct SCROLLBARINFO { 
     public Int32 cbSize; 
     public RECT rcScrollBar; 
     public Int32 dxyLineButton; 
     public Int32 xyThumbTop; 
     public Int32 xyThumbBottom; 
     public Int32 reserved; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] 
     public Int32[] rgstate; 
    } 

फार्म के लिए अपनी कक्षा में निजी चर निम्नलिखित फार्म के लिए अपने वर्ग के लिए

private UInt32 SB_VERT = 1; 
     private UInt32 OBJID_VSCROLL = 0xFFFFFFFB; 

     [DllImport("user32.dll")] 
     private static extern 
      Int32 GetScrollRange(IntPtr hWnd, UInt32 nBar, out Int32 lpMinPos, out Int32 lpMaxPos); 

     [DllImport("user32.dll")] 
     private static extern 
      Int32 GetScrollBarInfo(IntPtr hWnd, UInt32 idObject, ref SCROLLBARINFO psbi); 

जोड़ें निम्न विधि (जहां कभी आप रिच टेक्स्ट ऊंचाई की गणना करनी है) बनाएं

private int CalculateRichTextHeight(string richText) { 
      int height = 0; 
      RichTextBox richTextBox = new RichTextBox(); 
      richTextBox.Rtf = richText; 
      richTextBox.Height = this.Bounds.Height; 
      richTextBox.Width = this.Bounds.Width; 
      richTextBox.WordWrap = false; 
      int nHeight = 0; 
      int nMin = 0, nMax = 0; 

      SCROLLBARINFO psbi = new SCROLLBARINFO(); 
      psbi.cbSize = Marshal.SizeOf(psbi); 

      richTextBox.Height = 10; 
      richTextBox.ScrollBars = RichTextBoxScrollBars.Vertical; 

      int nResult = GetScrollBarInfo(richTextBox.Handle, OBJID_VSCROLL, ref psbi); 
      if (psbi.rgstate[0] == 0) { 
       GetScrollRange(richTextBox.Handle, SB_VERT, out nMin, out nMax); 
       height = (nMax - nMin); 
      } 

      return height; 
     } 

आपको अपनी आवश्यकता के अनुसार इसे कार्य करने के लिए उपरोक्त विधि को संशोधित करने की आवश्यकता हो सकती है ... सुर बनाएं ई विधि सामान्य नहीं पाठ करने के लिए पैरामीटर के रूप में Rtf स्ट्रिंग भेजने के लिए है और यह भी विधि में RichTextBox चर के लिए उपलब्ध चौड़ाई और ऊंचाई आवंटित करने के लिए सुनिश्चित करें ...

आप WordWrap आपकी आवश्यकता पर निर्भर करता है के साथ खेल सकते ...

0

bathineni के महान जवाब देने के लिए पर जोड़ें:

पृष्ठभूमि: मैं कागज पर प्रतिपादन के लिए आरटीएफ उत्पादन ऊंचाई मापने के लिए की जरूरत है और मैं पेजिंग नियंत्रित करने के लिए) की जरूरत है क्योंकि मैं कस्टम गतिशील पृष्ठ हेडर/पाद है।

(RichTextBox.GetLineFromCharIndex जटिल आरटीएफ की वजह से मुझे नीचे जाने दें; लाइन & वर्डवाप के साथ बहु कॉलम टेबल्स सहित)।

किसी भी तरह से सभी ठीक काम कर रहे थे, जब तक कि किसी और ने डरावनी खिड़कियों के साथ अपना ऐप इस्तेमाल नहीं किया "टेक्स्ट और अन्य वस्तुओं को बड़ा या छोटा बनाएं" (डीपीआई सेटिंग्स।) - अब छोटे आकार के फोंट को मापने में यह पृष्ठ की लंबाई को खराब कर देता है गणना। (प्रिंटर ने अभी भी टेक्स्ट और कॉलम सही तरीके से प्रस्तुत किए हैं - केवल पृष्ठ की लंबाई अब सभी गलत थीं।)

केवल फैक्टरिंग डीपीआई अंतर विफल हुआ क्योंकि छोटे बड़े टेक्स्ट में स्रोत आरटीएफ टीएक्स और सेलक्स मानों में ठीक से फिट नहीं हुआ।

किसी भी तरह, इस मामले में अन्य लोगों के परीक्षण और त्रुटि के समान पागल बातें बिट कर रहे हैं bathineni CalculateRichTextHeight विधि के लिए निम्न (अंततः बहुत कुछ) mods के साथ आया था:

RichTextBox richTextBox = new RichTextBox();  // same as original 
int dpix = richTextBox.CreateGraphics().DpiX; // get dpi 
richTextBox.WordWrap = true;      // I needed this, you many not 
    // ... set size etc - same as original answer 
richTextBox.Scale(new System.Drawing.SizeF(dpix/96, dpix/96)); // scale RTB 
    // ... 
    // 96? my original calculations based on windows default 96dpi settings. 

अन्यथा अस्पष्ट नियंत्रण लगता है। स्केल (sizef) वास्तव में कुछ के लिए वास्तव में उपयोगी है।

नोट: यदि परिणाम वास्तविक मुद्रित लाइनों में परिवर्तित कर रहे हैं, (मेरे मामले में मेरे सभी \ pard के "\ sl-240 \ slmult0" थे जो प्रति पंक्ति 16 (पिक्स?) तक आते हैं) फिर भी कारक को याद रखना divisor। अर्थात मेरे मामले में:

lines = height/(int)(16 * (dpix/96)) 
संबंधित मुद्दे