将编辑控件添加到CToolbar时,占位符仍然可见?

时间:2013-12-04 20:42:38

标签: visual-studio mfc toolbar

多年前,我在应用程序的工具栏中添加了一个编辑控件,遵循以下类似的指示:

http://www.codeproject.com/Articles/1106/Adding-a-Combo-Box-to-a-Docking-Toolbar

在许多文章中都可以找到类似的指示,所以我认为这个程序很常见。直到几年前,这个工作正常,结果如文章所示。但是,我相信转向XP改变了工具栏中按钮的外观,而我现在在我的应用程序中看到了这一点:

Toolbar with edit control and background separator

似乎原始说明只是因为更改前的控件占据了工具栏的整个高度,因此编辑控件阻碍了它后面的分隔符。

理想情况下,我认为底层分隔符应该是不可见的。但是,这似乎没有在我发现的任何文章中明确处理,我不太确定自己如何防止绘制分隔符。

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

我使用了来自thisCodeGuru技术。它已经很久了,但是,我已经使用它很多年了,它仍然有效。

答案 1 :(得分:1)

如果您在codeproject上完全遵循该文章,您可能已经将占位符从按钮修改为分隔符。这就是当按钮图像的高度大于组合框的高度时显示的分隔线的原因。

如果您将占位符保留为空按钮,则不会出现此问题。在级联编队中可能需要一系列几个占位符按钮,以便为组合框提供真正有用的长度。

该技术演示如下:

// standard creation of the toolbar in CMainFrame::OnCreate
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
    TRACE0("Failed to create toolbar\n");
    return -1;      // fail to create
}
// status bar creation .....
// .....
// the place holders are a series of 5 empty toolbar buttons ie: ID_COMBO_1 to ID_COMBO_5
// get index of first combobox place holder
INT nIndex = m_wndToolBar.GetToolBarCtrl().CommandToIndex(ID_COMBO_1);
// get size of first place holder rectangle
CRect rcRect;
m_wndToolBar.GetToolBarCtrl().GetItemRect(nIndex, &rcRect);
INT nWidth = rcRect.Width();
// calculate width of combobox with sum of all place holder (5 in total)
nWidth = nWidth * 5;
rcRect.top = 5;                     // top of combo box
rcRect.bottom = rcRect.top + 250;   // drop height
rcRect.right = rcRect.left + nWidth;
// create the combobox to sit above the place holders
if(!m_comboBox.Create(CBS_DROPDOWNLIST | CBS_SORT | WS_VISIBLE |
    WS_TABSTOP | WS_VSCROLL, rcRect, &m_wndToolBar, ID_COMBO_1))
{
    TRACE(_T("Failed to create combo-box\n"));
    return FALSE;
}
m_comboBox.AddString("Toolbar Combobox item one");
m_comboBox.AddString("Toolbar Combobox item two");
m_comboBox.AddString("Toolbar Combobox item three");