这是我以前从未注意到的,并且似乎是特定于字体的。正如您所说,使用 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 参数,边距可以基于字体度量。这可能是观察到的行为的原因。