C 檢測RichTextBox 實際行數

2021-08-10 17:04:28 字數 1993 閱讀 1822

碰到的問題

我們的程式需要做文字的行數控制,也就是當文字輸入至指定行數時,再增加行數就會出現警告,不能再進行輸入了。

最初的解決方法:

因為richtextbox本身帶有lines屬性,所以開始的時候打算直接採用這個屬性,然後在textchanged事件中進行行數控制。但是實際執行時發現這種方法不行。

msdn上對lines屬性的備註中有如下解釋:

該陣列中的每個元素成為文字框控制項中的一行文字。如果文字框控制項的

multiline

屬性設定為

true

,並且文字中出現換行符,則換行符後的文字被新增到該陣列的乙個新元素中,並顯示在另一行上。

根據這個說明,如果使用者一直輸入文字,不主動輸入回車符,則到控制項最右邊時控制項會自動換行,但是它並不會把換行符後的文字被新增到該陣列的乙個新元素中,也就是說lines屬性的count值不會變。如下圖所示:

其實我想得到的值是4而不是1。

想到的解決方法1:

查閱msdn,graphic類中的measurestring方法可以測量文字的行數,函式原型如下:

c#public sizef measurestring(

string text,

font font,

sizef layoutarea,

stringformat stringformat,

out int charactersfitted,

out int linesfilled)

各個引數的意義可以查閱msdn,最後乙個引數的值就是我們想要的結果。
linesfilled
型別:system.int32

字串中的文字行數。

上圖中的實際行數值就是用這種方法測量的。

這種方法實際執行時也有不准的時候,下圖所示,原因如下(measurestring的備註):

measurestring 方法旨在與個別字串一起使用,它在字串前後包括少量額外的空格供突出的標誌符號使用。另外,drawstring 方法會調整標誌符號鎊值以優化顯示質量,它顯示的字串可能比 measurestring 報告的窄。若要獲得適合布局中相鄰字串的度量值(例如,實現格式化文字時),請使用 measurecharacterranges 方法或者使用帶有 stringformat 的 measurestring 方法中的一種,然後傳遞 generictypographic。同樣,請確保 graphics 的 textrenderinghint 是 antialias。

想到的解決方法2:

richtextbox控制項有getcharindexfromposition函式,可以根據乙個位置獲取位置所在字元序號,可以偽造位置資訊,從第一行開始計算位置所在的字元序號,判斷是否是文字的最後乙個字元,。不過這種方法在一行字元輸入滿,再輸乙個就自動換行後,得到的行數也不準確,不過還是比想到的解決方法1要準確些。

想到的解決方法3:

自己計算每個字元的寬度,然後計算換行,這種方法應該是最準確的 。

c 寫帶行號的richTextBox

基本思路 在 usercontrol 元件中分別放乙個 panel 和richtextbox 兩者均高度相等,無 border 且頂端對齊,完全填充 usercontrol 的client介面 計算得到 richtextbox 的當前顯示文字的開始行座標 crntfirstposk 開始行號 crn...

C 怎樣獲得richTextBox的行數

richtextbox.lines.length做了個程式,用了個richtextbox 來記錄程式的日誌,每條操作記錄放在單獨的一行,但隨著記錄的增加,記憶體使用也增加。現在想只保留最後的n條記錄在richtextbox 中 if richtextbox1.lines.length 3 strin...

C 為RichTextBox控制項新增行號

寫過程式的人應該不會對richtextbox感到陌生,與textbox相比,它封裝了更豐富的物件,使你的程式使用起來更加方便。但是它也有美中不足的地方。比如說沒有行號,滾動條滾動進度無法控制等一系列的問題。今天,就據我所熟悉的,向大家介紹介紹.希望達到拋磚引玉的效果,有不足的地方,還請大家積極指出來...