VCMFC中使用工具栏控件详解

合集下载

VC实现工具栏

VC实现工具栏

VC实现工具栏(2010-08-02 20:34:33)转载原文标签:转载原文地址:VC实现工具栏作者:天涯霜雪首先,需要具备几个条件,一是工具栏具有CBRS_TOOLTIPS风格,二是工具栏的父窗口需要处理TTN_NEEDTEXT通知消息.在MFC类库中,CFrameWnd默认处理了TTN_NEEDTEXT 通知消息,因此在文档视图结构的应用程序中,只要工具栏拥有CBRS_TOOLTIPS风格,就能显示提示信息.如果在对话框中添加TTN_NEEDTEXT通知消息,需要消息映射部分添加如下代码:ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTipNotify)函数原型:OnToolTipNotify(UINT id,NMHDR *pNMHDR,LRESULT *pResult)参数说明:id:是发送消息的控件ID,但此处没有用,因为控件ID可以来自于pNMHDR.pNMHDR:是一个NMHDR结构指针(实际应该是NMTTDISPINFO结构指针),NMHDR结构记录了发送消息的控件ID,句柄等信息.pResult:表示结果代码指针,TTN_NEEDTEXT消息可以忽略该参数.实现过程:定义一个CToolBar变量m_wndToolBar,创建一个工具栏资源.在OnInitDialog方法中创建工具栏://创建工具栏if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS |CBRS_SIZE_DYNAMIC|CBRS_BORDER_TOP ) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1)){TRACE0("Failed to create toolbarn");return -1; // fail to create}//设置图象和按钮的大小,为了适当的演示按钮文本m_wndToolBar.GetToolBarCtrl().SetBitmapSize(CSize(16,16));m_wndToolBar.GetToolBarCtrl().SetButtonSize(CSize(32,32));//设置按钮文本m_wndToolBar.SetButtonText(0,"新建");m_wndToolBar.SetButtonText(1,"打开");m_wndToolBar.SetButtonText(2,"保存");m_wndToolBar.SetButtonText(4,"剪切");m_wndToolBar.SetButtonText(5,"复制");m_wndToolBar.SetButtonText(6,"粘贴");m_wndToolBar.SetButtonText(8,"打印");m_wndToolBar.SetButtonText(10,"帮助");RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); // TODO: Add extra initialization herereturn TRUE; // return TRUE unless you set the focus to a control在消息影射部分添加消息映射:ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify)接收函数部分:afx_msg BOOL OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult );函数实现:一种BOOL CMainFrame::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult) {TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;UINT nID =pNMHDR->idFrom; //获取工具栏按钮IDint index = m_wndToolBar.GetToolBarCtrl().CommandToIndex(nID);//根据ID获取按钮索引 CString str;switch(index){case 0:pTTT->lpszText = "检测窗口";break;case 1:pTTT->lpszText = "分析窗口";break;case 2:pTTT->lpszText = "网络连接";break;case 3:pTTT->lpszText = "显示图像";break;case 4:pTTT->lpszText = "开始录像";break;case 5:pTTT->lpszText = "存入数据库";break;case 6:pTTT->lpszText = "读取数据库文件";break;case 7:pTTT->lpszText = "阀位分析查询";break;case 8:pTTT->lpszText = "报表打印";break;default:pTTT->lpszText = "什么东西?";break;}pTTT->hinst = AfxGetResourceHandle();return(TRUE);}另一种:BOOL CToolHintDlg::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult) {TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;UINT nID =pNMHDR->idFrom; //获取工具栏按钮IDint index = m_wndToolBar.GetToolBarCtrl().CommandToIndex(nID);//根据ID获取按钮索引 m_wndToolBar.GetButtonText(index,m_ToolText);//获取按钮文本pTTT->lpszText =m_ToolText.GetBuffer(0);//设置显示的提示信息pTTT->hinst = AfxGetResourceHandle();return(TRUE);}。

VS2010 MFC多文档中的工具栏CMFCToolBar停靠的问题

