Есть ли способ заставить мнемонический ключ показываться без нажатия ALT? - PullRequest
0 голосов
/ 15 февраля 2019

Я работаю над приложением WinForms и хочу использовать ключ мнемоники.Похоже, что из-за параметра Windows вы можете выбрать их показ при использовании приложения только после нажатия ALT (эта опция по умолчанию).Я узнал об этой опции благодаря этому вопросу (кстати, связан, но не дублирован).

Я изменил эту опцию, и подчеркивание мнемоники правильно отображается в начале.Но я бы хотел, чтобы пользователям не приходилось либо включать эту опцию, либо нажимать ALT, чтобы увидеть подчеркнутые клавиши.

Так что мой вопрос: Есть ли в приложении принудительное принудительное применение?подчеркивание мнемонической клавиши без изменения настроек или нажатия ALT?

1 Ответ

0 голосов
/ 15 февраля 2019

Для MenuStrip вам необходимо создать пользовательский рендерер, чтобы всегда отображать мнемонику независимо от того, нажимаете или не нажимаете клавишу Alt .Для этого необходимо извлечь из ToolStripProfessionalRenderer и переопределить его OnRenderItemText, удалив флаги NoPrefix и HidePrefix из e.TextFormat.Затем зарегистрируйте средство визуализации для ToolStripManager.Renderer.

. Чтобы другие элементы управления отображали мнемонику, вы можете переопределить WndProc метод формы и обработать сообщение WM_UPDATEUISTATE и установить для WParam значениекомбинация UISF_HIDEACCEL как старшего слова и UIS_CLEAR как старшего слова.Таким образом, все элементы управления будут отображать мнемоническое подчеркивание.

Пример

Просто скопируйте и вставьте следующий код в форму и запустите приложение.Форма будет отображать подчеркивания для всех мнемоник без необходимости нажимать Alt :

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
const int WM_UPDATEUISTATE = 0x0128;
const int UISF_HIDEACCEL = 0x2;
const int UIS_CLEAR = 0x2;
protected override void OnShown(EventArgs e)
{
    base.OnShown(e);
    ToolStripManager.Renderer = new MyRenderer();
}
protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_UPDATEUISTATE)
        m.WParam = (IntPtr)((UISF_HIDEACCEL & 0x0000FFFF) | (UIS_CLEAR << 16));
    base.WndProc(ref m);
}
public class MyRenderer : ToolStripProfessionalRenderer
{
    protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
    {
        e.TextFormat &= ~TextFormatFlags.NoPrefix;
        e.TextFormat &= ~TextFormatFlags.HidePrefix;
        base.OnRenderItemText(e);
    }
}

enter image description here

...