【问题标题】:Issues with adding a CComboBox to a CMFCStatusBar pane将 CComboBox 添加到 CMFCStatusBar 窗格的问题
【发布时间】:2020-04-14 20:46:56
【问题描述】:

我有这个简单的代码来创建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 编辑控件高度高一点。

【问题讨论】:

  • 你需要调整什么高度?一个组合框有 2 个高度(参见 Why does the size of a combo box include the size of the drop-down?)。
  • @IInspectable 我不介意自动计算出下拉位。它是基本的组合/编辑控件。如您所见,我们看不到底部边界线。除非我捏造 CRect。
  • @Andrew:还有另一种解决方案:增加状态栏高度,这很容易做到......这样,你放在那里的所有东西都会看起来很好......我不知道是否你没问题。
  • @flaviu2 我不知道如何更改CMFCStatusBar 的高度。
  • 我给你写了一段小代码,告诉你如何增加状态栏的高度。

标签: c++ combobox mfc statusbar


【解决方案1】:

这段代码展示了如何增加状态栏的高度。通过这种方式,您无需任何修改即可使用状态栏中的标准控件。

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;
}

【讨论】:

  • 谢谢。我试过了:CRect rctCombo; m_cbChairman.GetWindowRect(&rctCombo); m_StatusBar.GetStatusBarCtrl().SetMinHeight(rctCombo.Height()+4); 看起来不错。不知道为什么我必须添加 4 以及是否总是为所有屏幕添加 4?
  • 我猜 rctCombo.Height() + 4 适用于所有屏幕,是关于控件上下的线条(组合框或其他)。
猜你喜欢
  • 2014-08-31
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2014-10-12
  • 1970-01-01
相关资源
最近更新 更多