VS2010 MFC多文档中的工具栏CMFCToolBar停靠的问题

今天遇到了一个问题,关于VS2010 MFC多文档中的工具栏CMFCToolBar停靠的问题。

关于CMFCToolBar的一些介绍网上也有人介绍过,就不过多介绍了,直奔主题。

解决问题的关键点就在于,如想将CMFCToolBar正常停靠的话,需要在其Create的时候,加上后面的ID,使其ID值不能相同。

目的:我一共有四个工具栏,想将它进行停靠在两行,每行两个工具栏。

做法:1. 在InitInstance的适当地方加入CleanState(_T("WorkSpace"));2. 在CMainFrame的类定义中加入CMFCToolBar m_wndToolBar2;CMFCToolBar m_wndToolBar3;CMFCToolBar m_wndToolBar4;3. 在CMainFrame中的OnCreate中加入:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){...if (!m_wndToolBar2.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY| CBRS_SIZE_DYNAMIC) ||!m_wndToolBar2.LoadToolBar(IDR_TOOLBAR3)){TRACE0("未能创建工具栏\n");return -1; // 未能创建}if (!m_wndToolBar3.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY| CBRS_SIZE_DYNAMIC) ||!m_wndToolBar3.LoadToolBar(IDR_PROPERTIES)){TRACE0("未能创建工具栏\n");return -1; // 未能创建}if (!m_wndToolBar4.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY| CBRS_SIZE_DYNAMIC) ||!m_wndToolBar4.LoadToolBar(IDR_SORT)){TRACE0("未能创建工具栏\n");return -1; // 未能创建}...m_wndToolBar2.SetWindowText( _T("JunxToolBar2") );m_wndToolBar3.SetWindowText( _T("JunxToolBar3") );m_wndToolBar4.SetWindowText( _T("JunxToolBar4") );...m_wndToolBar2.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);m_wndToolBar3.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);m_wndToolBar4.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);...m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY);m_wndToolBar3.EnableDocking(CBRS_ALIGN_ANY);m_wndToolBar4.EnableDocking(CBRS_ALIGN_ANY);...DockPaneLeftOf(&m_wndToolBar2, &m_wndToolBar); // 将m_wndToolBar2停靠在m_wndToolBar的左边DockPane(&m_wndToolBar3); // 将m_wndToolBar3停靠在下一行DockPaneLeftOf(&m_wndToolBar4, &m_wndToolBar3); // 将m_wndToolBar4停靠在m_wndToolBar3的左边...}结果:做法很简单,但是出现一个奇怪现象,就是在下面的工具条竟然不见了。

VS2010和MFC编程入门之37(工具栏:工具栏的创建、停靠与使用)

VS2010和MFC编程入门之37(工具栏:工具栏的创建、停靠与使用)

VS2010MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)工具栏资源及CToolBar类,这里继续讲解工具栏的相关知识,主要内容包括工具栏的创建、停靠与使用。

工具栏的使用前面曾提到过,一般情况下工具栏中的按钮在菜单栏中都有对应的菜单项,两者实现的功能相同,要想实现这种效果,只需要将工具栏按钮的ID与对应的菜单栏中菜单项的ID设置为相同值即可。

在实际使用工具栏时,除了前面讲的资源编辑外,其他使用与菜单类似。

例如,对COMMAND消息和UPDATE_COMMAND_UI消息,可以像VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用)中的菜单应用实例那样为工具栏按钮添加消息处理函数。

如果工具栏按钮对应的菜单项已经添加了消息处理函数,那么就不必再为它添加了,因为它的ID与菜单项相同,所以会调用同样的消息处理函数。

这样点击工具栏按钮与点击相应菜单项执行相同的功能,在菜单项为选中、激活或禁用等状态时,工具栏按钮会有一样的状态。

工具栏的创建大家在第三十四讲创建的Example34工程的CMainFrame类中看到,它创建工具栏所使用的类并不是常用的CToolBar类,而是CMFCToolBar类。

CMFCToolBar类是自VS2008以来MFC提供的类,它与CToolBar类有些类似,但功能更丰富。

