急!!!!请各位高手看看这个问题,为什么程序不能捕捉到按ESCAPE键?(0分)

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, AxCtrls, OleCtrls, VCF1, Chartfx3;

type
TForm1 = class(TForm)
Chartfx1: TChartfx;
procedure FormKeyDown(Sender: TObject
var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
procedure WMSysCommand(var Msg: TWMSysCommand);message WM_SYSCOMMAND;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
if (Msg.CmdType=SC_MAXIMIZE) then
begin
SetWindowLong(Handle,GWL_STYLE,GetWindowLong(Handle,GWL_STYLE) and not WS_CAPTION);
self.WindowState:=wsMaximized;
end
else
DefaultHandler(Msg);
Application.ProcessMessages;
end;

procedure TForm1.FormKeyDown(Sender: TObject
var Key: Word;
Shift: TShiftState);
begin
if Key=VK_ESCAPE then
begin
showmessage('Ok');
SetWindowLong(Handle,GWL_STYLE,GetWindowLong(Handle,GWL_STYLE) or WS_CAPTION);
WindowState:=wsNormal;
end;
end;

end.
[red]我已将表单的KeyPreView设置为了True,并且chartfx1的align属性值为alClient,[/red]
如果我将Chartfx1控件换成Memo控件或其他含有onkeypress的事件的控件,当表单
全屏时,按ESC键,能将表单恢复.但如果换成如chartfx1和其他不含
有onKeypress,onKeydown等事件的控件时,当按ESC键就没有用.[red]请问各位大侠,有没有
其他的方法当表单上含有chartfx1时,并且chartfx1的align属性值为alClient,
表单全屏时,按ESC键能恢复窗口大小?[/red]谢谢!
 
我处理过相关问题,以下是我的源程序:
//处理WM_KEYDOWN事件
const WM_SCKEY=WM_USER+271;
procedure AppMessage(var Msg: TMsg
var Handled: Boolean);
//快捷键处理
procedure MapKey(var Msg:TMessage);message WM_SCKEY;
procedure TFrm_Main.AppMessage(var Msg: TMsg
var Handled: Boolean);
begin
if Msg.message=WM_KEYDOWN then
PostMessage(Screen.ActiveForm .Handle,WM_SCKEY,Msg.wParam,0);
inherited;
end;
procedure TFrm_Main.MapKey(var Msg: TMessage);
//var
// FuncID:integer;
begin
//FindKeyFunc()查找快捷键功能列表
FuncID:=FindKeyFunc(Msg.WParam);
case FuncID of
//刷新
0:
begin
AI_RefreshExecute(nil);
end;
end;
end;

在以下部分加入引用:
initialization
Application.OnMessage:=Frm_Main.AppMessage;
这样就可以捕捉所有按键了

 
//处理WM_KEYDOWN事件
const WM_SCKEY=WM_USER+271
[red]为什么要加271,有什么作用呢?[/red]
procedure AppMessage(var Msg: TMsg
var Handled: Boolean);
//快捷键处理
procedure MapKey(var Msg:TMessage);message WM_SCKEY;
procedure TFrm_Main.AppMessage(var Msg: TMsg
var Handled: Boolean);
begin
if Msg.message=WM_KEYDOWN then
PostMessage(Screen.ActiveForm .Handle,WM_SCKEY,Msg.wParam,0);
inherited
[red]//这是继承父类的方法吗?[/red]
end;
procedure TFrm_Main.MapKey(var Msg: TMessage);
//var
// FuncID:integer;
begin
//FindKeyFunc()查找快捷键功能列表
FuncID:=FindKeyFunc(Msg.WParam)
[red]请问FindKeyFunc是什么函数?自定义的[/red]
case FuncID of
//刷新
0:
begin
AI_RefreshExecute(nil)
//[red]这个函数我在帮助中也没有找到,请问是什么意思?[/red]
end;
end;
end;

在以下部分加入引用:
initialization
Application.OnMessage:=Frm_Main.AppMessage;
这样就可以捕捉所有按键了
==================================================
你好!没有缺点的狼先生,上面的程序有几个地方不懂,还请您指点一下!谢谢!
 
//为什么要加271,有什么作用呢?
这是自定义消息,所有用户的自定义消息都是用 WM_USER 加上任意一个数构成的
当然你也可以改成 WM_USER + 123

//这是继承父类的方法吗?
可以这么说。

后面两个问题要作者本人回答:)
 
十分感谢!
 
后退
顶部