您的位置:首页 > 编程语言 > Delphi

Delphi在Image中响应键盘事件

2008-07-17 19:21 543 查看
众所周知,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控件怎么响应键盘啊??急!!

楼主sjlvhj(吻星揽月)2006-09-05 16:22:27 在 Delphi / 非技术区 提问我现在在一个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消息Top

2 楼CoolSlob()回复于 2006-09-05 16:33:50 得分 0

upTop

3 楼sjlvhj(吻星揽月)回复于 2006-09-05 16:36:15 得分 0

直接写在窗体的onKeyPress上我试了不行啊?我现在是在Image控件上又加了个Image控件,一个是作为背景,另一个才是要响应键盘信息的。 Top

4 楼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. Top

5 楼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. Top

7 楼wudi_1982(向伴水学习|胃出血,住院中)回复于 2006-09-05 16:58:18 得分 0

;//上面代码在连续操作的时候,会有闪烁,在create的时候,加上下面的内容 procedure TForm1.FormCreate(Sender: TObject); begin DoubleBuffered := true;//加上这一句。 Application.OnMessage := MyonMessage; end; end. Top

8 楼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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: