如何为C++弹出菜单添加垂直滚动条?已设尺寸未显示
如何为Win32弹出菜单添加垂直滚动条?
我已经设置了弹出菜单的最大高度,但垂直滚动条仍然没有显示出来。相关代码如下:
int FTPWindow::OnProfileChange() { if (!m_vProfiles) return -1; ::DestroyMenu(m_popupProfile); m_popupProfile = ::CreatePopupMenu(); for(size_t i = 0; i < m_vProfiles->size(); i++) { ::AppendMenu(m_popupProfile, MF_STRING, IDM_POPUP_PROFILE_FIRST + i, m_vProfiles->at(i)->GetName()); } MENUINFO mi = { sizeof(MENUINFO) }; mi.fMask = MIM_MAXHEIGHT; mi.cyMax = 400; SetMenuInfo(m_popupProfile, &mi); POINT point = {100,100}; HWND window; ClientToScreen(window, &point); TrackPopupMenu(m_popupProfile, TPM_RETURNCMD, 100, 100,0,window,NULL); m_toolbar.SetMenu(IDB_BUTTON_TOOLBAR_CONNECT, m_popupProfile); SetToolbarState(); return 0; }
我来帮你排查几个关键问题,调整后应该就能让滚动条正常显示了:
修复未初始化的窗口句柄:你代码里的
HWND window;没有赋值就传给了ClientToScreen和TrackPopupMenu,这会导致菜单的显示上下文异常,直接影响滚动条的触发逻辑。把它改成当前窗口的句柄,比如:HWND window = m_hWnd; // 假设这是MFC窗口类,m_hWnd是窗口的默认句柄使用正确的坐标参数:你调用了
ClientToScreen转换坐标,但TrackPopupMenu还是用了原始的100,100,应该使用转换后的point坐标:TrackPopupMenu(m_popupProfile, TPM_RETURNCMD, point.x, point.y, 0, window, NULL);补充菜单信息掩码:虽然
MIM_MAXHEIGHT设置了最大高度,但为了确保菜单样式逻辑完整,建议给fMask加上MIM_STYLE(这一步能避免一些潜在的样式兼容问题):MENUINFO mi = { sizeof(MENUINFO) }; mi.fMask = MIM_MAXHEIGHT | MIM_STYLE; mi.cyMax = 400; mi.dwStyle = MNS_AUTODISMISS; // 保留菜单自动关闭的默认行为 SetMenuInfo(m_popupProfile, &mi);
最后还要确认:你的菜单项总高度必须超过cyMax=400的限制,滚动条才会被触发显示。如果菜单项本来就很少,总高度小于400,滚动条自然不会出现。
调整完这些之后,弹出菜单应该就能在内容超出最大高度时正常显示垂直滚动条了。
内容的提问来源于stack exchange,提问作者Totgeist
相关产品推荐
相关产品推荐

