《C++笔记》 Part13 MFC的CMFCToolBar中嵌入ComboBox和EditCtrl

《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组合框

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页