VC菜单与加速键
1.
Windows
消息
在
Windows
中,消息有以下三种类型:
(1)
标准
Windows
消息:指以
WM_
为前缀的那些消息(除了
WM_COMMAND
),如窗口移动消息
WM_MOVE
,窗口大小改变消息
WM_SIZE
,此外,如程序启动或退出,窗口创建和关闭等等。
(2)
控件通知消息:由编辑框,列表框等控件或子窗口发给其父窗口的通知消息,以
WM_COMMAND
为消息名,在消息中包含有控件通知代码,以区分具体的控件通知消息。
(3)
命令消息:命令消息也以
WM_COMMAND
为消息名,在消息中包含有命令的标识符(
ID
),以区分具体的命令。命令消息的来源是以下三种用户接口对象:
菜单:用户选择某菜单项,要产生相应的命令消息。
工具栏:用户按下某工具栏按钮产生相应的命令消息。
加速键:用户在键盘上按下了定义的加速键也将产生相应的命令消息。
2
.创建菜单和加速键示例程序
(1)
创建一个
SDI
工程,名称是:
CMenuExample
。
(2)
打开
ResourceView
标签,展开
Menu
项。添加“我的菜单”,然后在其下面创建两个子项
:ID_MYMENU_HELLOWORLD
,“
HelloWord
(
&S
)”
;ID_MYMENU_HELLOC
,“
HelloVC++
(
&V
)”。
Prompt
中可以添加显示在状态条中的提示信息。
(3)
为
ID_MYMENU_HELLOWORLD
添加
COMMAND
消息函数。同时为
ID_MYMENU_HELLOC
添加
COMMAND
消息函数。其实现代码如下:
void
CCMenuExampleView::OnMymenuHelloc()
{
// TODO: Add your command handler code here
MessageBox(
"
您点的
Hello VC++!"
,
"Hello VC++!"
);
}
void
CCMenuExampleView::OnMymenuHelloworld()
{
// TODO: Add your command handler code here
MessageBox(
"
您点的
HelloWorld!"
,
"HelloWorld!"
);
}
(4)
为上述两个菜单项添加对应的键盘加速键。在工作区
ResourceView
标签,展开
Accelerator
项,在
IDR_MAINFRAME
上双击,启动加速键编辑器。在最后的虚框上双击鼠标,分别输入
ID
,
Key
组合框中输入或选择相应的加速键。分别为
F11
和
F12
。在“
HelloWorld
(
&S
)”后面加上“
/tF11”。同理,另一个为”/tF12”
。
(5)
下面为“
HelloWorld
”添加菜单项的状态更新处理。为视图类加一个成员变量。
BOOL m_hHaveHelloWorld;
然后在视图类的构造函数中初始化次变量如下:
CCMenuExampleView::CCMenuExampleView()
{
// TODO: add construction code here
m_hHaveHelloWorld = TRUE;
}
为“
HelloWorld
”菜单项的更新用户接口对象状态命令添加消息处理函数。
ID_MYMENU_HELLOWORLD
添加
UPDATE_COMMAND_UI
消息。如下:
void
CCMenuExampleView::OnUpdateMymenuHelloworld(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_hHaveHelloWorld);
}
在视图类中添加改变
m_hHaveHelloWorld
成员变量值的函数。在这里我们响应鼠标的左键,
m_hHaveHelloWorld
置为
FALSE
,右键置为
TRUE
。如下:
void
CCMenuExampleView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
MessageBox(
"Sorry,
你不能点这个按钮了
!"
,
"Sorry!"
);
m_hHaveHelloWorld = FALSE;
CView::OnLButtonDown(nFlags, point);
}
void
CCMenuExampleView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
MessageBox(
"
运气不错,你可以点此按钮
!"
,
"Good Luck!"
);
m_hHaveHelloWorld = TRUE;
CView::OnRButtonDown(nFlags, point);
}
编译连接运行本程序。