2010-08-16 22 views
0

我創建了一個用於在RichTextBox中進行搜索的無模式查找對話框,並且在找到的文本被選中後無法定位查找對話框,以致它沒有覆蓋所選文本。我曾嘗試使用來獲得相對於客戶區的行號以下內容:如何將查找對話框定位爲不覆蓋找到的文本?

this.lineCount = this.rtb.Height/(this.rtb.Font.Height+2); 

rtb.Select(rtbIndex, searchText.Length); 

int linePos = (this.rtb.GetLineFromCharIndex(this.rtb.GetFirstCharIndexOfCurrentLine())) % this.lineCount; 

if(linePos<(this.lineCount/2)) 
{ 
    this.Location = rtb.PointToScreen(new Point(rtb.Bounds.Left, rtb.Bounds.Bottom - this.Height)); 
} 
else 
{ 
    this.Location = rtb.PointToScreen(new Point(rtb.Bounds.Left, rtb.Bounds.Top)); 
} 

this.lineCount是適合基於字體高度和RichTextBox的高度客戶區的行數。這是我已經驗證的準確值。如果lineNum小於this.lineCount的一半,我的代碼將查找對話框定位在richtextbox的底部,否則在頂部

Hoewever,linePos不可靠。當選定文本的行是第19行,lineCount是20時,它有時會有一個零值,所以對話框會移到選定的文本上。因此,它不能可靠地計算richtextbox顯示選定文本的位置。

+0

你有很好的答案,但沒有關閉你的線程得到它。你需要的東西? – 2010-08-18 21:38:16

回答

1

你並不需要自己計算的字符位置,你可以使用GetPositionFromCharIndex方法

+0

但這並不能幫助定位對話框,因此它不會覆蓋選定的文本,因爲它從RTB文本的開頭給出了絕對位置,而不是相對於顯示的文本,這是我所需要的。 – 2010-08-16 22:22:08

+0

@bill,我不確定你到底發生了什麼。無論滾動位置如何,GetPositionFromCharIndex都返回相對於RTB左上角的座標。 (我通過在Win7上創建一個針對.Net 2.0的VS 2010 WinForms項目進行了雙重檢查。) – 2010-08-17 00:15:55