河雅。最后,经过大量的修改,我得到了一个.rc加载的上下文菜单,我的托盘通知图标工作。(基于对话框的Windows API应用程序,无MFC)。然而,在各种示例和使用演示中,我总是看到HMENU在调用CreateMenu()之前/之后被创建(LoadMenu()DestroyMenu())和销毁(TrackPopupMenu())。通知图标的弹出菜单,就像,根本没有在msdn上记录(至少我没有找到一个以上关于它们的段落)。
直观地说,我将LoadMenu()放在WM_INITDIALOG的消息处理中,并存储HMENU,因此不必每次都创建和销毁菜单。正如我所说,我还没有发现任何类似的例子,我觉得有点耐人寻味。我的HMENU是否可能在使用菜单或应用程序时“损坏”?还是像我一样追求(好吧,边际)的额外表现是安全的?

INT_PTR CALLBACK MainDlg(HWND ..., UINT, WPARAM, LPARAM)
{
    switch (message)
    {
    case WM_INITDIALOG:
        ...
        HMENU hMenuBar = LoadMenu(hInst, MAKEINTRESOURCE(IDR_NOTIFYMENU));
        hNotifyMenu = GetSubMenu(hMenuBar, 0);
        ...
        break;

    ...

    case WM_NOTIFYICON:
        switch (lParam)
        {
        case WM_RBUTTONUP:        // there is no WM_CONTEXTMENU for
            {                     // nid.uVersion != NOTIFYICON_VERSION_4
            POINT CursorPos;
            GetCursorPos(&CursorPos);

            // this is where I saw LoadMenu and stuff in examples

            SetForegroundWindow(hDlg); // otherwise menu won't disappear
            TrackPopupMenu(hNotifyMenu, TPM_LEFTALIGN, CursorPos.x,
                           CursorPos.y, 0, hDlg, NULL);

            PostMessage(hDlg, WM_NULL, 0, 0); // otherwise menu locks hDlg

            // this is where I saw DestroyMenu in examples
            }

            return (INT_PTR)TRUE;
        }
        ...
    }
    ...
}

最佳答案

这并不是因为它被破坏了,更重要的是你不想拥有gdi资源超过绝对必要的时间。你可以很容易地用光它们,只需看看chrome,它与gdi资源限制斗争了几个月,最后才找到解决办法。
除了加载十几次菜单并销毁它之外,对于现代处理器来说,什么都不是。不要过早地优化程序,特别是不要为了那么少的收益。
至于为什么你还没有找到专门处理通知图标菜单的msdn页面,那是因为它们是两个独立的东西。菜单是一个菜单,无论是在对话框的顶部,右键单击文本框或右键单击通知图标时弹出。你不需要特别的建议或代码。

关于windows - TrackPopupMenu是否会“损害”我的HMENU?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5437261/

10-11 16:51