特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接/ T/ s$ Y; ~0 A1 h [
第48章 MENU-菜单控件 3 [: ]4 V; ~3 I* K% t' I2 c7 r
本期教程讲解STemWin支持的菜单控件。 48. 1 菜单控件介绍 48. 2 官方WIDGET_Menu实例 48. 3使用官方GUIBulder建立MENU控件 48. 4 总结 48.1 列表框控件介绍 MENU控件可用于创建若干种菜单。每个菜单项代表一个应用程序命令或子菜单。MENU可水平显示和/或垂直显示。菜单项可使用分隔符进行分组。水平菜单和垂直菜单均支持分隔符。选择一个菜单项会发送WM_MENU消息给菜单的所有者,或打开一个子菜单。如果已启用鼠标支持,则MENU小工具会对菜单项上方的鼠标移动作出反应。 下表显示水平MENU控件带垂直菜单的外观: 上表显示菜单控件使用其默认效果WIDGET_Effect_3D1L和使用WIDGET_Effect_Simple时的相应外观。菜单控件还可以与所有其他效果配合使用。 48.1.1 菜单消息 为了通知其所有者有关选择一个项或打开一个子菜单的信息,菜单控件将发送WM_MENU类型的消息给其所有者。 WM_MENU:发送此消息的目的是通知菜单的所有者有关选择一个项或打开一个子菜单的信息。已禁用的菜单项将不发送此消息。 WM_MENU中的MENU_MSG_DATA数据结构介绍如下: | 元素 | | | MsgType | MENU_ON_INITMENU 菜单打开之前会立即将此消息发送给菜单的所有者。这使得应用程序有机会在菜单打开之前对其进行修改。 MENU_ON_ITEMACTIVATE 菜单项被高亮显示之后,菜单的所有者窗口将收到此消息。将子菜单高亮显示之后,则不会发送此消息。 MENU_ON_ITEMPRESSED 按下菜单项之后,将发送此消息给小工具的所有者窗口。对于已禁用的菜单项,也将发送此消息 MENU_ON_ITEMSELECT 选择菜单项之后将立即发送此消息给菜单的所有者。ItemId元素包含已按下的菜单项的Id。 | | ItemId | |
下面是一个WM_MENU的简单示例: - void Callback(WM_MESSAGE * pMsg) {
7 o5 r) c# t H. d2 h Q \ - MENU_MSG_DATA * pData;1 w9 O0 ~) M, ]6 D6 o
- WM_HWIN hWin = pMsg->hWin;2 K4 [( K, i2 a+ a
- switch (pMsg->MsgId) {8 K, H7 D- d! O
- case WM_MENU:
0 X" m4 |& {7 i" S0 a1 ~% t, U - pData = (MENU_MSG_DATA *)pMsg->Data.p;
1 w4 \; h" X) J0 D* R( T+ G4 @ - switch (pData->MsgType) {
& B f) X8 U" ?6 I) ` - case MENU_ON_ITEMACTIVATE:# L# J4 w) |5 I9 f! y
- _UpdateStatusbar(pData->ItemId);
" @, I, [3 M0 L - break;
4 P g4 V0 X+ Z1 D - case MENU_ON_INITMENU:/ u0 o0 \ `! |1 Z# Q" a+ Q3 m4 w
- _OnInitMenu();
8 S3 K& g7 R9 r% b - break;
B; d7 t a* w# N - case MENU_ON_ITEMSELECT:
* t. D3 A+ p r+ v P4 o7 S6 z; v - switch (pData->ItemId) {
2 r% d1 O- m7 V - case ID_MENU_ITEM0: s1 i, k$ h% O4 w# [& B$ g' ^$ X
- ... /* React on selection of menu item 0 */
, ~) j- w1 a7 y$ k9 b8 F - break;
- V. t7 e! W" r - case ID_MENU_ITEM1:
$ m0 j# K+ j* t/ S& ] - ... /* React on selection of menu item 1 */
& H) W' ~, z( F+ x# K* v - break;! O( X9 y$ @5 O; {' |6 I2 z" z3 {
- case ...
: i" {2 i/ s! K3 E2 s! s1 K$ |3 m - ...
+ p/ \; i" a, k9 t. L( ] - }( H; `0 x( N8 G8 l2 z: e1 U8 y
- break;
: E" g2 s/ ^ d7 W - }
* @0 a; u- ~$ { - break;
* s# R" a$ b3 h8 q) E% t" N - default:- r9 m2 l6 y* t
- MENU_Callback(pMsg);
" ]9 u1 T, r3 [! v( O& E. s$ g0 S2 X5 S( j - }
; P6 R5 K- j6 D* k1 B1 e - }
复制代码 48.1.2 数据结构 MENU_ITEM_DATA:此结构充当一个容器,用于设置或检索有关菜单项的信息,MENU_ITEM_DATA的元素介绍如下: | 元素 | | | pText | | | Id | | | Flags | MENU_IF_DISABLED 菜单项已被禁用。 MENU_IF_SEPARATOR 菜单项为分隔符。 | | hSubmenu | 如果该菜单项代表一个子菜单,则此元素包含子菜单的句柄。 | 48.1.3 菜单支持键盘反应 如果控件具有输入焦点,则它将对下列各键做出反应: | | | - 如果菜单为水平菜单,则选定范围将向右移动一个项。 - 如果菜单为垂直菜单并且当前项为子菜单,则子菜单将会打开,并且输入焦点将移到该子菜单。 - 如果菜单为垂直菜单,但当前项非子菜单,并且顶层菜单为水平菜单,则顶层菜单的下一个项会打开,并且输入焦点将移到该菜单项。 | | - 如果菜单为水平菜单,则选定范围将向左移动一个项。 - 如果菜单为垂直菜单而非顶层菜单,则当前菜单会关闭,并且输入焦点将移到上一个菜单。如果上一个菜单为水平菜单,则其上一个子菜单将会打开,并且输入焦点将移到上一个子菜单。 | | - 如果菜单为水平菜单并且当前菜单项为子菜单,则此子菜单将会打开。 - 如果菜单为垂直菜单,则选定范围将移到下一个项。 | | - 如果菜单为垂直菜单,则选定范围将移到上一个项。 | | - 如果菜单不是顶层菜单,则当前菜单将关闭,并且输入焦点将移到上一个菜单。 - 如果菜单为顶层菜单,则当前菜单项将变为未选定。 | | - 如果当前菜单项为子菜单,则子菜单将会打开,并且输入焦点将移到该子菜单。 - 如果当前菜单项不是子菜单,则顶层菜单的所有子菜单将会关闭,并且将发送 MENU_ON_ITEMSELECT消息给菜单的所有者。 |
- q0 A& d$ i6 ]+ R% x |