神奇的汇编(六)

时间:2021-04-24 06:10:27

菜单和加速键是我一直都没有怎么用的东西,也没有仔细的去研究它,其实它是用一个脚本文件(.rc)来编写,同时也是用专门的编译器(同样叫rc.exe,vs自带的)来编译的。

菜单的定义和加速键的定义一般都有自己的格式,这里不重复了,但是要提一点的是,每个资源都要有一个资源号,通常是个16位的整数
每种资源这个号必须唯一

一般在程序中需要通过 loadmenu loadaccelerator 来读取这个模块的资源,使用这个资源号来表明读取那个资源。

对于加速键来说,它就是一个快速启动菜单功能的东西,它通常是一个键的定义对于一个command id,这个id和菜单项的command id要一样,这样
在使用加速键的时候就直接和这个菜单项的功能对应起来了。


对于加速键,当用户在窗口中使用的时候,会产生一个keydown消息,这个消息中带有了按键的信息,而这个信息并不是程序要处理的按键信息,而
是要将它做为一个command消息来处理,为了解决这个问题,消息循环通常这么些
   .while TRUE
          invoke GetMessage,addr @stMsg,NULL,0,0
          .break  .if eax==0
          invoke  TranslateAccelerator,hWinMain,@hAccelerator,addr @stMsg
          .if  eax ==0
                 invoke TranslateMessage ...
                 invoke DispatchMessage ...
          .endif
   .endw

TranslateAccelerator 函数收到keydown消息会加载加速键表,同时将收到的键在表中比较,如果发现了,则将相对应的command id包在WM_COMMAMD重发给消息
队列,同时返回TRUE,否则它返回FALSE,直接由TranslateMessage DispatchMessage 来处理。