簡體   English   中英

如何始終顯示下划線字符? (C#Windows表格)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM