c# - 如何始终显示下划线字符? (C# Windows 窗体)

标签 c# winforms underline

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

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

还有一个问题,当我在子窗体上按ALT键时,它也显示父窗体的下划线字符。如何避免这种情况?

这是记事本查找对话框的截图: enter image description here

我很确定这与轻松访问中心无关,因为记事本的主窗体并不总是显示这一点。

最佳答案

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

Windows 对话框可能通过简单地使用 DrawText() 绘制“查找”字符串并省略 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);

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

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

关于c# - 如何始终显示下划线字符? (C# Windows 窗体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31510820/

相关文章:

css - 如何给图片添加文字装饰?

linux - 强调用户输入

android - 在编辑 TextView 中编辑特定单词时如何删除底层线

c# - VS2010添加.dll引用错误

winforms - 如何在Windows窗体中检查单选按钮是否被选中

c# - 加密/解密数据到数据库

winforms - 使用 Windows 窗体创建棋盘

c# - 具有依赖注入(inject)的 WinForms MVC

c# - 在 Unity 独立构建中获取构建日期

c# - 如何读取屏幕分辨率 - 并更改此分辨率?