• TMainMenu 类[五] 快捷键的记录方式


    我们从 Form 的源码中看到, 指定的快捷键是一个数字, 譬如 Ctrl+A, 对应着数字: 16449
    其实这是一个 Word 类型的数字; 快捷键的参数是 TShortCut 类型的, 它定义在 Classes 单元的第92行(Delphi 2007):
    TShortCut = Low(Word)..High(Word);

    Menus 单元有两个函数: TextToShortCut、ShortCutToText, 可以互相转换它们.
    var
      w: Word;
      s: string;
    begin
      w := TextToShortCut('Ctrl+A');
      ShowMessage(IntToStr(w)); {16449}
    
      s := ShortCutToText(16449);
      ShowMessage(s);           {Ctrl+A}
    end;
    
    它是根据什么原理用一个数字记下了一个字符串的呢? 我没有深究, 只是根据已知数据猜了一下.
    Word 是双字节, 有一个高字节、一个低字节.
    高字节用来储存辅助键, 就是 Shift、Ctrl、Alt 和它们的组合; 低字节储存单键对应的键值.
    对组合键的键值, Delphi 规定如下:

    辅助键
    Shift $20
    Ctrl $40
    Shift+Ctrl $60
    Alt $80
    Shift+Alt $A0
    Ctrl+Alt $C0
    Shift+Ctrl+Alt  $E0 

    譬如: 16449, 用十六进制表示是: $4041; 高字节 $40 表示 Ctrl, 低字节 $41 表示字母 A.


    既然如此, 不用它的转换函数, 我们自己也可以转换了:
    var
      w: Word;
      h,l: Byte;
    begin
      w := 16449;
      h := Hi(w); {获取高字节}
      l := Lo(w); {获取低字节}
      ShowMessage(IntToHex(h,2)); {40}
      ShowMessage(IntToHex(l,2)); {41}
    end;
    
    不过, 我在整理所有可用的快捷键列表时, 碰见了太多重复值(就是一个快捷键对应着好多个数值), 还不知是什么原理.
  • 相关阅读:
    结对第一次—疫情统计可视化(原型设计)
    软工实践寒假作业(2/2)
    软工实践寒假作业(1/2)
    Luogu P3975 [TJOI2015]弦论
    【模板】后缀自动机 (SAM)
    停用FF新鲜事/FF新推荐
    模板汇总
    Luogu P4467 [SCOI2007]k短路(模板)
    【模板】 最短路
    Luogu P5960 【模板】差分约束算法
  • 原文地址:https://www.cnblogs.com/del/p/1064911.html
Copyright © 2020-2023  润新知