MDI窗体如何响应键盘事件? ( 积分: 100 )

  • 主题发起人 主题发起人 yz005ydcg
  • 开始时间 开始时间
Y

yz005ydcg

Unregistered / Unconfirmed
GUEST, unregistred user!
在delphi中普通窗体可以响应键盘事件,但将窗体改为MDI窗体后,就不能响应键盘事件了,为什么?如何解决?
 
在delphi中普通窗体可以响应键盘事件,但将窗体改为MDI窗体后,就不能响应键盘事件了,为什么?如何解决?
 
你是指将主窗体FormStyle属性设成fsMDIForm时候的情况吧,如是这样,应该是设置焦点
时屏蔽了fsMDIForm窗体的原因。我的方法如下:
利用消息处理。整个程序中,按键消息发生时,消息先传给 Application 对象统一处
理,所以可以对 Application 对象的响应方法进行一下改造以适合需要的操作。

首先,Application有个OnMessage的属性,为TMesageEvent类型方法指针:
TMessageEvent = procedure (var Msg: TMsg; var Handled: Boolean) of object;
所以,在主窗体public域中添加一个TMesageEvent类型方法DoMessage:
public
procedure DoMessage(var Msg: TMsg; var Handled: Boolean);
然后赋值给Application.OnMessage属性,则Application内部处理消息,调用
OnMessage时将调用到自定义的DoMessage方法。DoMessage方法实现为:
procedure TForm1.DoMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = WM_KEYDOWN then
begin
if Msg.wParam=Key_B //键值为'B',此处需要引用QT单元,'Key_B'在其中定义
then
showmessage('B_Down !');
end;
end;
这样,主窗体FormStyle为fsMDIForm,程序运行后,当'B'字母键被按下时,会
showmessage('B_Down !');

>>
以上为只有一个主窗体时的处理,如果还有一个子窗体,则DoMessage中要另加一些
处理。供参考。
<<
 
主窗体上放一个ActionList来用就可以了
 

Similar threads

后退
顶部