有没有办法不按ALT就强制显示助记键?
Is there a way to force mnemonic key to show out without pressing ALT?
我正在开发 WinForms 应用程序,我想使用助记键。似乎由于 Windows 参数,您可以选择在使用应用程序时仅在按下 ALT 后显示它们(此选项与默认选项类似)。多亏了这个 question(顺便说一句相关但不重复),我才知道这个选项。
我更改了这个选项,助记符下划线在开头正确显示。但我想避免用户必须打开此选项或必须按 ALT 才能看到带下划线的键。
所以我的问题是:应用程序内是否有强制助记键下划线而不更改设置或按 ALT 键的情况?
对于 MenuStrip
,您需要创建自定义渲染器以始终显示助记符,无论是否按下 Alt 键。为此,从 ToolStripProfessionalRenderer
派生并覆盖其 OnRenderItemText
,从 e.TextFormat
中删除 NoPrefix
和 HidePrefix
标志。然后为 ToolStripManager.Renderer
.
注册渲染器
对于其他控件显示助记符,您可以覆盖表单的WndProc
方法并处理WM_UPDATEUISTATE消息并将WParam
设置为UISF_HIDEACCEL
的组合作为高阶word 和 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);
}
}
我正在开发 WinForms 应用程序,我想使用助记键。似乎由于 Windows 参数,您可以选择在使用应用程序时仅在按下 ALT 后显示它们(此选项与默认选项类似)。多亏了这个 question(顺便说一句相关但不重复),我才知道这个选项。
我更改了这个选项,助记符下划线在开头正确显示。但我想避免用户必须打开此选项或必须按 ALT 才能看到带下划线的键。
所以我的问题是:应用程序内是否有强制助记键下划线而不更改设置或按 ALT 键的情况?
对于 MenuStrip
,您需要创建自定义渲染器以始终显示助记符,无论是否按下 Alt 键。为此,从 ToolStripProfessionalRenderer
派生并覆盖其 OnRenderItemText
,从 e.TextFormat
中删除 NoPrefix
和 HidePrefix
标志。然后为 ToolStripManager.Renderer
.
对于其他控件显示助记符,您可以覆盖表单的WndProc
方法并处理WM_UPDATEUISTATE消息并将WParam
设置为UISF_HIDEACCEL
的组合作为高阶word 和 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);
}
}