如何始终显示下划线字符?(C#Windows表格)

Rya*_*yan 5 c# underline winforms

我正在制作一个看起来像记事本的查找对话框的对话框.我注意到记事本的"查找"对话框的下划线字符始终显示(我必须按ALT键才能在我的对话框中看到这一点).如何始终显示这样的下划线字符?

我尝试在Form_Load事件上使用SendKeys.Send("%")但没有任何反应.

还有一个问题,当我在子窗体上按ALT键时,它也会显示父窗体的下划线字符.怎么避免呢?

这是Notepad的查找对话框: 在此输入图像描述

我很确定这不是关于Ease of Acess中心,因为记事本的主要形式并不总是显示这一点.

Han*_*ant 2

在记事本对话框中看到“查找”中的 n 带下划线是一个故意的错误。该对话框实际上并不是记事本的一部分,它内置于 Windows 中。底层的 winapi 调用是 FindText()。该功能总体上是一堆错误,一个核心问题是,在 UI 置于“显示下划线”状态后创建新窗口无法正常工作,该新窗口也不处于该状态。据推测,故意的错误是基于用户可能会使用 Alt 键来显示对话框的假设。如果他按下 Ctrl+F,那可就糟糕了。

Windows 对话框可能通过简单地使用 DrawText() 绘制“Find”字符串并省略 DT_NOPREFIX 选项来完成此操作。您可以对 TextRenderer.DrawText() 执行相同的操作,省略 TextFormatFlags.HidePrefix 选项。

不完全是 WinFormsy,您更喜欢 Label 控件而不是代码。它是可破解的,您必须有意发送将 UI 置于您自己的对话框的“显示下划线”状态的消息。在 OnHandleCreated() 方法的重写中执行此操作:

    protected override void OnHandleCreated(EventArgs e) {
        const int WM_UPDATEUISTATE = 0x0128;
        base.OnHandleCreated(e);
        SendMessage(this.label1.Handle, WM_UPDATEUISTATE, new IntPtr(0x30002), IntPtr.Zero);
    }
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
Run Code Online (Sandbox Code Playgroud)

其中“label1”是您要显示下划线的控件。对其他控件(如果有)重复此操作。它应该通过将消息发送到表单来工作,这不起作用是一堆错误的一部分。恶心。

Fwiw:不要按照副本中的建议通过更改系统选项来解决此问题。这是非常不合理的。