带有Segoe UI字体的多行文本框缩进文本

时间:2017-01-20 22:34:10

标签: .net winforms

我已将Windows Forms .Net应用程序从默认的MS Sans Serif 8.25字体升级为使用Segoe UI 8.25,因为这样更容易在眼睛上看起来似乎是MS自己使用的。

但是,如果我将文本框设为多行,则会将文本缩进几个像素。并使其与其他单行文本框不对齐,直到文本开头看起来有空格。

我猜这是MS控件/字体的错误。

有解决方法吗?这是.Net 4.5.2(及更早版本)

1 个答案:

答案 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参数,则边距可以基于字体度量。这可能是观察到的行为的原因。