这里要注意,CMFCToolBar类与CToolBar类并没有任何派生关系。

鸡啄米这里就以CMFCToolBar类来讲讲工具栏的创建步骤:1. 创建工具栏资源。

2. 构造CMFCToolBar类的对象。

3. 调用CMFCToolBar类的Create或CreateEx成员函数创建工具栏。

4. 调用LoadToolBar成员函数加载工具栏资源。

大家可以对应着看看Example34的CMainFrame类自动生成的代码中创建工具栏的过程。

工具栏IDR_MAINFRAME的资源已经自动创建好。

VCMFC中的CComboBox控件使用详解

VCMFC中的CComboBox控件使用详解

VCMFC中的CComboBox控件使用详解VC/MFC中的CComboBox控件使用详解CComboBox控件详解CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down list).CComboBox控件的常用设置属性说明:type属性:里面一共有三个选项.就是其三种形式, 我们常用的是后两种形态,其区别就是Dropdown的编辑区为可编辑控件,而droplist 为静态控件.Data属性:当程序初始化的时候,下拉列表将显示其属性里面的内容,内容用分号分隔.其属性只支持后2中形式,Sort 属性:对添加到下拉列表框中的数据自动进行排序,如果你不想他改变你的显示序列,把他设置成False.控件是一个窗口.其基类是为CWnd.所以CComboBox也可以使用CWnd的一些函数,它自己的函数有30几种.我写了一个示范程序,演示了一些常用的函数,你可以参考其代码看到其功能.注:m_cbox 为CComboBox控件的关联变量,m_end为EDIT控件的关联变量1.GetCount() 函数:用以获得列表框中的选项数目. int GetCount() const;(此乃函数原型,我会列在每条的后面) 下面的例子是程序中各个按钮里面的代码int i;CString str;i=m_cbox.GetCount();str.Format ("%d",i);m_end="一共有"+str+"个数据";UpdateData(FALSE);2.GetCurSel() 函数:用以得到用户选中下拉列表框中数据的索引值.返回的值是重0开始的,如果没有选择任何选项将会返回-1 Int GetCurSel() constint i;CString str;i=m_cbox.GetCurSel ();str.Format ("%d",i+1);if (i==-1) m_end="你什么都没有选";else m_end="你选的是第"+str+"项";UpdateData(FALSE);3.SetCurSel函数:选取列表框中的一个选项,索引从0开始,-1为什么都不选.当你需要把列表框中已经选取的内容清空时就可以使用这个函数;if(m_i<3) m_cbox.SetCurSel (m_i++);//m_i为int型变量用以计数else {m_cbox.SetCurSel (-1);m_i=0;}4.SetEditSel函数:设置编辑区中蓝色选中字段的长度, BOOL SetEditSel( intnStartChar,int nEndChar ); nStartChar是起始的位置,当设置为-1时为不选择任何字段,nEndChar是结束位置.还有一个对应的函数GetEditSel是取得其位置,在此不详解.m_cbox.SetEditSel (3,5);//在编辑框中打入一串数字在按此按钮就能看到效果//其作用就是选中第3到第5个字符作为热点5.Clear() Cut() Paste() Copy() 这四个函数我放在一起说,因为他们都是针对编辑框中选定的文字进行编辑的函数,很多初学者很不明白这4个函数,使用这些函数没有作用,其实不然,这些函数对于在编辑框中的内容不进行处理,他真正处理的是你用鼠标选中的内容,对于Clear()函数很多书中解释都是有误的,很多书中对他的解释是清除当前选中的文本,我认为这样的解释是有歧异的,真正的解释是把你刚选中的文本释放掉,也就是不选,而不是把选中的删除,真正的删除选中的文本的函数是Cut(),Copy()是复制选中的文本,Paste()是粘贴到光标处.其演示就不写在程序中,有兴趣的朋友可以自己试试.6.LimitText()函数.其作用是限制在编辑框中键入的文本长度,BOOL LimitText(int nMaxChars); 当nMaxChars为0时,不是不能输入,而是长度最大化为65535字节7.GetLBText()函数.其原型为void GetLBText( int nIndex, CString&rString ).nIndex为列表框中数据的索引值,rString 为字符串,其作用就是把索引号为nIndex的数据放到rString变量中.与其对应的GetLBTextLen(intnIndex)函数就是得到索引号为nIndex中数据的长度m_cbox.GetLBT ext (2,m_end); // GetLBText按钮UpdateData(0);CString str; //GetLBTextLen按钮int i=m_cbox.GetLBTextLen (2);str.Format ("%d",i);m_end=str;UpdateData(FALSE);8.AddString() DeleteString() InsertString() ResetContent() 四个函数放在一起,他们都是针对下拉列表框的处理函数, AddString(LPCTSTR lpszString) 是在列表框的尾巴添加一条数据,参数为字符串. DeleteString(UINT nIndex)为删除指定索引为nIndex的数据. InsertString(int nIndex, LPCTSTR lpszString)在索引nIndex处插入IpszString的内容. ResetContent()是清除列表框中所有的内容.9.SetDroppedWidth(UINT nWidth) 函数.用于设定下拉列表框的最小宽度,当下拉列表框中的数据很长不能完全显示时,我们可以使用这个函数把列表框的宽度设置的大些.同样GetDroppedWidth()是返回列表框的宽度.以下为总结了各大论坛中对CCombBox控件使用的问题.并给出了正解.1.关于CComboBox在对话框中没有下拉项目的问题答: 资源编辑器中对话框中CComboBox组件的垂直范围拉大了下,就看见字体了,看到那个向下的黑箭头了吗,点他下拉,嘿嘿就这么简单.2.请问怎样能让CCombobox记住用户的输入.下次使用时还有答: 要记住用户的输入必须用到文件读写,或者把内容添加到注册表中,我会在以后给出解决办法.3. CCOMBOBOX如何使它只读,不能编辑答: 看了本文的介绍也许你现在知道了, CCOMBOBOX有三种类型的,选择你需要的吧!4. 我要让界面一显示,就能在Combo框中显示默认的数据答: 你要在OnInitDialog里面加上我上面所提到的SetCurSel()函数就行了.5. 如何把选好的内容赋给变量答: 先给CCOMBOBOX设置一个CString关联变量,再添加事件处理函数CBN_ Selchange.使用UpdateData(FALSE)就行了.6. 在CComboBox组合框中,条目的对齐方式是左对齐,能设置为对中或者右对齐吗?答: 没有直接的方法,你必须自己对齐, 比如最大长度是10int i;String.Format("%10d", i);CComboBox->AddStringVC combobox 使用大全 ---------------------------------------------------一、如何添加/删除Combo Box内容1. 在Combo Box控件属性的Data标签里面添加,一行表示Combo Box下拉列表中的一行。

