为SYSMETS加上键盘处理功能(SendMessage函数)

出处:Windows程序设计 第五版 珍藏版 Page0183

 

  第4章SYSMETS程序的3个版本都是在不了解键盘的情况下写的。我们只能通过在滚动条上使用鼠标来滚动文本。现在我们知道怎样处理击键消息,就来给程序添加键盘接口。显然,这里的工作时处理光标移动键。垂直滚动中我们会大量使用这些键(Home、End、Page Up、Page Down、上箭头、下箭头)。左箭头键和右箭头键用于不太重要的水平滚动。

 

  创建键盘接口的一个简单的方法是在窗口过程中增加WM_KEYDOWN逻辑,它类似于或从本质上是复制了所有的WM_VSCROLL和WM_HSCROLL逻辑。但是,这是不明智的。因为不管任何时候我们想修改滚动条逻辑,就不得不在WM_KEYDOWN消息上做同样的改变。

 

  简单地把每一个WM_KEYDOWN消息转换为等同的WM_VSCROLLWM_HSCROLL消息,是不是会更好吗?然后我们可以通过给窗口过程发送假冒的消息欺骗WndProc函数,使它认为收到了滚动条消息。

 

  Windows允许你这样做。函数命名为SendMessage,它携带了传送给窗口过程参数

SendMessage(hwnd, message, wParam, lParam);

  当你调用SendMessage函数时,Windows调用窗口句柄是hwnd的窗口过程,同时把四个函数变量传递给它。窗口过程处理完此消息Windows把控制权交还给紧跟着SendMessage调用的下一条语句。你向它发送消息的窗口过程可以是同一个窗口过程,也可以是同一个程序中的其他窗口,或者甚至是另一个应用程序的窗口过程。

 

  下面将说明在SYSMETS程序中,我们怎么样使用SendMessage函数处理WM_KEYDOWN消息:

  case WM_KEYDOWN:
      switch(wParam){
          case VK_HOME:
              SendMessage(hwnd, WM_VSCROLL, SB_TOP, 0);
              break;

          case VK_END:
              SendMessage(hwnd, WM_VSCROLL, SB_BOTTOM, 0);
              break;

          case VK_PRIOR:
              SendMessage(hwnd, WM_VSCROLL, SB_PAGEUP, 0);
              break;

              /*其他键盘消息转换*/
      }

  以此类推。大概意思已经清楚了。我们的目的是给滚动条增加键盘接口,并且也已经这么做了。实际上我们通过给窗口过程发送滚动条消息,实现了用光标移动键重复滚动条逻辑。现在你明白为什么我要在SYSMETS3程序的WM_VSCROLL消息中包含SB_TOP和SB_BOTTOM处理过程了吧。那时它没有用,现在它被用来处理Home和End键。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值