rtCut类型的数值赋给菜单的ShortCut属性即可。如:
procedure TForm1.BtnChange1Click(Sender: TObject);
begin
New1.ShortCut:= 32833;//就是Alt+A
end;
一个快捷键的值可以按下面的方法在设计时得到:先在
设计时改变菜单的ShortCut属性的为你需要的快捷键,然后在窗体上-> 右键-> View as Text,在DFM文件中找到那个组件,那个ShortCut后面的就是。如:需要Ctrl+Alt+N
object New1: TMenuItem
Caption = '&;New'
ShortCut = 49230 //就是这个
OnClick = New1Click
end
-- 4 动态改变菜单
就是改变菜单项的Enabled属性和Visible属性。这两个属性既可以在设计时改变,也可以在运行时改变。
如果将Enabled属性设置为False,则菜单项呈灰色状态,不可用;如果设置为True,则菜单项处于正常能用的状态。
如果将Visible属性设置为False,则该菜单项在运行时不显示;如果设置为True,则该菜单项显示。
如:New1.Enabled:=False;//New菜单项变成灰色,菜单现在不可用
New1.Enabled:=True; //New菜单项现在可以使用
New1.Visible:=False //New菜单项现在不显示
New1.Visible:=True; //New菜单项现在显示
唯一需要注意的是:Visible和Enabled属性时两个互相独立的属性,二者互不干扰,如果一个菜单拥有一个快捷键且其Enabled属性为True,即使其Visible属性为False(即运行时不可见),仍可以用快捷键来访问。
在程序运行期间,修改菜单项的这两个属性,即可以动态地改变菜单显示。
-- 5 获取用户错误按键信息
如果用户按Alt和一个与菜单项不匹配的字符时,或者当显示弹出式菜单而用户按下一个与弹出式菜单里的项不匹配的字符键时。我们怎么知道用户按错了键,又怎么知道用户按了那个键呢?
事实上,当发生上面假设的情况时,Windows会发出一个WM_MENUCHAR消息,通常我们不需要处理这个消息,Windows程序通常会把它传给DefWindowProc,它一般给Windows返回0,即使Windows发出一个短的蜂鸣声。如果我们需要处理上面假设的情况时,只要拦截这个消息就可以了。
让我们先了解一下这个消息的参数:
WM_MENUCHAR
LOWORD(wParam); //即用户按键的ASCII码
HIWORD(wParam); //选择码
lParam; // 菜单句柄
选择码含义:
0: 不显示弹出菜单;
MF_POPUP: 显示下拉菜单、子菜单、快捷菜单(弹出式菜单)
MF_SYSMENU: 显示系统弹出式菜单
消息返回值:
0: 通知Windows丢弃用户按的这个字符并发出一个短的蜂鸣声;
1: 通知Windows应该关闭当前活动菜单;
2: 通知Windows返回一个相对于菜单项的零基点的低位字,它由Windows决定。
了解这一点后,让我们具体做一下:
创建一个带有菜单的新工程,在窗体上放一个Memo组件(Name:Memo1)在窗体的公有变量后加入消息的声明部分:
public
procedure MMenuChar(var Msg:TMessage);message WM_MENUCHAR;
{ Public declarations }
end;
按Shift+Ctrl+C完