VC++MFC 常用控件使用方法

VC++MFC 常用控件使用方法

VC++MFC 常用控件使用方法4.1 Button按钮窗口(控件)在MFC中使用CButton表示,CButton包含了三种样式的按钮,Push Button,Check Box,Radio Box。

所以在利用CButton对象生成按钮窗口时需要指明按钮的风格。

创建按钮:BOOL CButton::Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );其中lpszCaption是按钮上显示的文字,dwStyle为按钮风格,除了Windows风格可以使用外(如WS_CHILD|WS_VISUBLE|WS_BORDER)还有按钮专用的一些风格。

BS_AUTOCHECKBOX 检查框,按钮的状态会自动改变 Same as a check box, except thata check mark appears in the check box when the user selects the box; the checkmark disappears the next time the user selects the box.BS_AUTORADIOBUTTON 圆形选择按钮,按钮的状态会自动改变 Same as a radio button, except that when the user selects it, the button automatically highlights itself andremoves the selection from any other radio buttons with the same style in the same group.BS_AUTO3STATE 允许按钮有三种状态即:选中,未选中,未定 Same as a three-state check box, except that the box changes its state when the user selects it.BS_CHECKBOX 检查框 Creates a small square that has text displayed to its right (unless this style is combined with the BS_LEFTTEXT style).BS_DEFPUSHBUTTON 默认普通按钮 Creates a button that has a heavy black border.The user can select this button by pressing the ENTER key. This style enables theuser to quickly select the most likely option (the default option).BS_LEFTTEXT 左对齐文字 When combined with a radio-button or check-box style, the text appears on the left side of the radio button or check box.BS_OWNERDRAW 自绘按钮 Creates an owner-drawn button. The framework calls the DrawItem member function when a visual aspect of the button has changed. Thisstyle must be set when using the CBitmapButton class.BS_PUSHBUTTON 普通按钮 Creates a pushbutton that posts a WM_COMMAND message to the owner window when the user selects the button.BS_RADIOBUTTON 圆形选择按钮 Creates a small circle that has text displayed to its right (unless this style is combined with the BS_LEFTTEXT style). Radio buttons are usually used in groups of related but mutually exclusive choices.BS_3STATE 允许按钮有三种状态即:选中,未选中,未定 Same as a check box, except that the box can be dimmed as well as checked. The dimmed state typically is used toshow that a check box has been disabled.rect为窗口所占据的矩形区域,pParentWnd为父窗口指针,nID为该窗口的ID值。

