工具栏中嵌入Combo Box

时间:2023-01-20 08:57:47

1.在资源视图的toolbar资源的IDR_MAINFRAME中找一个放置combo box控件的地方,将它的ID设置为ID_COMBO

2.利用类向导创建下面这个类:

class CToolBarWithCombo : public CToolBar
{
public:
CComboBox m_comboBox;

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CToolBarWithCombo)
//}}AFX_VIRTUAL

BOOL CreateComboBox(class CComboBox& comboBox,
UINT nIndex,
UINT nID,
int nWidth,
int nDropHeight);

// Generated message map functions
protected:
//{{AFX_MSG(CToolBarWithCombo)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

相应地实现类的方法:

BOOL CToolBarWithCombo::CreateComboBox(CComboBox& comboBox, UINT nIndex, UINT nID, int nWidth, int nDropHeight)
{
// Create the combo box
SetButtonInfo(nIndex, nID, TBBS_SEPARATOR, nWidth);

CRect rect;
GetItemRect(nIndex, &rect);
rect.top = 1;
rect.bottom = rect.top + nDropHeight;
rect.left -= 60;
rect.right -= 28;//CBS_DROPDOWN or CBS_DROPDOWNLIST
if (!comboBox.Create(CBS_DROPDOWN|WS_VISIBLE|WS_TABSTOP|WS_VSCROLL|CBS_DROPDOWNLIST,
rect, this, nID))
{
TRACE("Failed to create combo-box\n");
return FALSE;
}
// 将输入框色设置为只读
//方法一:
comboBox.SetExtendedUI(1);

//方法二
//CEdit* pEdit = (CEdit*)comboBox.GetWindow(GW_CHILD);
//pEdit->SetReadOnly();
return TRUE;
}

3.在CMainFrame的类声明中,将 

CMFCToolBar       m_wndToolBar;

改写成:
CToolBarWithCombo m_wndToolBar;

这里记得包含头文件

#include "ToolBarWithCombo.h"

4.在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(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
//********************************************************************************************从这下面开始添加*********************************
// Combo box is assigned index of 3, this means it will be placed after the
// third button in a toolbar
if (!m_wndToolBar.CreateComboBox(m_wndToolBar.m_comboBox, 4, ID_COMBO, 130, 150))//这里的130如果设置成150,下拉箭头就没有了,没有明白
{
TRACE0("Failed to create toolbar's combo box\n");
return -1; // fail to create
}
m_wndToolBar.m_comboBox.SetDroppedWidth(300);//设置下拉框的宽度

m_wndToolBar.m_comboBox.AddString(_T("123"));
m_wndToolBar.m_comboBox.AddString(_T("453"));
m_wndToolBar.m_comboBox.AddString(_T("123"));
m_wndToolBar.m_comboBox.AddString(_T("654"));
m_wndToolBar.m_comboBox.AddString(_T("321"));
m_wndToolBar.m_comboBox.AddString(_T("123"));
m_wndToolBar.m_comboBox.AddString(_T("456"));
m_wndToolBar.m_comboBox.AddString(_T("789"));
m_wndToolBar.m_comboBox.AddString(_T("sadlkfals;kdjfalkas;djf"));


这里我将后续遇到的问题列在这里:

1.之前在这里

m_wndToolBar.CreateComboBox(m_wndToolBar.m_comboBox, 4, ID_COMBO, 130, 150)

只能讲倒数第二个参数设置成<=130才能正常显示,实际上是由于工具栏长度太短,不够放下这个控件,导致控件显示不完整,我使用的方法是在放置控件的位置后面再添加几个位置,但这些位置的ID不能相同(也不能喝放置控件位置的ID相同)

工具栏中嵌入Combo Box

2.据说要在放置控件的前面增加一个分隔符,我做的时候没有增加也能正常,那就看情况吧


在实现的过程中遇到一个问题:不能使用下面的代码为ToolBar添加标题:

m_wndToolBar.SetWindowText(_T("着色方式"));
究其原因,在创建ToolBar时,需要为CreatEx的最后两个默认的参数赋值(对比前面的看一下吧):

if(!CreateEx(pParentWnd_ToolBar, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY /*| CBRS_SIZE_FIXED*/,CRect(1,1,1,1),7000) ||!LoadToolBar(nID_ToolBar))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}

如果要在ToolBar中嵌入CStatic控件作为显示ComboBox的lable,方法是类似的。


最终实现的效果:

工具栏中嵌入Combo Box



如果实现过程存在什么问题,欢迎留言探讨!