Visual studio 向CToolbar添加编辑控件时占位符是否仍然可见?

Visual studio 向CToolbar添加编辑控件时占位符是否仍然可见?,visual-studio,mfc,toolbar,Visual Studio,Mfc,Toolbar,几年前,我在应用程序的工具栏中添加了一个编辑控件,如下所示: 类似的指导可以在许多文章中找到,所以我认为这个过程是相当普遍的。直到几年前,这种方法还很有效,结果如本文所示。然而,我相信XP改变了工具栏中按钮的外观,我现在在我的应用程序中看到了这一点: 看起来,原来的指令之所以有效,是因为更改前的控件占据了工具栏的整个高度,所以编辑控件挡住了它后面的分隔符 理想情况下,我认为底层分隔符应该是不可见的。然而,在我找到的任何一篇文章中似乎都没有明确地处理这个问题,我自己也不太确定如何防止分隔符被画

几年前,我在应用程序的工具栏中添加了一个编辑控件,如下所示:

类似的指导可以在许多文章中找到,所以我认为这个过程是相当普遍的。直到几年前,这种方法还很有效,结果如本文所示。然而,我相信XP改变了工具栏中按钮的外观,我现在在我的应用程序中看到了这一点:

看起来,原来的指令之所以有效,是因为更改前的控件占据了工具栏的整个高度,所以编辑控件挡住了它后面的分隔符

理想情况下,我认为底层分隔符应该是不可见的。然而,在我找到的任何一篇文章中似乎都没有明确地处理这个问题,我自己也不太确定如何防止分隔符被画出来


任何帮助都将不胜感激。谢谢

我使用了来自的技术。它很旧,但是,我已经使用它很多年了,它仍然可以使用。

如果您完全按照codeproject上的那篇文章进行操作,您可能已经将占位符从按钮修改为分隔符。这就是为什么当按钮图像的高度大于组合框的高度时,分隔线显示为thru

如果将占位符保留为空按钮,则不会出现此类问题。为了使组合框有一个真正有用的长度,可能需要一系列层叠的占位符按钮

该技术演示如下:

// 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");

使用该方法我也有同样的问题:您可以看到原始分隔符仍然可见,位于编辑控件左边缘附近。是否可能已将编辑控件的高度设置为足以遮挡后面的分隔符?进一步检查后,看起来父控件是一个对话框,而不是工具栏。我认为我们选择了一个对话框,因为它的呈现方式不同。你结婚后会使用工具栏吗?或者,对话框对你有用吗?这是一个有趣的想法。我必须仔细看一看才能确定,但我认为我们还没有和工具栏结为夫妻。通过对对话框条进行一些研究,我想知道在这种情况下“钢筋”是否更合适:它当然是一种选择。在我们的例子中,我们使用了对话框栏,因为使用钢筋有一些限制,我现在记不起来了。谢谢你的帮助。我认为这两种方法中的一种是可行的。