我已將Windows Forms .Net應用程序從默認的MS Sans Serif 8.25字體升級到改爲使用Segoe UI 8.25,因爲這更容易在眼睛上,似乎是MS自己使用的。多行文本框與Segoe UI字體縮進文本
但是,如果我製作一個文本框多行,那麼它縮進幾個像素的文本。並使其與其他單行文本框不對齊,直到它看起來在文本開頭處有一個空格。
我猜這是MS控件/字體的錯。
是否有解決方法?這是.Net 4.5.2(和更舊的版本)
我已將Windows Forms .Net應用程序從默認的MS Sans Serif 8.25字體升級到改爲使用Segoe UI 8.25,因爲這更容易在眼睛上,似乎是MS自己使用的。多行文本框與Segoe UI字體縮進文本
但是,如果我製作一個文本框多行,那麼它縮進幾個像素的文本。並使其與其他單行文本框不對齊,直到它看起來在文本開頭處有一個空格。
我猜這是MS控件/字體的錯。
是否有解決方法?這是.Net 4.5.2(和更舊的版本)
這是我以前從未注意過的東西,看起來是字體特定的。如您所述,在使用Sergio UI字體時,爲多行文本框添加了左邊距。
基本WinForm文本框沒有公開在底層本地控件上設置邊距的功能,但功能在那裏。
下面的代碼演示瞭如何使用編輯控制消息EM_GETMARGINS和EM_SETMARGINS來檢索和設置左邊距。
對於那些有興趣的人,使用帶有Sergio UI字體的多行文本框的默認左邊距爲5,而單行文本框的左邊距爲零。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Const EC_LEFTMARGIN As Int32 = 1
Const EM_SETMARGINS As Int32 = &HD3
Const EM_GETMARGINS As Int32 = &HD4
Dim res As Int32 = SendMessage(New HandleRef(Me, tbSingleLine.Handle), EM_GETMARGINS, 0, 0)
Dim leftMargin As Int32 = res And &HFFFF
SendMessage(New HandleRef(Me, tbMultiline.Handle), EM_SETMARGINS, EC_LEFTMARGIN, leftMargin)
End Sub
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Public Shared Function SendMessage(ByVal hWnd As HandleRef, ByVal msg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32
End Function
編輯:基於用於EM_SETMARGINS的文檔上,邊緣可以如果使用EC_USEFONTINFO參數可以基於字體規格。這可能是觀察到的行爲的原因。
鑑於這是一個錯誤的MS控制是否有任何有效的報告方式,它將永遠是固定的? – Gwynge
@Gwynge,你可以嘗試[http://connect.microsoft.com/](http://ttp.connect.microsoft.com/),但不要讓你的希望上升。最有可能的是,它會收到「這是設計」的迴應,但你永遠不知道。在[https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/TextBox.cs,577a143ad3bbfb97](https://referencesource.microsoft.com/#)上查看文本框代碼System.Windows.Forms/winforms/Managed/System/WinForms/TextBox.cs,577a143ad3bbfb97),我注意到有關.Net 4.6.1和更新版本新功能的文檔。 – TnTinMn
仍然是4.6中的一個問題。使用Connect登錄(3122389)。我熟悉90年代早期與IBM打交道時的「這是一個功能,而不是bug」的反應:o) – Gwynge