Delphi在Image中响应键盘事件

来源:互联网 发布:电脑软件没了 编辑:程序博客网 时间:2024/05/16 15:17

 众所周知,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; 

 

原创粉丝点击