c++ - 将CComboBox添加到CMFCStatusBar Pane 的问题

标签 c++ combobox mfc statusbar

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

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"));
我可以使状态栏足够大以包含此组合吗?目前这是一个或两个像素的高度太短:
StatusBar

更新资料
如果我使用:
rcPane.InflateRect(1, 2, 0, 2);
似乎更好。但是我不想捏造它。其他用户的PC可能不同。我希望此组合在特定的 Pane 中是准确的。

更新资料
我现在有点生气。我发现了一个类似的问题here,它暗示要做两件事:
  • 更改字体高度。
  • 使用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"));
    
    Status Bar with Combo
    您会看到,可以设置编辑控件的高度,但是如果字体高度较大,则会使编辑控件变大。所以我不能超过-6。并且状态栏文本为-12。所以这不是一个选择。
    我试图做的就是为用户提供一种简单的方法,即通过状态栏以及菜单导航来更改此设置。但是看来我做不到。
    如果有的话,CMFCStatusBar的高度需要比默认的CComboBox编辑控件的高度高一点。

    最佳答案

    此代码显示了如何增加状态栏的高度。这样,您可以在状态栏中使用stardard控件,而无需进行任何修改。

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

    关于c++ - 将CComboBox添加到CMFCStatusBar Pane 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61216951/

    相关文章:

    c++ - COleSafeArray 与 CComSafeArray

    c++ - 尝试等待 boost::condition_Variable 时出现 "unique_lock has no mutex: Operation not permitted"错误

    c++ - C++ 如何在同一行输入多个变量

    c++ - 从现有数组构建哈希表比先创建哈希表然后插入所有元素更好吗?

    Wpf Combobox Equals 方法不合逻辑的行为

    c++ - 在 MFC 中发出 Win32 事件信号时注册以接收 Windows 消息

    c++ - 帮助模板合并排序功能

    c# - 使 ComboBox 只接受特定类型

    c# - 无法清除组合框中的选择

    c++ - CScrollBar 拇指跟踪不起作用