众所周知,Delphi中的Image是没有键盘事件的,但是在很多应用程序中(特别是个人版的桌面软件),对界面美观要求比较高的,都会使用图片来做UI,这样就直接把Form给覆盖住了。但同时我们又希望能使用F1来显示帮助、或者使用回车/空格来按下一个图片按钮。可是,Image却偏偏没有键盘事件,那我们怎么办呢?
其实Image没有键盘事件,也没有关系的。我们同样用Form的OnKeyDown事件中来接收键盘事件。不过注意:1). 不能实现Form的OnKeyPress事件,否则将会产生冲突,而无法响应键盘事件。2). 需要设置Form的KeyPreview属性为False,以保证不只接收Form的键盘事件。例如:
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = VK_F1 then LblBtnHelpClick(Sender); // 打开帮助文件 end;
不过有些要求比较高的,比如在图片上还有图片,然后要响应最上面的图片的键盘事件,CSDN上有人给出了参考,我不过我自己没有试过,不知是否可以。
===================================================================
以下来自:http://topic.csdn.net/t/20060905/16/5000252.html
===================================================================
delphi里的IMAGE控件怎么响应键盘啊??急!!
我现在在一个delphi窗体上覆盖了一个Image控件,可是Image控件的事件里没有键盘的响应函数,不知道压哦怎么解决,希望大虾们赐教啊!! 问题点数:20、回复次数:8Top
1 楼wudi_1982(向伴水学习|胃出血,住院中)回复于 2006-09-05 16:31:29 得分 0
直接写再窗体的onKeyPress上
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
ShowMessage('on key press'+key);
end;
或者截获wm_keydown消息Top2 楼CoolSlob()回复于 2006-09-05 16:33:50 得分 0
upTop
3 楼sjlvhj(吻星揽月)回复于 2006-09-05 16:36:15 得分 0
直接写在窗体的onKeyPress上我试了不行啊?我现在是在Image控件上又加了个Image控件,一个是作为背景,另一个才是要响应键盘信息的。
Top4 楼wudi_1982(向伴水学习|胃出血,住院中)回复于 2006-09-05 16:43:58 得分 0
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure MyonMessage(var Msg: tagMSG;
var Handled: Boolean);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.MyonMessage(var Msg: tagMSG; var Handled: Boolean);
begin
if msg.message = WM_KEYDOWN then
Caption := 'OnKeyDown:'+chr(msg.wParam)+':'+inttostr(Msg.wParam);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := MyonMessage;
end;
end.
Top5 楼sjlvhj(吻星揽月)回复于 2006-09-05 16:49:05 得分 0
我是想按一下向左健能使Image控件向左移动一下,实现微调功能,这样的话哪里去触发这个事件呢??上面的大虾好象不能解决吧??!!Top
6 楼wudi_1982(向伴水学习|胃出血,住院中)回复于 2006-09-05 16:53:54 得分 20
我是想按一下向左健能使Image控件向左移动一下,实现微调功能
把上面代码稍微改一下就可以了。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure MyonMessage(var Msg: tagMSG;
var Handled: Boolean);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.MyonMessage(var Msg: tagMSG; var Handled: Boolean);
begin
if (msg.message = WM_KEYDOWN) then
begin
case Msg.wParam of
VK_LEFT : Image2.Left := Image2.Left-1;
VK_RIGHT : Image2.Left := Image2.Left+1;
end;
end;
// Caption := 'OnKeyDown:'+chr(msg.wParam)+':'+inttostr(Msg.wParam);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := MyonMessage;
end;
end.
Top7 楼wudi_1982(向伴水学习|胃出血,住院中)回复于 2006-09-05 16:58:18 得分 0
;//上面代码在连续操作的时候,会有闪烁,在create的时候,加上下面的内容
procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered := true;//加上这一句。
Application.OnMessage := MyonMessage;
end;
end.
Top8 楼sjlvhj(吻星揽月)回复于 2006-09-05 17:32:39 得分 0
谢谢!
================================================
最后,附上键盘的键值:
================================================
VK_LBUTTON = 1;
VK_RBUTTON = 2;
VK_CANCEL = 3;
VK_MBUTTON = 4;
VK_BACK = 8;
VK_TAB = 9;
VK_CLEAR = 12;
VK_RETURN = 13;
VK_SHIFT = $10;
VK_CONTROL = 17;
VK_MENU = 18;
VK_PAUSE = 19;
VK_CAPITAL = 20;
VK_ESCAPE = 27;
VK_SPACE = $20;
VK_PRIOR = 33;
VK_NEXT = 34;
VK_END = 35;
VK_HOME = 36;
VK_LEFT = 37;
VK_UP = 38;
VK_RIGHT = 39;
VK_DOWN = 40;
VK_SELECT = 41;
VK_PRINT = 42;
VK_EXECUTE = 43;
VK_SNAPSHOT = 44;
VK_INSERT = 45;
VK_DELETE = 46;
VK_HELP = 47;
{ VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }
{ VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }
VK_LWIN = 91;
VK_RWIN = 92;
VK_APPS = 93;
VK_NUMPAD0 = 96;
VK_NUMPAD1 = 97;
VK_NUMPAD2 = 98;
VK_NUMPAD3 = 99;
VK_NUMPAD4 = 100;
VK_NUMPAD5 = 101;
VK_NUMPAD6 = 102;
VK_NUMPAD7 = 103;
VK_NUMPAD8 = 104;
VK_NUMPAD9 = 105;
VK_MULTIPLY = 106;
VK_ADD = 107;
VK_SEPARATOR = 108;
VK_SUBTRACT = 109;
VK_DECIMAL = 110;
VK_DIVIDE = 111;
VK_F1 = 112;
VK_F2 = 113;
VK_F3 = 114;
VK_F4 = 115;
VK_F5 = 116;
VK_F6 = 117;
VK_F7 = 118;
VK_F8 = 119;
VK_F9 = 120;
VK_F10 = 121;
VK_F11 = 122;
VK_F12 = 123;
VK_F13 = 124;
VK_F14 = 125;
VK_F15 = 126;
VK_F16 = 127;
VK_F17 = 128;
VK_F18 = 129;
VK_F19 = 130;
VK_F20 = 131;
VK_F21 = 132;
VK_F22 = 133;
VK_F23 = 134;
VK_F24 = 135;
VK_NUMLOCK = 144;
VK_LSHIFT = 160;
VK_RSHIFT = 161;
VK_LCONTROL = 162;
VK_RCONTROL = 163;
VK_LMENU = 164;
VK_RMENU = 165;
VK_PROCESSKEY = 229;
VK_ATTN = 246;
VK_CRSEL = 247;
VK_EXSEL = 248;
VK_EREOF = 249;
VK_PLAY = 250;
VK_ZOOM = 251;
VK_NONAME = 252;
VK_PA1 = 253;
VK_OEM_CLEAR = 254;