[英]How to always show underline character? (C# Windows Form)
我正在制作一個看起來像記事本的查找對話框的對話框。 我注意到記事本的“查找”對話框的下划線字符始終顯示(我必須按ALT鍵才能在我的對話框中看到此內容)。 如何始終顯示這樣的下划線字符?
我嘗試在Form_Load事件上使用SendKeys.Send(“%”)但沒有任何反應。
還有一個問題,當我在子窗體上按ALT鍵時,它也會顯示父窗體的下划線字符。 怎么避免呢?
這是Notepad的查找對話框:
我很確定這不是關於Ease of Acess中心,因為記事本的主要形式並不總是顯示這一點。
在記事本對話框中看到“查找”下划線中的n是一個故意的錯誤。 該對話框實際上不是記事本的一部分,它內置於Windows中 。 底層的winapi調用是FindText()。 該功能通常是一堆錯誤,一個核心問題是在UI處於“顯示下划線”狀態后創建新窗口無法正常工作,新窗口也不在該狀態。 據推測,故意錯誤是基於用戶有可能使用Alt鍵來顯示對話框的假設。 如果他按下Ctrl + F,那就太好了。
Windows對話框可能只是通過簡單地使用DrawText()繪制“Find”字符串並忽略DT_NOPREFIX選項來實現。 您可以使用TextRenderer.DrawText()執行相同操作,省略TextFormatFlags.HidePrefix選項。
不完全是WinFormsy,你喜歡Label控件而不是代碼。 這是可以攻擊的,你必須故意發送消息,將UI置於你自己的對話框的“show underlines”狀態。 在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: 不通過改變系統選項,如重復推薦的解決這個問題。 這是非常不合理的。
您可以使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.