zoukankan      html  css  js  c++  java
  • 判断shift,ctrl,alt键是否按下

     在组件的OnKeyDown、OnKeyUp 、OnMouseDown和OnMouseUp等事件的处理过程中,有一个TShiftState类型的变量Shift ,

    TShiftState类型定义如下:

    1 type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);

    所以根据Shift的值就可以判断当键盘上的键按下时Shift 、Alt和Ctrl键的状态,或者按下鼠标左键、鼠标右键、鼠标中键、任意按键双击时的状态。

    下面的例程说明了如何检测Shift、Alt和Ctrl 键是否按下。 
        

    通过菜单File | New Application 创建一个新的工程,在窗体中添加一个StatusBar组件,并在状态栏编辑器中为其添加6 个面板。

    然后为窗体Form1添加OnKeyDown 、OnKeyUp 、OnMouseDown和OnMouseUp等事件的处理过程如下:

    OnKeyDown事件:

     1 procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 
     2 begin 
     3   if Shift>=[ssShift] then  {如果按下了Shift键则在第一个面板上显示Shift}
     4     StatusBar1.Panels[0].Text:= 'Shift'
     5 
     6   if Shift>=[ssAlt] then {如果按下了Alt键则在第二个面板上显示Alt} 
     7     StatusBar1.Panels[1].Text:= 'Alt'
     8 
     9   if Shift>=[ssCtrl] then {如果按下了C t r l 键则在第三个面板上显示Ctrl}
    10     StatusBar1.Panels[2].Text:= 'Ctrl'
    11 
    12 end;
    OnKeyUp事件:
     1 procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); 
     2 begin  
     3 {在Shift、Alt 和Ctrl键弹起时清除状态栏中相应面板上的内容 }
     4   if not(Shift>=[ssShift]) then 
     5     StatusBar1.Panels[0].Text:=' '
     6 
     7   if not(Shift>=[ssAlt]) then 
     8     StatusBar1.Panels[1].Text:=' '
     9 
    10   if not(Shift>=[ssCtrl]) then 
    11     StatusBar1.Panels[2].Text:=' '
    12 end;
    13 


    OnMouseDown事件:

     1 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer); 
     2 begin 
     3 
     4   if Shift>=[ssLeft] then  {按下了左键则在第四个面板上显示left}
     5     Statusbar1.Panels[3].Text:= 'left'
     6 
     7   if Shift>=[ssMiddle] then {如果按下了中键则在第五个面板上显示Middle}
     8     StatusBar1.Panels[4].Text:= 'Middle'
     9 
    10   if Shift>=[ssDouble] then {如果是双击则在第六个面板上显示Double }
    11     StatusBar1.Panels[5].Text:='Double'
    12 end
    13 

    OnMouseUp事件:

     1 procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer); 
     2 begin 
     3 {在鼠标按键弹起时清除状态栏中相应面板上的内容 }
     4   if not(Shift>=[ssLeft]) then  
     5     StatusBar1.Panels[3].Text:=' '
     6 
     7   if not(Shift>=[ssMiddle]) then 
     8     StatusBar1.Panels[4].Text:=' '
     9 
    10   if not(Shift>=[ssDouble]) then 
    11     StatusBar1.Panels[5].Text:=' '
    12 end

    程序运行后,读者可以尝试按下Shift、Alt 和Ctrl键,单击或双击鼠标左键、中键和右键,观察状态栏上各面板的显示。

    {★推荐:网购拿返利,购物新选择}

  • 相关阅读:
    从零开始学android开发-通过WebService获取今日天气情况
    android常见错误-E/AndroidRuntime(13678): java.lang.NoClassDefFoundError:
    java 使用相对路径读取文件
    冒泡排序
    快速排序
    为什么使用抽象类?有什么好处?
    为什么用 抽象类,接口
    String.valueOf()
    Python 资源
    文本相似度-BM25算法
  • 原文地址:https://www.cnblogs.com/dabiao/p/1665533.html
Copyright © 2011-2022 走看看