2015-07-20 133 views
5

我正在做一个对话框,看起来像记事本的查找对话框。我注意到记事本的查找对话框的下划线字符总是显示所有的时间(我必须按下ALT键才能用我的对话框查看)。如何总是显示这样的下划线字符?如何始终显示下划线字符? (C#Windows窗体)

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

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

这是记事本的查找对话框中撷取画面: enter image description here

我敢肯定这是不是接取中心轻松,因为记事本的主要形式并不总是表现出这一点。

+1

你已经试过了吗?请添加您的代码... – Fabjan

+0

Form_Load上的SendKeys.Send(“%”)除外。知道我在控件的文本中使用了'&' - 无论如何,他们有没有机会使用背景图片呢? – Ryan

回答

1

眼看n的“查找”,在记事本对话框下划线表示有意的错误。该对话框实际上并不是记事本的一部分,它建立了into Windows。底层的winapi调用是FindText()。该功能通常是一堆“臭虫”,一个核心问题是,在将UI放入“show underlines”状态后,创建新窗口不能正常工作,该新窗口不处于该状态。据推测,故意的错误是基于这样的假设,即用户有可能使用Alt键来显示对话框。 Yuck如果他按下Ctrl + F。

Windows对话框可能只需用DrawText()函数绘制“Find”字符串并省略DT_NOPREFIX选项即可。你可以用TextRenderer.DrawText()做同样的事,省略TextFormatFlags.HidePrefix选项。

不完全是WinFormsy,你会喜欢Label控件而不是代码。这是可以破解的,你必须有意地发送消息,让用户界面进入你的对话框的“显示下划线”状态。在为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:do 不是通过按照建议的副本更改系统选项来解决此问题。这是非常不合理的。

+0

我在链接中发现了相同的答案,其中重复给定的链接http://stackoverflow.com/questions/14054036/show-hotkeys-at-all -times/14054492#14054492。链接中的答案使用Form_Paint事件而不是OnHadleCreated。所以我想你的答案更好,因为Form_Paint被调用了很多时间,对吗? - 我可以问为什么当我按Alt键在子窗体上时,父窗体的MenuStrip显示访问键(下划线字符)? – Ryan

+1

对,使用Paint绝对是这样做的错误方法。按ALT应该将*整个* UI置于“显示下划线”状态,因此为所有活动窗体启用它是正常的。我知道,没有多大意义。 –

+0

我纠正自己。你的似乎并没有工作:(我在Paint事件上做得很好,但为了避免被多次调用,我在Paint事件中添加了这个'Form.Paint - = new PaintEventHandler(this.Form_Paint);' - 用ALT问题,你是否有任何想法来解决这个问题? – Ryan

0

您可以使用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 
+0

不是我真正想要的。我终于在@Luaan给出的链接中找到了答案,但无论如何谢谢 – Ryan