我已經擴展了RichTextBox控件來實現原生RichEdit類中提供的許多缺少的功能。RichTextBox:如何確定文本是否超出控件邊界?
我運行到哪裏,如果控制設置換行到窗口或換到打印機的水平滾動條出現,即使它不應該當控制調整大小的問題。
騎自行車的換行無法比擬和背部可能會解決問題,但包裹到打印機時,可以相對慢(即:速度過慢對每一個Resize事件調用)。
這裏是我的換行代碼:
private void ChangeWordWrap(WordWrap wordWrap)
{
switch (wordWrap)
{
case WordWrap.NoWrap:
{
User32.SendMessage(_RichTextBox.Handle, ApiConstants.EM_SETTARGETDEVICE, 0, 1);
break;
}
case WordWrap.WrapToPrintDocument:
{
using (Graphics g = PrintDocument.PrinterSettings.CreateMeasurementGraphics(PrintDocument.DefaultPageSettings))
{
int lParam = ConvertEx.HundredthInchToTwips((PrintDocument.DefaultPageSettings.Bounds.Width - PrintDocument.DefaultPageSettings.Margins.Left - PrintDocument.DefaultPageSettings.Margins.Right));
IntPtr wParam = g.GetHdc();
User32.SendMessage(_RichTextBox.Handle, ApiConstants.EM_SETTARGETDEVICE, wParam, lParam);
g.ReleaseHdc();
}
break;
}
case WordWrap.WrapToControl:
{
User32.SendMessage(_RichTextBox.Handle, ApiConstants.EM_SETTARGETDEVICE, 0, 0);
break;
}
}
}
Originially我想這個問題可能與這樣的事實,我釋放了圖形處理,但是當我在包裝的控制和無柄也出現問題是必要的。
添加截圖:
正確的行爲:
不正確的行爲(調整形式非常後小幅):
環繞到窗口/無包裝代碼來自評論在http://msdn.microsoft.com/en-us/library/bb774282(VS.85).aspx
調用:: SendMessage消息(HWND,EM_SETTARGETDEVICE,NULL,0),將文本換行到窗口,並:: SendMessage消息(HWND,EM_SETTARGETDEVICE,NULL ,1)將完全禁用自動換行。我不確定這是否記錄在其他地方。
我的P/Invoke:
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
相關常量:
public const int WM_USER = 0x400;
public const int EM_SETTARGETDEVICE = (WM_USER + 72);
編輯:
我一直在研究這個更多,我相信.NET RichTextBox控件當控件調整大小時,可能會發送帶有錯誤值的SetScrollRange()。這是有道理的,因爲它不一定知道EM_SETTARGETDEVICE消息。
我可能在調整大小後執行SetScrollRange()或類似的東西,但我的問題是我不知道什麼是正確的值,或者我怎麼可以去弄清楚。
我注意到另一件事是,當這個問題是存在的,我可以調整控件的大小實際上換行。在這一點上,滾動條返回到功能狀態,我可以調整大小,直到單詞換行循環到無和返回。
編輯:(也是我下面的非功能性的回答一些更詳細)
看起來EM_GETRECT是不是我真正想要的,因爲它的大小變化的時候,控制大小的變化。這裏的MSDN描述:
EM_GETRECT消息
獲取編輯控件的格式化矩形。格式化矩形是控件繪製文本的限制矩形。限制矩形與編輯控制窗口的大小無關。您可以將此消息發送到編輯控件或豐富的編輯控件。
我最初的理解是,這是整個文本的矩形,我可以確定客戶端窗口是否小於格式化矩形,因此應該顯示滾動條。
看起來這個格式化矩形的真正目的是使文本顯示在小於編輯控件(即:邊距)的區域中。
新問題:
那麼,有沒有一個矩形,這就是我想EM_GETRECT會給我?一個矩形會告訴我文本有多寬(包括屏幕上的部分)是多少?例如,如果我有一個400px的控件和一行800px長的文本,我想獲得800px的值,所以我可以比較它來控制寬度並顯示/不顯示滾動條。
其實我不在乎關閉控制文本的長度,因爲我關心的知道IF文本超出了控件的範圍。
感謝所有幫助到目前爲止。
我的屏幕截圖不能很好地表現出來,但除了顯示在標尺欄中的RTF縮進外,還有一個指定給RichEdit控件的打印機頁面寬度。 – 2009-12-13 15:42:34