我已将Windows Forms .Net应用程序从默认的MS Sans Serif 8.25字体升级为使用Segoe UI 8.25,因为这样更容易在眼睛上看起来似乎是MS自己使用的。
但是,如果我将文本框设为多行,则会将文本缩进几个像素。并使其与其他单行文本框不对齐,直到文本开头看起来有空格。
我猜这是MS控件/字体的错误。
有解决方法吗?这是.Net 4.5.2(及更早版本)
答案 0 :(得分: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参数,则边距可以基于字体度量。这可能是观察到的行为的原因。