VC MFC中使用工具栏控件详解

VC MFC中使用工具栏控件详解

VC MFC工具栏(CToolBar)控件工具栏工具栏控件在控件面板里没有对应的选项(图标),但有一个工具栏控件类CToolBar,所以我们如果要创建一个工具栏控件并显示在窗口里的话,只能用代码来完成,事实上任何一种控件,都可以用代码创建,如CButton按钮类,现举一个用代码创建按钮控件并显示在窗口里的例子。

CButton类的Create成员函数可以创建一个按钮控件,这个函数的格式如下:BOOL CButton::Create(LPCTSTR lpszCaption,//按钮显示的文本DWORD dwStyle,//按钮样式const RECT& rect,//按钮控件显示的区域(大小)相对于父窗口CWnd* pParentWnd,//按钮的父窗口(按钮属于哪个窗口)UINT nID//指明按钮控件ID号);这个函数的第二个参数dwStyle是按钮控件的样式,也就是在可视化添加按钮控件时,右击按钮控件,选择属性,之后会弹出一个对话框,这个对话框有一个样式的选项,该参数即对应这个样式。

好了,了解了上面这些我们就来动态创建一个按钮吧,首先在对应话类里添加一个按钮类成员变量CButtonm_Button;然后在对话框编辑区里给对话框添加一个按钮控件(单击这个按钮创建按钮控件),然后添加这个按钮控件单击消息处理函数,并在函数添加以下语句:RECT ButtonRect;//按钮控件显示的区域(大小)相对于父窗口ButtonRect.left=10;ButtonRect.top=10;ButtonRect.right=80;ButtonRect.bottom=30;m_Button.Create("动态创建",WS_CHILD,ButtonRect,this,1115);m_Button.ShowWindow(SW_SHOW);//显示按钮控件知道了怎样动态创建按钮控件,我们就来创建工具栏控件。

MFC基础,图标,光标,标题,工具栏,状态栏等(最细致的讲解

MFC基础,图标,光标,标题,工具栏,状态栏等(最细致的讲解

MFC基础,图标,光标,标题,工具栏,状态栏等(最细致的讲解改变窗口大小和标题修改:在Cmainframe中的precreatewindow中cs.cx=600;cs.cy=600;cs.style=cs.style&~FWS_ADDTOTITLE;cs.lpszName="jiaotong";光标,背景在CMyview中的precreatewindow中cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,LoadCursor(NULL,IDC_HELP),(HBRUSH)GetStockObject(BLACK_BRUSH),0);动态图标修改:首先在resources中的Icon中插入两个图标然后按照以下步骤1.在mainframe类里的m_wndStatusBar中添加HICON的一个数组,大小为2public:HICON m_hIcons[2];2.在CMainFrame::OnCreate里加载图标m_hIcons[1]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));m_hIcons[2]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON2)); SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[1]);//将开始的图标设置为第一个图标SetTimer(1,1000,NULL);3.自定义一个定时器(点击右键选择add windows Message。

