TrackPopupMenu会“伤害”我的HMENU吗?

部屋。 最后,在大量的摆弄之后,我得到了一个.rc加载的上下文菜单,用于我的托盘通知图标的工作。 (基于对话框的Windows API应用程序,没有MFC)。 但是,在各种示例和用法演示中,我总是看到在调用TrackPopupMenu() 之前/之后正在创buildHMENUCreateMenu()LoadMenu() )并销毁( DestroyMenu() TrackPopupMenu() 。 通知图标的popup式菜单就像MSDN上没有logging的一样(至less我没有发现关于它们的单个段落)。

直观上,我把LoadMenu()放在WM_INITDIALOG的消息处理中,并存储HMENU ,所以我不必每次创build和销毁菜单。 正如我所说,我没有发现任何类似的做法,我觉得有点耐人寻味。 使用菜单或应用程序时,我的HMENU是否可能会“损坏”? 还是像我一样去做(好的,边际的)额外的performance是安全的?

 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资源超过绝对必要的时间。 你可以很容易地把它们用完,只要看看那些在GDI资源限制上挣扎了几个月的Chrome,最终找到解决方法。

除了加载一个菜单十几次,摧毁它是现代处理器没有什么。 不要过早地优化程序,特别是不要太少的收获。

至于为什么你还没有找到任何专门处理通知图标菜单的MSDN页面,那是因为它们是两个单独的东西。 菜单是一个菜单,无论是在对话框的顶部,当您右键单击文本框时弹出或当您右键单击通知图标。 你不需要特别的建议或代码。