2009-11-20 9 views
10

मेरे पास एक Winforms ऐप है जिसमें RichTextBox है।Winforms RichTextBox: मैं कैसे निर्धारित कर सकता हूं कि टेक्स्ट की कितनी पंक्तियां दिखाई दे रही हैं?

मैं कैसे निर्धारित कर सकता हूं कि पाठ की कितनी पंक्तियां प्रदर्शित की जाती हैं, वर्तमान में दिखाई दे रही हैं?

कारण: मैं रिचटेक्स्टबॉक्स के बीच में देखभाल को स्क्रॉल करना चाहता हूं। मैं RichTextBox.ScrollToCaret() का उपयोग कर सकता हूं, लेकिन यह रिचटेक्स्टबॉक्स के शीर्ष पर कैरेट रखता है। मुझे लगता है, अगर मुझे पता है कि कितनी लाइनें प्रदर्शित की जाती हैं, तो मैं कैरेट "बैक" एन/2 लाइनों को ले जा सकता हूं, फिर स्क्रॉलटोकैर() को कॉल कर सकता हूं, फिर मूल कैरेट स्थिति को पुनर्स्थापित कर सकता हूं।

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

मैंने पाया EM_GETLINECOUNT, जो मैंने सोचा था कि जवाब था, दस्तावेज़ को छोड़कर कहते हैं: EM_GETLINECOUNT संदेश पाठ लाइनों की कुल संख्या ही नहीं, लाइनों की संख्या है कि वर्तमान में दिखाई दे रहे हैं को पुन: प्राप्त ।

टैंटालाइजली, EM_GETFIRSTVISIBLELINE भी है, जो पहली दृश्यमान रेखा प्राप्त करता है, लेकिन मुझे GETLASTVISIBLELINE नहीं मिला। ??


संबंधित:
How can I scroll the caret to the middle of the RichTextBox?

+0

बस रुचि रखते हैं - आप इस जानकारी के साथ क्या करने जा रहे हैं? आपको एहसास है कि यह परिवर्तनीय हो सकता है, क्योंकि आपके पास पूरे टेक्स्ट में अलग-अलग फोंट और पैडिंग हो सकती है। –

+0

यह एक कस्टम आरटीबी बनाने में चला गया जो लाइन नंबर प्रदर्शित करता है: http://stackoverflow.com/questions/2567263/how-to-show-number-of-a-line-in-a-richtextbox-c/2668264#2668264 – Cheeso

उत्तर

16

खैर, यह सुंदर नहीं है, लेकिन यह मेरे लिए काम करता है। असल में मैं समृद्ध टेक्स्टबॉक्स के ऊपरी-बाएं कोने के अंदर और टेक्स्टबॉक्स के निचले बाएं कोने के अंदर एक बिंदु की जांच कर रहा हूं। आपके Richtextbox को प्रदर्शित करने के तरीके के आधार पर आपको बिंदु निर्देशांक समायोजित करना पड़ सकता है। तब मुझे चरित्र सूचकांक मिलता है जो उन दो बिंदुओं में से प्रत्येक के सबसे नज़दीक है, और उस रेखा को पुनः प्राप्त करें जो यह चालू है।

Dim topIndex As Integer = RichTextBox1.GetCharIndexFromPosition(New Point(1, 1)) 
Dim bottomIndex As Integer = RichTextBox1.GetCharIndexFromPosition(New Point(1, RichTextBox1.Height - 1)) 

Dim topLine As Integer = RichTextBox1.GetLineFromCharIndex(topIndex) 
Dim bottomLine As Integer = RichTextBox1.GetLineFromCharIndex(bottomIndex) 

Dim numLinesDisplayed As Integer = bottomLine - topLine 

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

+1

पूरी तरह से काम किया। धन्यवाद। – Cheeso

+0

शानदार। आपका बहुत बहुत धन्यवाद। – Larry

0

लाइनों की संख्या है कि एक RichTextBox प्रदर्शित करने में सक्षम है, भले ही कोई पाठ नहीं है वर्तमान में प्रदर्शित करने के लिए प्रयास करें:

Dim s As SizeF = TextRenderer.MeasureText("A", rtb.Font, rtb.Size, TextFormatFlags.WordBreak) 
Dim letterHeight As Integer = CInt(s.Height) 
Dim displayableLines As Integer = rtb.Height/letterHeight 

यह एक परीक्षण पत्र 'ए' वर्तमान में की ऊंचाई का उपयोग करता है पिक्सेल में रेखा ऊंचाई खोजने के लिए फ़ॉन्ट।

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