win32 单选标记的菜单

来源:互联网 发布:js split数组 编辑:程序博客网 时间:2024/06/03 22:39

先设置好菜单

IDR_MAIN MENUBEGIN    POPUP "菜单"    BEGIN        MENUITEM "飞机",                          ID_32771        MENUITEM "大炮",                          ID_32772        MENUITEM "手枪",                          ID_32773    END    MENUITEM "哈哈哈",                         0END

载入菜单

// 在这里把菜单附加上,成为类级别  wcex.lpszMenuName   = MAKEINTRESOURCE(IDR_MAIN);//整个菜单资源的ID,不是菜单项 

思路

1、调用GetMenu( 窗口句柄 )获取窗口中菜单栏的句柄;

2、调用GetSubMenu( 菜单栏句柄,0 )获得【菜单】弹出菜单的句柄,0表示菜单栏中的第一个元素,如果第二个就是1,我们的弹出菜只有【菜单】一项;

3、调用CheckMenuRadioItem函来来Check菜单。

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    int wmId, wmEvent;    PAINTSTRUCT ps;    HDC hdc;    // 获取窗口上的整个菜单栏的句柄      HMENU hmm = GetMenu(hWnd);    // 获取第一个弹出菜单,即[水果]菜单      HMENU hfmn = GetSubMenu(hmm, 0);    switch(msg)      {      case WM_COMMAND:          {          .......  

菜单句柄是HMENU类型,所以GetMenu和GetSubMenu函数都返回HMENU类型的值。其实,这里我给大家推荐一个技巧,就是使用auto关键字,我们无需管它函数什么,统一用auto关键字,它会根据代码上下文推断数据类型,就像C#里面的var声明变量一样。

响应消息:

switch (wmId)        {        case ID_32771:            CheckMenuRadioItem(hfmn, ID_32771, ID_32773, ID_32771, MF_BYCOMMAND);            MessageBox(hWnd, L"你选择了飞机。", L"提示", MB_OK);            break;        case ID_32772:            CheckMenuRadioItem(hfmn, ID_32771, ID_32773, ID_32772, MF_BYCOMMAND);            MessageBox(hWnd, L"你选择了大炮。", L"提示", MB_OK);            break;        case ID_32773:            CheckMenuRadioItem(hfmn, ID_32771, ID_32773, ID_32773, MF_BYCOMMAND);            MessageBox(hWnd, L"你选择了手枪。", L"提示", MB_OK);            break;        }

CheckMenuRadioItem函数介绍
原型:
BOOL CheckMenuRadioItem(HMEN hMENU,UINT idFirst,UINT idLast,UINT idCheck,UINT uFlags);

参数:
hMenu:包含一组菜单项的菜单的句柄。
idFirst:菜单组里第一个菜单项的标识符或位置。
idLast:菜单组里最后一个菜单项的标识符或位置。
idCheck:要校核的菜单项的标识符或位置。
uFlag:指定idFirst,idLast,idCheck含义的值。如果此参数为MF_BYCOMMAND,则其他参数指定菜单项标识符。如果此参数为MF_BYPOSITION,则其他参数指定菜单项位置。

0 0