Delphi的TMainMenu构件没有提供很丰富的事件处理,这给程序设计带来了一些不便。例如,在一个文本编辑器程序中,可能需要随时侦测系统的剪帖板是否有数据,如果有则将主菜单的Paste条目设为Enabled,反之设为Disabled。检测剪帖板是否有内容的代码应该在用户选取菜单时立即执行,可惜Delphi并未提供相应的事件。
当用户选取菜单时,Windows会向程序发送WM_INITMENU消息,因此可在MainForm中加入处理WM_INITMENU消息的过程,示例如下:
首先在MainForm声明的private段中加入如下声明
procedure WMInitMenu(var msg: TMessage); message WM_INITMENU;
WMInitMenu消息处理过程的代码如下:
procedure TMainForm.WMInitMenu(var msg: TMessage);
begin
if msg.WParam=GetMenu(Handle) then begin
EditPasteItem.Enabled := Clipboard.HasFormat(CF_OEMTEXT);
end else inherited;
end;
在上例中,当用户选取菜单时,WMInitMenu立刻获得控制权,并根据剪帖板中是否有文本内容来决定Paste菜单条目的Enabled属性值。注意,无论是在MDI程序还是在非MDI程序中,处理WM_INITMENU消息的过程都应该放在MainForm中。