将 CComboBox 添加到 CMFCStatusBar 窗格的问题

Issues with adding a CComboBox to a CMFCStatusBar pane

我有这个简单的代码来创建 CComboBox 并将其显示在 CMFCStatusBar 的窗格中:

CRect rcPane;
m_StatusBar.GetItemRect(panePageBreaks, &rcPane);
CFont *pFont = m_StatusBar.GetFont();

m_myCombo.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST, rcPane, &m_StatusBar, 2500);
m_myCombo.SetFont(pFont);
m_myCombo.AddString(_T("Page Breaks: None"));
m_myCombo.AddString(_T("Page Breaks: 1 Week"));
m_myCombo.AddString(_T("Page Breaks: 2 Weeks"));
m_myCombo.AddString(_T("Page Breaks: 3 Weeks"));
m_myCombo.AddString(_T("Page Breaks: 4 Weeks"));

我能否将状态栏设置得足够大以包含此组合?目前它的高度太短一两个像素:


更新

如果我使用:

rcPane.InflateRect(1, 2, 0, 2);

好像好多了。但我不想捏造它。另一位用户的 PC 可能不同。我希望此组合在特定窗格上准确无误。


更新

我现在有点生气。我发现了一个类似的问题 here,这意味着要做两件事:

  1. 更改字体高度。
  2. 使用 SetItemHeight.

所以我使用了这两个,我发现我需要字体高度为 -6 以使控件具有正确的高度:

CRect rcPane;
m_StatusBar.GetItemRect(panePageBreaks, &rcPane);
CFont *pFont = m_StatusBar.GetFont();
LOGFONT sLF;
pFont->GetLogFont(&sLF);
sLF.lfHeight = -6;
pFont->CreateFontIndirect(&sLF);

m_myCombo.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST, rcPane, &m_StatusBar, 2500);
m_myCombo.SetItemHeight(-1, rcPane.Height());
m_myCombo.SetFont(pFont);
m_myCombo.AddString(_T("Page Breaks: None"));
m_myCombo.AddString(_T("Page Breaks: 1 Week"));
m_myCombo.AddString(_T("Page Breaks: 2 Weeks"));
m_myCombo.AddString(_T("Page Breaks: 3 Weeks"));
m_myCombo.AddString(_T("Page Breaks: 4 Weeks"));

你看,你可以设置编辑控件的高度,但是如果你的字体高度较大,它会使编辑控件变大。所以我不能超过-6。状态栏文本为-12。所以这不是一个选择。

我试图做的只是为用户提供一种简单的方法来通过状态栏和菜单导航更改此设置。但是我好像做不到。

如果 CMFCStatusBar 高度需要比默认 CComboBox 编辑控件高度高一点。

这段代码展示了如何增加状态栏的高度。这样你就可以在你的状态栏中使用标准控件而不需要任何修改。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    if (!m_wndStatusBar.Create(this))
    {
        TRACE0("Failed to create status bar\n");
        return -1;      // fail to create
    }
    m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));

    m_wndStatusBar.GetStatusBarCtrl().SetMinHeight(70); // or, whatever you need

    return 0;
}