【问题标题】:Multiline Textbox with Segoe UI font indents text带有 Segoe UI 字体缩进文本的多行文本框
【发布时间】:2017-01-21 09:25:57
【问题描述】:

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

但是,如果我创建一个多行文本框,那么它会将文本缩进几个像素。并使其与其他单行文本框不对齐,以至于看起来文本开头有一个空格。

我猜这是 MS 控件/字体的问题。

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

【问题讨论】:

    标签: .net winforms


    【解决方案1】:

    这是我以前从未注意到的,并且似乎是特定于字体的。正如您所说,使用 Sergio UI 字体时,多行文本框会添加一个左边距。

    基本的 WinForm 文本框不提供在底层本机控件上设置边距的功能,但该功能是存在的。

    下面的代码演示了如何使用编辑控件消息EM_GETMARGINSEM_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,你可以试试http://connect.microsoft.com/,但不要抱太大希望。最有可能的是,它会收到“这是设计使然”的响应,但您永远不知道。在查看 https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/TextBox.cs,577a143ad3bbfb97 的文本框代码时,我注意到有关 .Net 4.6.1 和更高版本的新功能的文档。
    • 在 4.6 中仍然是一个问题。使用 Connect (3122389) 记录。当我在 90 年代初与 IBM 打交道时,我很熟悉“这是一项功能,而不是错误”的回应:o)
    • @Gwynge,我在您的MS Connect 提交中添加了一条评论,以便向他们提供我在回答这个问题时发现的详细信息。
    猜你喜欢
    • 2012-10-22
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2021-10-10
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多