280 likes | 398 Views
菜单,加速键资源. 菜单资源的组成 菜单资源的创建 菜单资源的操作 菜单资源的动态创建 加速键资源的创建. 窗口主菜单栏. 菜单资源的组成. 热键标识. 下拉式菜单框. 加速键. 分隔线. 菜单资源的创建. 定义菜单 在资源描述文件中定义: 菜单名 MENU [ 菜单选项 ] { POPUP” 菜单项名(热键)” [ 菜单项选项 ] { MENUITEM” 菜单条目名 加速键”, ID[ 菜单条目选项 ] } } 热键: &+ 单字符,表示该菜单使用 Alt +单字符作为热键。. 菜单选项.
E N D
菜单,加速键资源 • 菜单资源的组成 • 菜单资源的创建 • 菜单资源的操作 • 菜单资源的动态创建 • 加速键资源的创建
窗口主菜单栏 菜单资源的组成 热键标识 下拉式菜单框 加速键 分隔线
菜单资源的创建 • 定义菜单 在资源描述文件中定义: 菜单名 MENU [菜单选项] { POPUP”菜单项名(热键)”[菜单项选项] { MENUITEM”菜单条目名 加速键”,ID[菜单条目选项] } } 热键:&+单字符,表示该菜单使用Alt+单字符作为热键。
菜单选项 • DISCARDABLE 当不再需要菜单时可丢弃 • FIXEDP 菜单保存在内存中的固定位 置 • LOADONCALL 需要时加载菜单 • MOVEABLE 菜单在内存中可移动 • PRELOAD 立即加载菜单
菜单项选项 • MENUBARBREAK 菜单项纵向分隔标志 • CHECKED 显示选中标志 • INACTIVE 禁止一个菜单项 • GRAYED 禁止一个菜单项并变灰显 示
菜单定义资源文件 #include”Menu.h” Menu MENU MOVEABLE { POPUP “文件(&F)” { MENUITEM”新建”,IDM_NEW MENUITEM”打开”,IDM_OPEN MENUITEM SEPERETOR //分隔线 MENUITEM “退出”,IDM_EXIT } }
菜单定义头文件 //Menu.h #define IDM_NEW 10 #define IDM_OPEN 11 #define IDM_EXIT 12
加载菜单资源 在Windows应用程序中加载菜单资源有三种方法: • 在窗口类中加载菜单 • 在创建窗口时加载菜单 • 动态加载菜单 显示菜单
在窗口中加载菜单资源 WNDCLASS wndclass Wndclass.lpszMenuName=lpszMenuName;
创建窗口时加载菜单 在CreateWindow函数中加载菜单: HMENU hMenu1; hMenu1=LoadMenu(hInstance, MenuName); CreateWindow(……,hMenu1,……);
动态加载菜单 通过SetMenu函数可以动态加载菜单。 HMENU hMenu1; hMenu1=LoadMenu(hInstance, MenuName); SetMenu(hwnd,hMenu1);
显示菜单 • 菜单加载后还要调用显示函数显示菜单: DrawMenuBar(hwnd);
菜单项的操作 • 禁止或激活菜单项 BOOL EnableMenuItem( HMENU hMenu, UINT uIDEnableItem, // 菜单项标识 UINT uEnable // 菜单项选项 ); uEnable表示: (1) uIDEnableItem是菜单项ID值还是它在菜单中的位置 (2)菜单项的状态
uEnable选项 MF_BYCOMMAND 以ID标识菜单项 MF_BYPOSITION 以位置标识菜单项 MF_DISABLED 禁止菜单项 MF_ENABLED 激活菜单项 MF_GRAYED 禁止菜单项并使其变灰
例如: hMenu1=GetMenu(hwnd); EnableMenuItem( hMenu1, IDM_OPEN, MF_BYCOMMAND|MF_GRAYED ); 禁止hMenu1中的IDM_OPEN菜单项并使其变灰显示 菜单项以ID标识
设置或取消选中标志 两种方法: • 在资源描述文件中设置“CHECKED” • 调用函数 DWORD CheckMenuItem( HMENU hmenu, UINT uIDCheckItem, //菜单项 UINT uCheck //菜单项选项 );
uCheck选项 MF_BYCOMMAND 以ID标识菜单项 MF_BYPOSITION 以位置标识菜单项 MF_CHECKED 添加选中标志 MF_UNCHECKED 删除选中标志 例如: if(!check) { CheckMenuItem(hMenu1,IDM_OPEN,MF_CHECKED); nCheck=1; } else { CheckMenuItem(hMenu1,IDM_OPEN,MF_UNCHECKED); nCheck=0; }
增加菜单项 增加菜单项有两种形式 • 在菜单尾部增加菜单项 BOOL AppendMenu ( HMENU hMenu, UINT uFlags, // 菜单项标识 UINT uIDNewItem, // 新加入的菜单项ID LPCTSTR lpNewItem // 新加入菜单项文字显示 );
在菜单中插入菜单项 BOOL InsertMenu ( HMENU hMenu, UINT uPosition, //插入位置 UINT uFlags, //对uPosition的解释 UINT uIDNewItem, //新菜单项标识 LPCTSTR lpNewItem //新菜单项内容 );
例如: • 在菜单尾部增加菜单项 AppendMenu(hMenu1,MF_ENABLED, IDM_VIEW,"VIEW"); //在菜单尾部增加一个VIEW下拉菜单 • 在菜单中插入菜单项 InsertMenu(hMenu1,IDM_NEW, MF_BYCOMMAND|MF_ENABLED, IDM_OPENAS,"OPEN AS“); //在file->new前增加open as项
删除菜单项 BOOL DeleteMenu( HMENU hMenu, UINT uPosition, // 要删除的菜单项 UINT uFlags // 对uPosition的解释 ); 例如: DeleteMenu(hMenu1,IDM_VIEW, MF_BYCOMMAND); //删除VIEW菜单项
修改菜单项 BOOL ModifyMenu( HMENU hMnu, UINT uPosition, //要修改的菜单项 UINT uFlags, //对uPosition的解释 UINT uIDNewItem, //修改后的菜单ID LPCTSTR lpNewItem // 修改后的菜单文本显示 ); 例如: ModifyMenu(hMenu1,IDM_VIEW, MF_BYCOMMAND, IDM_WINDOW,"window");
菜单的动态创建 菜单的动态创建分三个步骤: 一、创建空的弹出式菜单: hprintmenu=CreateMenu(); 二、向新菜单中加入菜单项: AppendMenu(hprintmenu, MF_ENABLED, IDM_LINE,“求和”); 三、将新建菜单插入到主菜单中: InsertMenu(hmenu,2, MF_POPUP|MF_BYPOSITION, (UINT)hprintmenu,"统计计算(&C)");
加速键资源的创建 加速键表名 ACCELERATORS ,[类型] { 加速键定义 }
加载加速键 HACCEL hAccel1; hAccel1=LoadAccelerators( hInstrance,//当前实例句柄 IDR_ACCELERATOR1 //加速键ID )
翻译加速键 在应用程序的消息循环中将加速键消息翻译成菜单消息: while( GetMessage(&Msg, NULL, 0, 0)) { //在消息循环中截获加速键消息 if(!TranslateAccelerator(hwnd,hAccel,&Msg)); { TranslateMessage( &Msg) ; DispatchMessage( &Msg) ; } }