您的位置:首页 > 其它

MFC--工具条插入下拉框控件(利用m_comboButton)

2017-03-16 18:29 387 查看
文章转自:

http://blog.csdn.net/chenjelly/article/details/6718478

http://blog.csdn.net/hemmingway/article/details/8143001

文章1:

(一)自定义工具栏

自定义工具栏,分两种情况:一是直接添加工具栏,并自己绘制图标;二是,添加工具栏,然后与BMP关联,与VC6.0中的自定义彩色工具栏类似。

1、  自绘工具栏

1)添加Toolbar 资源,并设置工具条ID,如IDR_TOOLBAR1;编辑工具条,添加相应的项,设置项的ID,绘制各自图标的。

2)在MainFrm.h中添加Toolbar变量:

public: 

            CMFCToolBar m_toolbar1;

3)在MainFrm.cpp中的OnCreate中添加代码:

if((!m_toolbar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |WS_VISIBLE |CBRS_TOP |CBRS_GRIPPER |CBRS_TOOLTIPS |CBRS_FLYBY |CBRS_SIZE_DYNAMIC,
CRect(1,1,1,1),IDR_TOOLBAR1)
|| (!m_ toolbar1.LoadToolBar(theApp.m_bHiColorIcons ? IDR_TOOLBAR1 : 0))
{
  TRACE0("Failed to create toolbar\n");
  return -1;      // fail to create
}
m_ toolbar1.SetWindowText(_T("MyToolbar"));
…………
m_ toolbar1.EnableDocking(CBRS_ALIGN_ANY);
…………
DockPane(&m_ toolbar1);

 

4)为各项添加各自需要的响应事件即可。

注意,VS2008中,没有VC6.0那样方便的ClassWizard,所以,要在CMainFrame的属性的事件去找,若项ID与菜单的ID是相关联,则能在事件列表中找到相应的ID ;否则,只得靠手动添加响应事件了。

 

2、  位图关联工具栏

1)添加Toolbar 资源,并设置工具条ID,如IDR_TOOLBAR1;编辑工具条,添加相应的项,设置项的ID,绘制各自图标的。

2)导入自己的位图资源,,ID设为:IDB_BITMAP_TOOLBAR

3)在MainFrm.h中添加Toolbar变量:

public:

           CMFCToolBar m_toolbar1;

4)在MainFrm.cpp中的OnCreate中添加代码:

if((!m_toolbar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |WS_VISIBLE |CBRS_TOP |CBRS_GRIPPER |CBRS_TOOLTIPS |CBRS_FLYBY |CBRS_SIZE_DYNAMIC,
CRect(1,1,1,1),IDR_TOOLBAR1)
|| (!m_ toolbar1.LoadToolBar(IDR_TOOLBAR1,0,0,TRUE,0,0,IDB_BITMAP_TOOLBAR))
//与前面方法的区别在此
{
  TRACE0("Failed to create toolbar\n");
  return -1;      // fail to create
}
m_ toolbar1.SetWindowText(_T("MyToolbar"));
…………
m_ toolbar1.EnableDocking(CBRS_ALIGN_ANY);
…………
DockPane(&m_ toolbar1);

5)为各项添加各自需要的响应事件即可。

 

(二)   在工具栏上添加组合框

在网上查找到的资料:

VC2008在CMFCToolBar工具栏中加入组合框:(这种方法,我没实现了)

http://hi.baidu.com/zll2117/blog/item/80792e0fe5ce3ad87bcbe1c9.html

VC 2010:CMFCToolbar工具条中加入组合框  :(利用这种方法,实现了我所要求的功能)

http://zhanyonhu.blog.163.com/blog/static/161860442010111595752929/

总结得出,在工具栏上添加组合框的操作如下:

1)自定义ComboBox的ID。在Resource.h中定义为(自己手动添加的定义)

#define  IDR_COM             32800

2)在MainFrm.h中添加工具栏组合框指针变量:

public:

            CMFCToolBarComboBoxButton  *m_comboButton;

3)在MainFrm.cpp中的OnCreate中添加代码:

       …………

       m_comboButton = new CMFCToolBarComboBoxButton(IDR_COM,

              GetCmdMrg()->GetCmdImage(IDR_COM,FALSE),// 工具条位图中的图像序号

              CBS_DROPDOWNLIST,                                             //组合框类型

               100);                                                                             //组合框的宽度

       m_ comboButton->EnableWindow(TRUE);

       m_ comboButton->SetCenterVert();

       m_ comboButton->SetDropDownHeight(100);//设置下拉列表的高度

       m_ comboButton->SetFlatMode();

       //添加内容

       m_ comboButton->AddItem(_T(“Once”));

       m_ comboButton->AddItem(_T(“If Only”));

       m_ comboButton->AddItem(_T(“P.S.I Love You”));

       m_ comboButton->AddItem(_T(“Love Me If You Dare”));

       m_ comboButton->SelectItem(0);//默认选中

      

       //添加到工具栏

       m_wndToolBar.InsertSeparator();//先添加分隔条

       m_wndToolBar.InsertButton(m_ comboButton);

//在使用中,遇到这个情况,MSDN中InsertButton为public成员函数,而在CMFCToolBar类的声明中却为protected成员,我解决的方法是把它改为public成员。目前我没有找其他解决方法。若以后找到,再更新。

…………

4)添加响应

1)在MainFrm.h中添加:

       afx_msg void OnSelChangeClick();//SEL_CHANGE

       afx_msg void OnClickComboBox();//ON_COMMAND

2)在MainFrm.cpp中添加消息映射和消息响应函数

……

       ON_CBN_SELCHANGE(IDR_COM, &CMainFrame::OnSelChangeClick)

       ON_COMMAND(IDR_COM, &CMainFrame::OnClickComboBox)

END_MESSAGE_MAP()

 

void CMainFrame::OnSelChangeClick()

{

       //可以添加需要处理的代码

}

 

void CMainFrame::OnClickComboBox()

{

       //不做任何处理,但必须添加,否则组合框是灰色不可用的

}

 

到此,添加操作完成。

上述所有操作,都经本人在VS2008环境下验证通过。

效果如下:

文章2:

刚在CSDN博客上面看到一篇文章,讲解VS2008中的新类CMFCToolBar的使用, 其中有个关于插入组合框的部分居然要修改MFC的源代码,  文章链接 http://blog.csdn.net/chenjelly/article/details/6718478  

这里贴出正确的插入方法:

1. MainFrm.h, 声明变量

[cpp] view
plain copy

 print?

CMFCToolBarComboBoxButton  *m_comboAddress;  

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

[cpp] view
plain copy

 print?

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  

    }  

  

    //插入组合框  

    m_wndToolBar.InsertButton   

        (CMFCToolBarComboBoxButton(ID_GO_ADDRESS_EDIT, 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->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);  

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


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->工程名,找到工程名将其从注册表中删之。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