在里面选择VM_TIMER)void CMainFrame::OnTimer(UINT nIDEvent){static int i=1;SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[i+1]);i=++i%2;CFrameWnd::OnTimer(nIDEvent);}工具栏添加属性:1。

VC++在MFC程序中使用XML文件配置工具栏,带图

VC++在MFC程序中使用XML文件配置工具栏,带图

VC++在MFC程序中使用XML文件配置工具栏,带图现在我发现使用Visual Studio的资源编辑器进行编辑资源有着诸多的不便:首先是任何资源的变动一般变动代码,不利于系统维护,其次Visual Studio的资源编辑器的本身的功能有限,也不利于界面美化,三是不利于人员分工,开发人员既要忙实现功能,又要忙准备好的界面素材。

对界面实现文件配置化正是解决上面问题的好方法。

这次我实现了使用XML文件配置工具栏。

这里所谓配置就是工具栏的界面信息如工具栏标题、按钮图片、是否为分隔符都在XML文件保存,程序通过解析XML文件来获取工具栏信息来创建工具栏。

这样一旦发现界面不合适可以随时修改配置文件,同时利于人员分工。

具体的做法如下:1. 在工程的输出目录下有一个SysConfig.xml,作为系统配置文件。

其中关于工具栏的配置部分如下:<AppToolbar valid="1" caption="基础工具"><ToolButton file="Add.bmp" /><ToolButton separator="true" /><ToolButton file="Benchmark.bmp" /><ToolButton file="Comment.bmp" /><ToolButton file="Convert.bmp" /><ToolButton file="Delete.bmp" /><ToolButton file="Exit.bmp" /></AppToolbar>简单解释一下上面的节点意义:valid表示工具栏是否有效,caption表示工具栏标题,file 节点为工具栏按钮所贴图片,separator表示按钮是分隔符。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC MFC工具栏(CToolBar)控件工具栏工具栏控件在控件面板里没有对应的选项(图标),但有一个工具栏控件类CToolBar,所以我们如果要创建一个工具栏控件并显示在窗口里的话,只能用代码来完成,事实上任何一种控件,都可以用代码创建,如CButton按钮类,现举一个用代码创建按钮控件并显示在窗口里的例子。

