WinX教程介绍
我们先来清点一下,我们已经会用WinX实现哪些效果:改变背景色、拦截处理命令消息、自定义控件。大家有没有注意到,我们还不能针对键盘输入做什么。今天我们就来实战如何利用WinX处理加速键(快捷键,Accel,下文我可能会混用)。
插一句:上一篇,我做的那个例子的bug就是超类化的按钮控件,在双击后仍然会最大化,:)。
再插一句:快捷键是在资源文件中指定的,通过资源文件中的快捷键资源我们可以将某一键盘消息和某一命令ID对应起来,这样我们就可以像以前介绍的处理命令消息的方法处理键盘的快捷键。
正式开始!
这次WinX教程中为我们提供了两个例子,分别为:accel和focusmsg,如下图:
看完这个教程实例(不要告诉我你在看这篇BLOG时没有看完WinX自带的教程实例),我们不难看出,WinX中处理快捷键主要是通过以下两个宏:
-
WINX_ACCEL
-
WINX_DLG_ACCEL
和一个消息处理函数:
-
TestTranslateAccel
实现。
WINX_ACCEL
加载快捷键资源。WINX_ACCEL宏带一个参数,指定资源文件中快捷键资源的ID。用法如下:
WINX_ACCEL(IDR_ACCEL1);
其中IDR_ACCEL1就是加速键资源的ID。
WINX_DLG_ACCEL
在WinX中,对话框默认是不支持快捷键的。通过WINX_DLG_ACCEL宏就可以改变设置,使其支持,也就说WINX_DLG_ACCEL是个开关。WINX_DLG_ACCEL不带参数,但有括号。用法如下:
WINX_DLG_ACCEL();
TestTranslateAccel
这是个消息处理函数,处理的消息是WinX自定义的快捷键派发消息,它提供一个让我们修正快捷键消息处理的机会。
何来修正?/
因为你不知道对话框什么时候拦截了本该由你的控件处理的消息,比如这里的快捷键消息。一但被对话框处理了,控件就得不到处理机会,这显然有时候不是你本意。
如何修正?
在对话框类中定义TestTranslateAccel函数,其原型如下:
BOOL TestTranslateAccel(HWND hWnd, LPMSG lpMsg);
对不该由对话框处理的消息返回CannotTranslateAccel,除此外,需要由对话框处理的时候返回CanTranslateAccel。像FocusMsg实例中的用法:
BOOL TestTranslateAccel(HWND hWnd, LPMSG lpMsg)
{
if (::GetDlgCtrlID(::GetFocus()) == IDC_RICHEDIT1)
{
if (lpMsg->message == WM_KEYDOWN && lpMsg->wParam == 'Z')
return CannotTranslateAccel;
}
return CanTranslateAccel;
}
就使得控件IDC_RICHEDIT1有了处理与Z有关快捷键的机会,真是好险啊,:D 。
不过也不用担心,TestTranslateAccel主要出现在对话框和子控件出现共同快捷键的时候。这种机会还是很少的。
需要注意的几个问题
-
WINX_CMDS_BEGIN_EX/WINX_CMDS_END_EX
在FocusMsg教程实例中,就用到了这一对宏(不是一对红),其实这一对宏我们以前说过,它们和不带EX后缀的区别是,这一对宏会把自身没有处理的消息发送给视图处理。需要指出的是,这里的“视图”不是像MFC中的视图,这里说的“视图”是更一般的概念,只要是负责显示的窗口/控件都可以称之为视图。所以在实例中会把对话框自身没有处理的消息发送给其上控件处理。其用法同WINX_CMDS_BEGIN/WINX_CMDS_END。
-
InitCommonControls/ InitRichEditControl
当用到了通用控件时,我们就需要调用InitCommonControls,用到了RichEdit控件,还需要再调用InitRichEditControl。二者都是没有参数的。
-
WINX_CMD/WINX_CMD_EX
本来这一对宏没有在这次实战的实例中出现,可以不说,但由于其和“包围”它们的WINX_CMDS_BEGIN_EX/WINX_CMDS_END_EX
或WINX_CMDS_BEGIN/WINX_CMDS_END的密切关系,这里不得不简单说一下。
WINX_CMD_EX并不一定要和WINX_CMDS_BEGIN_EX/WINX_CMDS_END_EX配对,同样,WINX_CMD也并不一定和WINX_CMDS_BEGIN/WINX_CMDS_END配对。WINX_CMD我们一直在用,WINX_CMD_EX比它多一个参数。WINX_CMD的用法我们复习一下:
WINX_CMD(IDC_BUTTON1, OnButton1);
就是当收到ID为IDC_BUTTON1的命令消息时,程序调用OnButton1消息处理函数。而WINX_CMD_EX的用法如下:
WINX_CMD_EX(ID_BUTTON1, BN_CLICK, OnButton1Click);
可以实现同样的效果。有人会说了,那要这种形式有什么用?当你需要处理按钮(这个按钮在对话框上,但你需要在对话框内来处理)的其他消息时!
结束
这次我们实战的教程实例和内容比较简单,只要会添加加速键资源,细心点应该不会有什么问题,这里就不做例子了。下篇我们将讨论更有意思的内容,用WinX控制对话框上控件的layout。
?
END
本文地址:http://www.45fan.com/dnjc/71224.html