【问题标题】:How to always show underline character? (C# Windows Form)如何始终显示下划线字符? (C# Windows 窗体)
【发布时间】:2015-07-20 07:23:51
【问题描述】:

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

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

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

这是记事本查找对话框的截图:

我很确定这与 Ease of Access Center 无关,因为记事本的主窗体并不总是显示此内容。

【问题讨论】:

  • 你已经尝试了什么?请添加您的代码...
  • Form_Load 中只有 SendKeys.Send("%")。知道我在控件的文本中使用了 '&' - 无论如何,他们有没有机会为此使用背景图片?

标签: c# winforms underline


【解决方案1】:

在记事本对话框中看到“查找”中带下划线的 n 是一个故意的错误。该对话框实际上不是记事本的一部分,它构建了into Windows。底层的 winapi 调用是 FindText()。该功能通常是一堆'o错误,一个核心问题是在将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:not 按照副本中的建议更改系统选项来解决此问题。太不合理了。

【讨论】:

  • 我在链接中找到了完全相同的答案,该链接中的重复项给出了stackoverflow.com/questions/14054036/show-hotkeys-at-all-times/…。链接中的答案使用 Form_Paint 事件而不是 OnHadleCreated。所以我想你的答案更好,因为 Form_Paint 被调用了很多时间,对吗? - 请问为什么在子Form上按ALT键时,父Form的MenuStrip会显示访问键(下划线字符)?
  • 对,使用 Paint 绝对是错误的做法。按 ALT 应该将 整个 UI 置于“显示下划线”状态,因此为所有活动表单打开它是正常的。我知道,没有多大意义。
  • 我更正了自己。你的似乎不起作用:( - 我在 Paint 事件中做得很好,但为了避免被多次调用,我在 Paint 事件中添加了这个 Form.Paint -= new PaintEventHandler(this.Form_Paint); - 对于 ALT 问题,你有什么想法来解决这个问题吗?
  • 我发布了经过测试的代码,我不知道为什么它不适合你。除了显而易见的之外,没有使我的 sn-p 适应您想要用下划线显示的实际控件。
  • 嗯,很奇怪。我什至将您的代码粘贴到我的代码中。我认为操作系统或编译器可能是这里的问题,但无论如何谢谢
【解决方案2】:

您可以为此使用 RichTextBox 控件和扩展方法:

public static class FontHelper
{
    public static void Underline(this RichTextBox txtBox, int underlineStart, int length)
    {
        if (underlineStart > 0)
        {
            txtBox.SelectionStart = underlineStart;
            txtBox.SelectionLength = length;
            txtBox.SelectionFont = new Font(txtBox.SelectionFont, FontStyle.Underline);
            txtBox.SelectionLength = 0;
        }
    }        
}

richTextBox1.Text = "Search for";
richTextBox1.Underline(7, 1);   // index and length of underlying text

【讨论】:

  • 不是我想要的。我终于在@Luaan 给出的链接中找到了答案,但还是谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
相关资源
最近更新 更多