CButton类的Create成员函数可以创建一个按钮控件,这个函数的格式如下:BOOL CButton::Create(LPCTSTR IpszCaption,// 按钮显示的文本DWORD dwStyle,// 按钮样式const RECT & rect,// 按钮控件显示的区域(大小)相对于父窗口CWnd* pParentWnd,// 按钮的父窗口(按钮属于哪个窗口)UINT nlD〃指明按钮控件ID号);这个函数的第二个参数dwStyle是按钮控件的样式,也就是在可视化添加按钮控件时,右击按钮控件,选择属性,之后会弹出一个对话框,这个对话框有一个样式的选项,该参数即对应这个样式。

好了,了解了上面这些我们就来动态创建一个按钮吧,首先在对应话类里添加一个按钮类成员变量CButtonm_Button;然后在对话框编辑区里给对话框添加一个按钮控件(单击这个按钮创建按钮控件),然后添加这个按钮控件单击消息处理函数,并在函数添加以下语句:RECT ButtonRect;//按钮控件显示的区域(大小)相对于父窗口ButtonRect.left=10;ButtonRect.top=10;ButtonRect.right=80;ButtonRect.bottom=30;m_Button.Create(" 动态创建”,WS_CHILD,ButtonRect,this,1115);m_Button.ShowWindow(SW_SHOW);// 显示按钮控件知道了怎样动态创建按钮控件,我们就来创建工具栏控件。

首先在对话类中添加一个CToolBar类成员变量CToolBar m_Toolbar;然后在对话类文件中定义工具栏命令ID#define ID_BUTTON1 501#define ID_BUTTON2 502#define ID_BUTTON3 503接着我们就要创建工具栏资源了,用于工具栏按钮的显示图片方法是进入ResourceView(资源视图选项卡),再随便选中一个选项,右击选择插入,在弹出的对话框里选中Toolbar,点新建。

接着创建三个按钮。

如下图所示:会弹出一个对话框,在ID项填入ID_BUTT0N1 ,就可以了。

接着依次把两个ID号改为ID_BUTT0N2 , ID_BUT00N3。

在这个对话框里也可以改变工具栏按钮的大小。

接下来我们样在对话框类的OnlnitDialog函数里的所有代码之后,return TRUE;之间添加以下语句:m_Toolbar.Create(this);〃创建工具栏控件m_Toolbar.LoadToolBar(IDR_TOOLBAR1);〃装载工具栏资源CRect rect(100,100,200,200);〃m_Toolbar.MoveWindow(rect);〃移动工具栏在父窗口的位置m_Toolbar.ShowWindow(SW_SHOW);〃显示工具栏但这样显示工具栏不是很方便,特别是当窗口大小改变后,还要计算工具栏在窗口中的位置,有没有什么方法,可以根据窗口大小自动调整工具栏到合适的位置呢?答案是肯定的,RepositionBars函数可以做到。

实现方法如下,把上面的语句换成下面的:m_Toolbar.Create(this);〃创建工具栏控件m_Toolbar.LoadToolBar(IDR_TOOLBAR1);〃装载工具栏资源//该函数用于显示工具栏,并根据窗口大小自动调整工具栏的位置RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);而响应工具栏按钮单击消息,跟前面介绍的添加按钮单击消息差不多,进入类向导,找到要添加的工具栏按钮ID,添加COMMAND消息响应函数,如下图:工具栏按钮上显示真彩位图上面的例子有一个缺陷, 那就是工具栏按钮显示的图形, 不能超过256色,如果我想在工具栏按钮显示真彩位图,上面的方法显示是无法实现的,那这个功能是如何实现呢?SetlmageList 函数可以做到,既然要显示真彩位图,那就不能使用上面的工具栏资源( 256色),所以一切都得到用代码实现首先向工程引入六张位图(用于工具栏按钮显示的图片),假设 IDB_BITMAP3,IDB_BITMAP4,IDB_BITMAP5,IDB_BITMAP6 第一步:在对话框里添加两个成员变量分别是: CToolBar m_Toolbar; CImageList m 」mageList;第二步:在对话类文件添加以下宏定义:像要大,具体是按钮的要//比图像的宽大7或者以上,高6m_Toolbar.GetToolBarCtrl().SetImageList(&m_I mageList);//RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);ID 号分别为 IDB_BITMAP1 ,IDB_BITMAP2,,大小为50X38#define ID BUTTON1 501 #define ID BUTTON2 502 #define ID BUTTON3 503 #define ID BUTTON4 504 #define ID BUTTON5 505 #define ID BUTTON6 506接下来在对话框初始化函数OnInitDialog 后面添加如下语句:m_I mageList.Create(50,38,ILC_COLOR24|ILC_MASK,1,1);〃 图片大小必须一致CBitmap bmp; for(int i=0;i<6;i++)bmp.LoadBitmap(IDB_BITMAP1+i);m 」mageList.Add(&bmp,RGB(255,255,255)); bmp.DeleteObject();UINT nArray[6]; for(i=0;i<6;i++)nArray[i]=ID_BUTTON1+i;m_Toolbar.CreateEx(this);〃 创建工具栏控件,CreateEx 函数创建的工具栏,默认有浮动按钮属性m_Toolbar.SetButtons (nArray,6);〃 创建六个工具按钮,并依次设置 ID 号,对应nArray 数组的元素m_Toolbar.SetSizes(CSize(60,56),CSize(50,38));〃函数第一个是按钮大小,第二个是图像大小,按钮必须比图设置图像运行效果如下图:匚〕[返二il取消|TOM.花这里设置刘话控制-如果要响应工具栏按钮单击消息的话,必须手动添加消息映射:女口ON_COMMAND(ID_BUTTON1,Button1) //buttonl 为消息处理函数如果要设置按钮显示文本的话,就是CToolBar类的SetButtonText函数。

设置工具栏背景位图用CReBar类可以实现在工具栏背景里显示位图,可以把工具栏设置成CReBar类对应的子窗口,以上面的工程为例子,再在对话类里添加一个成员变量:CReBar m_Rebar;接着导入一张位图,用做工具栏的背景,ID号为ID_TOOLBACK,然后在OnlnitDialog 函数的RepositionBar(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); 语句前面添加如下语句:m_Rebar.Create(this);〃创建窗口(控件)m_Rebar.AddBar(&m_Toolbar);〃添加m_Toolbar 为子窗口m_Rebar.RedrawWindow();〃重画窗口REBARBANDINFO info;info.cbSize=sizeof(info);info.fMask=RBBIM_BACKGROUND;m_Toolbar.ModifyStyle(O,TBSTYLE_TRANSPARENT);〃设置工具栏背景色透明info.hbmBack=LoadBitmap(AfxGetlnstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBACK));〃加载位图m_Rebar.GetReBarCtrl().SetBandlnfo(O,&info);编译,运行效果如下:为工具栏按钮添加鼠标停留提示信息以上面的工程为例子,在对话类里添加一个成员变量CString str;接着在m_Toolbar调用CreateEx函数后,调用这个语句:m_Toolbar.EnableToolTips();〃激活信息提示功能然后在对话类里添加一个成员函数(用于TTN_NEEDTEXT消息处理函数),格式如下:BOOL OnDisplay(UINT id, NMHDR *pNMHDR, LRESULT *pResult)然后添加TTN_NEEDTEXT消息映射宏ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnDisplay)OnDisplay 函数代码如下:TOOLTIPTEXT *pTTT=(TOOLTIPTEXT *)pNMHDR; UINT nlD=pNMHDR->idFrom;〃 获取工具栏按钮 UINT nIndex=m_mandToIndex(nID);〃 str.Format("工具栏按钮 %d",nIndex);pTTT->lpszText=str.GetBuffer(str.GetLength());〃 pTTT->hinst=AfxGetResourceHandle(); return TRUE;工具栏按钮上显示图标在按钮上显示图标,方法跟显示位图差不到哪去,只要让CImageList 里添加的是图标就行了,首先向工程引入六个图标,假设 ID 号分别为IDI_ICON1、IDI_ICON2.…IDI_ICON6 以上面的工程为例:在 OnInitDialog 函数最后添加如下代码: m 」mageList.Create(48,48,ILC_COLOR24|ILC_MASK,1,1);〃 图片大小必须一致for(int i=IDI_ICON1;i<=IDI_ICON6;i++)m 」mageList.Add(AfxGetApp()->LoadIcon(i));〃 添加图标UINT nArray[6]; for(i=0;i<6;i++) {nArray[i]=ID_BUTTON1+i; }m_Toolbar.CreateEx(this);〃 创建工具栏控件 m_Toolbar.EnableToolTips();〃 激活信息提示功能 m_Toolbar.SetButtons(nArray,6);m_Toolbar.SetSizes(CSize(60,56),CSize(48,48));m_Toolbar.GetToolBarCtrl().SetImageList(&m 」mageList); m_Rebar.Create(this);m_Rebar.AddBar(&m_Toolbar); m_Rebar.RedrawWindow(); REBARBANDINFO info; info.cbSize=sizeof(info);info.fMask=RBBIM_BACKGROUND;m_Toolbar.ModifyStyle(O,TBSTYLE_TRANSPARENT);〃设置工具栏背景色透明 info.hbmBack=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBACK)); m_Rebar.GetReBarCtrl().SetBandInfo(O,&info);RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); 运行效果如下:ID根据按钮ID 获取索引设置按钮提示信息不一样。

相关文档
最新文档