MFC工具栏中加入combox组合框

在MFC的工具栏上显示组合框,如下图所示:


CSDN博客上有人总结过,http://blog.csdn.net/hemmingway/article/details/8143001  如下

1. MainFrm.h, 声明变量

  1. CMFCToolBarComboBoxButton  *m_comboAddress;  

2. MainFrm.cpp, 在OnCreate函数中创建工具条并且插入一个组合框

  1. if (!m_wndToolBar.CreateEx (this, TBSTYLE_FLAT,  
  2.         CBRS_SIZE_FIXED | AFX_DEFAULT_TOOLBAR_STYLE) ||  
  3.         !m_wndToolBar.LoadToolBar (IDR_MAINFRAME, uiToolbarColdID, uiMenuID,   
  4.         FALSE /* Not locked */, uiToolbarDisID, 0, uiToolbarHotID, uiToolbarPresID))  
  5.     {  
  6.         TRACE0("Failed to create toolbar\n");  
  7.         return -1;      // fail to create  
  8.     }  
  9.   
  10.     //插入组合框  
  11.     m_wndToolBar.InsertButton   
  12.         (CMFCToolBarComboBoxButton(ID_GO_ADDRESS_EDIT, 0), 3);  
  13.       
  14.     //设置组合框属性  
  15.     m_comboAddress = (CMFCToolBarComboBoxButton*)m_wndToolBar.GetButton(3);  
  16.     m_comboAddress->EnableWindow(TRUE);  
  17.     m_comboAddress->SetCenterVert();  
  18.     m_comboAddress->SetDropDownHeight(100);//设置下拉列表的高度  
  19.     m_comboAddress->SetFlatMode();  
  20.       
  21.     //添加内容  
  22.     m_comboAddress->AddItem(_T("once"));  
  23.     m_comboAddress->AddItem(_T("if only"));  
  24.     m_comboAddress->AddItem(_T("P.S.I Love You"));  
  25.     m_comboAddress->AddItem(_T("Love Me If You Dare"));  
  26.     m_comboAddress->SelectItem(0);           //默认选中  
  27.   
  28.   
  29.     DockPane (&m_wndToolBar);  
(这里完成后,还需添加消息响应函数)

另外的就是网上找的一篇文章了


VC2008在CMFCToolBar工具栏中加入组合框

如何在CMFCToolBar工具栏中加入组合框等控件,且先看在线MSDN上怎么说的:

To add a combo box button to a toolbar, follow these steps:

1. Reserve a dummy resource ID for the button in the parent toolbar resource.

2. Construct a CMFCToolBarComboBoxButton object.

3. In the message handler that processes the AFX_WM_RESETTOOLBAR message, replace the dummy button with the new combo box button by using CMFCToolBar::ReplaceButton.

具体过程如下:

1.在工具栏资源编辑器中加入id为IDR_COM的空白工具栏,

2.在头文件中定义组合框

CMFCToolBarComboBoxButton* m_ComboButton; 

3.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;
}

2、添加组合框的事件消息响应函数

消息映射:

ON_COMMAND(IDR_COM, &CMainFrame::OnClickComboBox)
 ON_CBN_SELCHANGE(IDR_COM,&CMainFrame::OnSelChangeClick)//别忘了在TOOLBAR中添加IDR_COM资源。

消息声明:

afx_msg void OnSelChangeClick();
 afx_msg void OnClickComboBox();

消息处理函数:

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->工程名,找到工程名将其从注册表中删之。
将2008中的消息响应函数加在上述2010中,才能完成组合框的点击操作。

==========红色字体为本人添加===================

我的实现是:

1、在资源toolbar当中添加一个新资源,并命名ID_GO_ADDRESS_EDIT
2、在MainFrm.h当中,CMFCToolBarComboBoxButton  *m_comboAddress; 
3、在MainFrm.cpp当中,OnCreate函数里,添加
   //插入组合框  
    m_wndToolBar.InsertButton   
        (CMFCToolBarComboBoxButton(ID_GO_ADDRESS_EDIT, 0), 5);  //(1)
      
    //设置组合框属性  
    m_comboAddress = (CMFCToolBarComboBoxButton*)m_wndToolBar.GetButton(5);  //(2)
    m_comboAddress->EnableWindow(TRUE);  
    m_comboAddress->SetCenterVert();  
    m_comboAddress->SetDropDownHeight(100);//设置下拉列表的高度  
    m_comboAddress->SetFlatMode();  
      
    //添加内容  
    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);           //默认选中  
4、添加组合框的事件消息响应函数
    消息映射:
    ON_COMMAND(IDR_COM, &CMainFrame::OnClickComboBox)
    ON_CBN_SELCHANGE(IDR_COM,&CMainFrame::OnSelChangeClick)//别忘了在TOOLBAR中添加IDR_COM资源。
   消息声明:
    afx_msg void OnSelChangeClick();
    afx_msg void OnClickComboBox();
   消息处理函数:
    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()
    {
     }

对于组合框位于工具栏中的哪个位置,是由上述代码中的(1)(2)中的5决定的,并且这两个代码中的此值必须相同。


MFC(Microsoft Foundation Classes)ComboBox控件是一种组合了编辑(编辑文本)和下拉列表的控件。默认情况下,当你在ComboBox的编辑输入时,它可能会自动选择列表与输入匹配的第一个项,这个行为被称为自动完成或自动选择行为。 如果你希望禁止这种自动选择行为,可以通过处理CBN_EDITUPDATE消息来阻止。CBN_EDITUPDATE是当ComboBox的编辑内容更新时发送的通知消息。通过重写CComboBox的PreSubclassWindow或者消息处理函数,可以对CBN_EDITUPDATE消息进行处理,阻止自动选择行为。 以下是一个简单的示例代码,展示如何在MFCComboBox控件禁止编辑自动选择行为: ```cpp void CYourDialog::OnComboBoxEditUpdate(UINT_PTR nID, LPNMHDR pnmh, BOOL& bHandled) { // 假设你的ComboBox控件的ID是IDC_YOUR_COMBOX if (nID == IDC_YOUR_COMBOX) { // 获取当前编辑的内容 CString strText; GetDlgItemText(nID, strText); // 在这里可以添加你的逻辑,比如过滤、验证等 // 不要调用默认的消息处理函数 bHandled = TRUE; } } // 或者使用PreSubclassWindow来处理 void CYourComboBox::PreSubclassWindow() { CComboBox::PreSubclassWindow(); // 为CBN_EDITUPDATE添加消息处理函数 afx_msg void OnComboBoxEditUpdate(NMHDR* pNMHDR, LRESULT* pResult); DECLARE_MESSAGE_MAP() BEGIN_MESSAGE_MAP(CYourComboBox, CComboBox) ON_CBN_EDITUPDATE(IDC_YOUR_COMBOX, &CYourComboBox::OnComboBoxEditUpdate) END_MESSAGE_MAP() } void CYourComboBox::OnComboBoxEditUpdate(NMHDR* pNMHDR, LRESULT* pResult) { // 处理逻辑 *pResult = 0; } ``` 在这段代码,`OnComboBoxEditUpdate`是消息处理函数,它会检查消息的发送者是否是你想要处理的ComboBox。如果是,它将执行特定的逻辑来处理编辑内容更新,但不调用默认的消息处理函数,从而禁止了自动选择行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值