You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:52:24