Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 带有Segoe UI字体的多行文本框缩进文本_.net_Winforms - Fatal编程技术网

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

.net 带有Segoe UI字体的多行文本框缩进文本,.net,winforms,.net,Winforms,我已经将我的Windows Forms.Net应用程序从默认的MS Sans Serif 8.25字体升级为使用Segoe UI 8.25字体,因为这看起来更容易看,而且似乎是MS自己使用的 但是,如果我使文本框多行,那么它会将文本缩进几个像素。并使其与其他单行文本框不对齐,以至于看起来文本开头有一个空格 我猜这是MS控件/字体的错误 有解决办法吗?这是.Net 4.5.2(及更高版本)这是我以前从未注意到的,而且似乎是特定于字体的。如前所述,在使用Sergio UI字体时,多行文本框添加了一个

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

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

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


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

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

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

下面的代码演示了如何使用编辑控制消息来检索和设置左边距

对于那些感兴趣的人来说,使用带有Sergio UI字体的多行文本框的默认左边距为5,而单行文本框的左边距为0

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
Private子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
常量EC_左边距为Int32=1
常量EM_SETMARGINS为Int32=&HD3
常量EM_GETMARGINS为Int32=&HD4
Dim res As Int32=SendMessage(新HandleRef(Me,tbSingleLine.Handle),EM_GETMARGINS,0,0)
将左边距调整为Int32=res和&HFFFF
SendMessage(新HandleRef(Me,tbMultiline.Handle),EM_setmargin,EC_LEFTMARGIN,LEFTMARGIN)
端接头
_
公共共享函数SendMessage(ByVal hWnd作为HandleRef,ByVal msg作为Int32,ByVal wParam作为Int32,ByVal lParam作为Int32)作为Int32
端函数


编辑:根据EM_SetMargins的文档,如果使用了EC_USEFONTINFO参数,则边距可以基于字体度量。这可能是观察到的行为的原因。

鉴于这是一个有故障的MS控件,是否有任何有效的报告方法来修复它?@Gwynge,你可以试试,但不要抱太大希望。最有可能的是,它会收到一个“这是设计的”响应,但你永远不知道。在查看上的文本框代码时,我注意到有关.NET4.6.1及更新版本的新功能的文档。在4.6中仍然是一个问题。使用Connect(312289)记录。我熟悉“这是一个特性,而不是一个bug”的回答,因为我在90年代初与IBM打过交道:o)@Gwynge,我在您的提交中添加了一条评论,向他们提供了我在回答这个问题时发现的详细信息。