windows程序设计(13):给滚动条加上键盘响应

先扯两句跟键盘有关系的闲话:

首先,通常我们写程序时,没有必要对所有的键盘消息做出相应,windows自身已经对很多消息做出了相应,只要这些消息走的是DefWindowProc (hwnd, message, wParam, lParam)这条路就可以了。比如,对于前面写过的按钮程序,里面没有键盘响应消息,但你依然可以通过Alt+F4来关闭这个程序,或者当按钮或得焦点以后,通过空格键来操作它。

其次,按键消息保存在“系统消息队列”中,而不是像一般人想象的那样保存在一个一般的消息队列中。这是为什么呢?因为我们按键总是对特定的窗口执行的,所以必须让按键与它期望的窗口随时相匹配。举一个例子,比如我们打开了一个word,又打开了一个记事本。我们一会儿向word里面输入文字,一会儿向记事本输入文字。如果按键的内容做成一个消息队列,而不考虑哪个程序或得焦点,那么就输乱了。只有把按键保存在系统消息中才能避免这一点。

再次,应用程序从Windows接收的关于键盘事件的消息可以分为按键和字符两类。当你按了一下a键,产生了按键消息;根据Ctrl、 Shift和Caps Lock键的状态,A键能产生几个字符。通常情况下,此字符为小写a。如果按下Shift键或者打开了Caps Lock,则该字符就变成大写A。如果按下了Ctrl,则该字符为Ctrl-A。二者的转换是很麻烦的,通常这个工作由系统完成:

	while (GetMessage (&msg, NULL, 0, 0))
	{
		TranslateMessage (&msg) ;
		DispatchMessage (&msg) ;
	}

TranslateMessage将虚拟键盘消息转化为字符消息。为什么说是虚拟按键消息呢?因为最开始,按键消息是与键盘中按键的布局相关的,这显然是一件很麻烦的事情。所以Windows通过定义所谓的虚拟键码,以便经由与设备无关的方式处理键盘。

最后,按键消息可以分为系统按键和非系统按键的按下和抬起:当您按下一个键时,Windows把WM_KEYDOWN或者WM_SYSKEYDOWN消息放入有输入焦点的窗口的消息队列;当您释放一个键时,Windows把WM_KEYUP或者WM_SYSKEYUP消息放入消息队列中。系统按键消息通常是由Alt+某个键组合而成的。通过按键消息的wParam,可以或得具体按键的虚拟键码。

现在在言归正传,如何给前面写的滚动条程序加上按键消息?最简单的方法是:当检测到一个按键时,这个按键发送一个“假冒的”滚动条消息就可以了,这样其他的内容就用发生太大的变化:

	//将键盘消息转化成滚动条消息
	//对于每个按键,向滚动条发出对应的消息
	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 ;
			
		case VK_NEXT:
			SendMessage (hwnd, WM_VSCROLL, SB_PAGEDOWN, 0) ;
			break ;
			
		case VK_UP:
			SendMessage (hwnd, WM_VSCROLL, SB_LINEUP, 0) ;
			break ;
			
		case VK_DOWN:
			SendMessage (hwnd, WM_VSCROLL, SB_LINEDOWN, 0) ;
			break ;
			
		case VK_LEFT:
			SendMessage (hwnd, WM_HSCROLL, SB_PAGEUP, 0) ;
			break ;
			
		case VK_RIGHT:
			SendMessage (hwnd, WM_HSCROLL, SB_PAGEDOWN, 0) ;
			break ;
		}
		return 0 ;


你可能感兴趣的:(windows程序设计(13):给滚动条加上键盘响应)