c++ - 单击时系统托盘如何跟踪菜单的状态?

标签 c++ winapi

我有一个系统托盘,我想在单击时跟踪菜单。例如,当在系统托盘上单击鼠标右键时,我使用 InsertMenu(hPopMenu,0xFFFFFFFF,uFlag,IDM_AUTO,_T("Auto")); 但它总是覆盖我的更改?如何跟踪用户点击了哪个菜单?这是我的回调函数:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    POINT lpClickPoint;
    HMENU hMenu;    // handle to main menu 
    MENUITEMINFO mii = {sizeof(MENUITEMINFO) };
    BOOL status;

    switch (message)
    {
        case WM_USER_SHELLICON: 

            // systray msg callback 
            switch(LOWORD(lParam)) 
            {   
                case WM_RBUTTONDOWN: 

                    UINT uFlag = MF_BYPOSITION|MF_UNCHECKED|MF_STRING;
                    GetCursorPos(&lpClickPoint);
                    hPopMenu = CreatePopupMenu();

                                InsertMenu(hPopMenu,0xFFFFFFFF,uFlag,IDM_AUTO,_T("Auto")); InsertMenu(hPopMenu,0xFFFFFFFF,MF_SEPARATOR,IDM_SEP,_T("SEP"));                                  
InsertMenu(hPopMenu,0xFFFFFFFF,MF_BYPOSITION|MF_STRING,IDM_EXIT,_T("Exit"));

                    SetForegroundWindow(hWnd);
                    TrackPopupMenu(hPopMenu,TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_BOTTOMALIGN,lpClickPoint.x, lpClickPoint.y,0,hWnd,NULL);
                    return TRUE; 
            }
            break;

    case WM_COMMAND:

        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);

        // Parse the menu selections:


               ...
               ...

    }
    break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

最佳答案

您正在重新创建每一次鼠标点击。因此,您必须根据当前状态进行初始化。

UINT uFlag = MF_BYPOSITION|MF_UNCHECKED|MF_STRING;

变成:

UINT uFlag;
if( bCheckboxShouldBeCheckedAccordingToYourApplication )
    uFlag = MF_BYPOSITION|MF_CHECKED|MF_STRING;
else
    uFlag = MF_BYPOSITION|MF_UNCHECKED|MF_STRING;

这里,现在它更短了,但实际上仍然符合提出的问题:

UINT uFlag = MF_BYPOSITION  | (b?8:0) | MF_STRING;

当然,它的可读性差了一点。

关于c++ - 单击时系统托盘如何跟踪菜单的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20124372/

相关文章:

c++ - DirectX 9 C++ 程序崩溃并且无法重新打开

c++ - 路径字符串串联问题

c++ - 在 C++ (Win32) 中解析 XML 的方法

c++ - 如何解锁Windows登录屏幕

c# - 表格中的圆角边缘

C++:使用 Win32 API 实现命名管道

c++数组和if语句不起作用

c++ - C++ 中的 case 表达式返回错误

c++ - SFINAE 构造问题

c++ - SetLayeredWindowAttributes 不适用于 Windows 7