2015-07-20 137 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