《C++笔记》 Part13 MFC的CMFCToolBar中嵌入ComboBox和EditCtrl
1.MainFrm.h, 声明变量
CMFCToolBarComboBoxButton *m_comboAddress;
2.MainFrm.cpp, 在OnCreate函数中创建工具条并且插入一个组合框
if (!m_wndToolBar.CreateEx (this, TBSTYLE_FLAT,
CBRS_SIZE_FIXED | AFX_DEFAULT_TOOLBAR_STYLE) ||
!m_wndToolBar.LoadToolBar (IDR_MAINFRAME, uiToolbarColdID, uiMenuID,
FALSE /* Not locked */, uiToolbarDisID, 0, uiToolbarHotID, uiToolbarPresID))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
//插入组合框 ——动态插入的位置可以进入.res文件中查看具体的ID位置,其中Seperator占一个位置
m_wndToolBar.InsertButton(CMFCToolBarComboBoxButton(ID_GO_ADDRESS_Combo, 0), 3); //第三个按钮
//设置组合框属性
m_comboAddress = (CMFCToolBarComboBoxButton*)m_wndToolBar.GetButton(3); //假设插入在第三个按钮
m_comboAddress->EnableWindow(TRUE);
m_comboAddress->SetCenterVert();
m_comboAddress->SetDropDownHeight(100);//设置下拉列表的高度
m_comboAddress->SetFlatMode();
m_comboAddress->OnSize(65);//设置下拉列表宽度
//添加内容
m_comboAddress->AddItem(_T("once"));
m_comboAddress->AddItem(_T("if only"));
m_comboAddress->AddItem(_T("P.S.I Love You"));
m_comboAddress->AddItem(_T("Love Me If You Dare"));
m_comboAddress->SelectItem(0); //默认选中
DockPane (&m_wndToolBar);
- CMFCToolBarEditBoxButton与ComboBox类似,只是函数需要作适当变化
类似于:
CMFCToolBarEditBoxButton* m_EditButton;//这里我用默认构造函数
...
m_EditButton =NULL;//默认构造函数中设置为空
...
//1、OnCreate函数中添加
m_wndToolBar.InsertButton(CMFCToolBarEditBoxButton(ID_GO_ADDRESS_EDIT, 0), 5); //第5个编辑框,此处为动态插入的
m_EditButton= (CMFCToolBarEditBoxButton*)m_wndToolBar.GetButton(5); //假设插入在第5个按钮
m_EditButton->EnableWindow(TRUE);
m_EditButton->CanBeStreched();
m_EditButton->HaveHotBorder();//设置下拉列表的高度
m_EditButton->SetFlatMode();
m_EditButton->OnSize(65);//设置下拉列表宽度
//添加默认内容
m_EditButton->SetContents(_T("0.4"));
//2、此时在OnupdateEditBox(CCmdUI* pCmdUI)中实时刷新editbox中内容
CString t = m_EditButton->GetContentsAll(ID_GO_ADDRESS_EDIT);
CStringToString(t);//自定义转换函数
double m_text = abs(StrToDouble(t));//自定义转换函数
...
3.添加消息相应
3.1 在工具栏资源编辑器中加入id为IDR_COM的空白工具栏,
3.2 在头文件中定义组合框
CMFCToolBarComboBoxButton* m_ComboButton;
3.3 在.cpp的BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)中添加消息响应
ON_REGISTERED_MESSAGE(AFX_WM_RESETTOOLBAR, OnToolbarReset)
在头文件中声明消息函数:
afx_msg LRESULT OnToolbarReset(WPARAM,LPARAM);
在CMainFram中定义处理函数:
LRESULT CMainFrame::OnToolbarReset(WPARAM wp,LPARAM lp)
{
m_ComboButton = new CMFCToolBarComboBoxButton(IDR_COM,GetCmdMgr ()->GetCmdImage (IDR_COM, FALSE));
m_ComboButton->EnableWindow(true);
m_ComboButton->SetCenterVert();
m_ComboButton->SetDropDownHeight(25);
m_ComboButton->SetFlatMode();
m_ComboButton->AddItem(_T("OPTION1"));
m_ComboButton->AddItem(_T("OPTION2"));
m_ComboButton->SelectItem(0);
m_wndToolBar.ReplaceButton (IDR_COM, *m_ComboButton);
return 0;
}
3.4 添加组合框的事件消息响应函数
cpp文件中添加消息映射:
ON_COMMAND(IDR_COM, &CMainFrame::OnClickComboBox)
ON_CBN_SELCHANGE(IDR_COM,&CMainFrame::OnSelChangeClick)//别忘了在TOOLBAR中添加IDR_COM资源。
头文件中添加消息声明:
afx_msg void OnSelChangeClick();
afx_msg void OnClickComboBox();
.cpp消息处理函数:
void CMainFrame::OnSelChangeClick()
{
CMFCToolBarComboBoxButton* pSrcCombo = CMFCToolBarComboBoxButton::GetByCmd (IDR_COM, TRUE);
int index = m_ComboButton->GetCurSel();
index = pSrcCombo->GetCurSel();
CString str = pSrcCombo->GetItem(index);
}
void CMainFrame::OnClickComboBox()
{
}
注意:一定要GetByCmd;OnClickComboBox没有做任何处理,但是如果去掉的话,组合框将编程灰色,无法使用。
注:更新工具栏:
1.工具栏的右侧向下的小箭头->添加或删除按钮->标准->重置工具栏
2.运行regedit打开注册表->HKEY_CURRENT_USER->Software->工程名,找到工程名将其从注册表中删之。
参考文章:
1、MFC工具栏中加入combox组合框