VC对话框程序添加目录菜单、工具条和状态栏
Visual C++大学教程第8章 菜单、工具栏和状态栏设计
•
然后为菜单项关联命令消息处理函数 ,步骤如下。 • (1)在对话框类中添加一个消息处理函数 。
•
(2)在对话框类的消息映射部分添加 ON_COMMAND消息映射宏,将菜单 • 项的命令ID与消息处理函数关联。
• 程序设计具体步骤如下。 • (1)创建一个基于对话框的应用程序。 • (2)在主窗口中定义一个菜单成员变量。 • CMenu m_Menu;
图8.3 菜单设计窗口1
•
(4)在菜单设计窗口中,按〈Enter〉键 打开属性窗口,设计菜单标题,如图8.4所示 。
图8.4 菜单项属性窗口1
•
(5)按〈Enter〉键保存设置,返回到菜 单设计窗口,如图8.5所示。
图8.5 菜单设计窗口2
•
(6)如果用户需要设计子菜单,可以选 中下方的虚边框,按〈Enter〉键打开菜单 项属性窗口,在属性窗口中设置菜单项标 题和菜单ID,如图8.6所示。
图8.8 级联菜单
8.1.2 菜单项的命令处理
• (1)单击菜单栏中的“View”/“Class Wizard…”命令,打开MFC ClassWizard窗口 ,并选择Message Maps选项卡,在Object IDs 列表框中选择一个菜单项,如图8.20所示。
图8.20 类向导
•
(2)在该窗口的Messages列表框中双击 COMMAND,将打开“添加成员函数”窗口 ,如图8.21所示。
• BOOL ModifyMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );
(21)REMOVEMENU方法
• RemoveMenu方法用于移除一个菜
VC++实现对话框工程中添加菜单
stLogFont.lfFaceName, dwFontColor, stCF.iPointSize); MessageBox(szBuffer, "执行结果", MB_OK); } -----------------------------------------------------------------------------(5)颜色 -----------------------------------------------------------------------------源代码 CHOOSECOLOR stCC; COLORREF dwBackColor = RGB(0, 0, 0); COLORREF dwCustColors[16];
1.1 获取文件路径名: char szFileName[MAX_PATH] = "";//必须初始化
stOF.lpstrFile = szFileName; stOF.nMaxFile = MAX_PATH;// 必须和上面一起
1.2 标志: OFN_ALLOWMULTISELECT –允许选择多个文件名
wsprintf(szBuffer, "您选择的打印机:%s", GlobalLock(stPS.hDevMode)); MessageBox(szBuffer,"执行结果", MB_OK); }
-----------------------------------------------------------------------------(4)字体 -----------------------------------------------------------------------------源代码
Visual C++基础教程课件:菜单、工具栏和状态栏
菜单、工具栏和状态栏
switch(m_nShape) { case 0:
菜单、工具栏和状态栏
添加菜单命令处理函数可以利用类向导ClassWizard。下 面给例11.1的MyDraw添加必要的代码和菜单命令处理函数, 完成应用程序的功能。
在视图类CMyDrawView的定义中添加如下的数据成员:
protected:
int m_nShape;
COLORREF m_crColor; 在视图类CMyDrawView的构造函数中对数据成员进行初 始化:
下面以实例来说明如何利用菜单编辑器创建菜单。
菜单、工具栏和状态栏
【例11.1】 编写一个单文档界面应用程序,通过菜单 选择在视图窗口中画不同的图形和设置图形的颜色。
程序的创建过程如下: (1) 利用MFC AppWizard[exe]创建SDI应用程序,项目名 设置为MyDraw。 (2) 单击项目工作区窗口下的“ResourceView”标签,打 开资源列表。展开“Menu”,双击Menu下的 IDR_MAINFRAME即可打开菜单编辑器,如图11-2所示。
void CMyDrawView::OnDrawEllipse()
{
m_nShape=0; Invalidate(); //产生WM_PAINT消息更新视图
}
菜单、工具栏和状态栏
同样为其它菜单项添加WM_COMMAND消息处理函 数如下:
void CMyDrawView::OnDrawTriangle() {
在基于MFC框架的应用程序中,可以在任何地方处理命 令消息WM_COMMAND。实际上,框架窗口是大多数命令 消息的接收者,但命令消息可以在视图类、文档类甚至在应 用程序类中被处理,只要在该类的消息映射表中添加要处理 的消息的映射项即可。从CCmdTaret派生出来的所有类都可 以处理命令消息。
vc菜单 工具栏 应用
4.1 菜单
创建标记菜单的步骤
创建单文档应用程序CheckMenu 创建单文档应用程序 双击CMainFrame类的 类的OnCreate()函数,添加代码: 函数, 双击 类的 函数 添加代码: GetMenu()->GetSubMenu() ->CheckMenuItem(0,MF_BYPOSITION | MF_CHECKED) 或者: 或者: GetMenu()->GetSubMenu() ->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND | MF_CHECKED)
在项目工作区窗口的ResourceView(资源视图)页面 在项目工作区窗口的 (资源视图) 展开中Accelerator(加速键)的资源项,双击 中,展开中 (加速键)的资源项, IDR_MAINFRAME.
4.1 菜单
建立一个新的加速键时,只要双击加速键列表的最下端的空行,弹出如图 所示的 建立一个新的加速键时,只要双击加速键列表的最下端的空行,弹出如图4.8所示的 属性” “Accel 属性”(Accel Properties)对话框,其中可设置的属性如表 所示 )对话框,其中可设置的属性如表4.2所示
第4章 菜单、工具栏 章 菜单、 和状态栏
Contents
1 2 3 4
菜单 工具栏 状态栏 综合应用
4.1 菜单
菜单的创建
创建单文档应用程序Test 创建单文档应用程序 资源页面下,添加菜单Test,IDM_TEST(去掉 资源页面下,添加菜单 , (去掉pop_up) ) View->class Wizard下,为IDM_TEST添加 添加COMMAND 下 添加 的消息映射函数OnTest(),代码如下: 的消息映射函数 代码如下: 代码如下
VC++中添加工具栏和状态栏
VC++中添加工具栏和状态栏VC++中添加工具栏方法1、使用VC生成的工具栏通过VC资源窗口insert一个工具栏资源IDR_TOOLBAR1,并进行编辑为对话框类添加一个工具栏变量CToolBarm_T oolBar;在OnInitDialog()函数中添加如下代码,添加显示工具栏if(!m_T oolbar.CreateEx( this,TBSTYLE_FLAT , WS_CHILD | WS_VISIBLE |CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS, CRect(4,4,0,0))||!m_Toolbar.LoadToolBar(IDR_TOOLBAR1) ){TRACE0("failedto create toolbar\n");returnFALSE;}m_T oolbar.ShowWindow(SW_SHOW);RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CO NTROLBAR_LAST, 0);2、通过图像列表自定义工具栏通过VC资源窗口insert所需的ico文件,并分别命名为对话框类添加工具栏变量和图像列表变量CToolBarm_T oolBar;CImageListm_ImageList;在OnInitDialog()函数中添加如下代码,将图像列表与工具栏关联并进行显示//创建图像列表m_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,1);//向图像列表中添加图标m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONUSER));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONSET));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONQUERY));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONRECOR D));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONIMPORT ));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONEXPORT ));UINTarray[8];for(inti=0;i<8;i++) //初始化工具栏ID{if(i==2|| i==5)array[i]= ID_SEPARATOR; //第3、6个按钮为分隔条elsearray[i]= i+1001;}m_T oolBar.Create(this);m_T oolBar.SetButtons(array,8);//关联图像列表m_T oolBar.GetT oolBarCtrl().SetImageList(&m_ImageList);m_T oolBar.SetSizes(CSize(50,60),CSize(32,32));//设置按钮和图标的大小/*The sizeImage parameter must contain thesize, in pixels, of the images in the toolbar's bitmap.The dimensions in sizeButton must besufficient to hold the image plus 7 pixels extra in width and 6 pixels extra inheight.This function also sets the toolbar heightto fit the buttons.*/ //设置工具栏按钮的显示文本m_T oolBar.SetButtonText(0," 用户 ");m_T oolBar.SetButtonText(1," 设置 ");m_T oolBar.SetButtonText(3," 查询 ");m_T oolBar.SetButtonText(4," 记录 ");m_T oolBar.SetButtonText(6," 导入 ");m_T oolBar.SetButtonText(7," 导出 ");RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CO NTROLBAR_LAST,0);3、导入图片生成工具栏,并将工具栏与菜单栏对应项绑定通过VC资源窗口insert所需的ico文件,并分别命名,然后insert一个菜单资源IDR_MAINFRAME_MENU,并进行编辑为对话框类添加菜单栏变量、工具栏变量和图像列表变量CMenum_Menu;CToolBarm_T oolBar;CImageListm_ImageList;在OnInitDialog()函数中添加如下代码,将图像列表与工具栏关联,并将工具栏和对应菜单项ID进行关联,从而与菜单项共用处理函数m_Menu.LoadMenu(IDR_MAINFRAME_MENU);SetMenu(&m_Menu);TBBUTTONtbButton[ICONSUM] = {0};m_ImageList.Create(32,32, ILC_COLOR32 | ILC_MASK, 0, 0);m_ImageList.Add(::AfxGetApp()->LoadIcon(IDI_ICON3));m_ImageList.Add(::AfxGetApp()->LoadIcon(IDI_ICON1));m_ImageList.Add(::AfxGetApp()->LoadIcon(IDI_ICON4));m_ImageList.Add(::AfxGetApp()->LoadIcon(IDI_ICON5));m_ImageList.Add(::AfxGetApp()->LoadIcon(IDI_ICON2));m_T oolBar.Create(WS_CHILD| WS_VISIBLE, CRect(0, 0, 0, 0), this, 0);m_T oolBar.SetImageList(&m_ImageList);for(inti=0; i< ICONSUM; i++){tbButton[i].dwData = NULL;tbButton[i].fsState = TBSTATE_ENABLED;tbButton[i].fsStyle = (BYTE)TBSTYLE_FLAT;tbButton[i].iBitmap = i;}tbButton[0].idCommand= ID_ATTENDANCE_RECORD;tbButton[1].idCommand= IDM_REQUEST_EMPLOYEE;tbButton[2].idCommand= IDM_PAYLIP;tbButton[3].idCommand= IDM_PORTFOLIO;tbButton[4].idCommand= ID_ABOUT;m_T oolBar.AddButtons(ICONSUM,tbButton);m_T oolBar.AutoSize();m_T oolBar.SetStyle(TBSTYLE_FLAT| CCS_TOP);注:若要把工具栏的按钮和菜单项相关联,也可将它们的ID设置为同一个ID来实现VC++中添加状态栏方法转自:/show_it/item/2a12a5dd72ef2517e1f46f20方法一:1.添加成员变量CStatusBarCtrl m_StatusBar;2.在OnInitDialog()中加入:m_StatusBar.Create(WS_CHILD|WS_VISIBLE|SBT_OWNERDRA W,CRect(0,0,0,0), this, 0);intstrPartDim[3]= {100, 200, -1}; //分割数量m_StatusBar.SetParts(3,strPartDim);//设置状态栏文本m_StatusBar.SetText("分栏一", 0, 0);m_StatusBar.SetText("分栏二", 1, 0);m_StatusBar.SetText("分栏三", 2, 0);//下面是在状态栏中加入图标m_StatusBar.SetIcon(1,SetIcon(AfxGetApp()->LoadIcon(IDR_ MAINFRAME),FALSE));//为第二个分栏中加的图标方法二:1.添加成员变量CStatusBar m_wndStatusBar;2.在OnInitDialog()中加入:static UINT indicators[] ={D_SEPARATOR, //status line indicatorID_INDICATOR_CAPS, //CAP lock indicator.ID_INDICATOR_NUM, //NUM lock indicator.ID_INDICATOR_SCRL, //SCRL lock indicator.};if(!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicat ors(indicators,sizeof(indicators)/sizeof(UINT))){TRACE0("Failed to create statusbarn");return -1; // fail to create}UINT nID; //控制状态栏里面的分栏m_wndStatusBar.SetPaneInfo(0,nID,SBPS_STRETCH|SBPS_NO BORDERS,100); //返回值存nID中m_wndStatusBar.SetPaneText(0,"就绪");m_wndStatusBar.SetPaneInfo(1,nID,SBPS_NORMAL,100);m_wndStatusBar.SetPaneText(1,"大写");m_wndStatusBar.SetPaneInfo(2,nID,SBPS_POPOUT,100);m_wndStatusBar.SetPaneText(2,"数字");// SetPaneInfo()函数的第三个参数的可选项如下:// The following indicator styles are supported:// SBPS_NOBORDERS No 3-D border around the pane.// SBPS_POPOUT Reverse border so that text "pops out."// SBPS_DISABLED Do not draw text.// SBPS_STRETCH Stretch pane to fill unused space. Only one pane per status bar can have thisstyle.// SBPS_NORMAL No stretch, borders, or pop-out.//----------------让这个状态栏最终显示在对话框中------------- RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CO NTROLBAR_LAST,0);。
VC对话框中添加状态栏的方法
VC++对话框中添加状态栏的方法方法一:1.添加成员变量CStatusBarCtrl m_StatusBar;2.在OnInitDialog()中加入:m_StatusBar.Create(WS_CHILD|WS_VISIBLE|SBT_OWNERDRAW, CRect(0,0,0,0), this, 0); int strPartDim[3]= {100, 200, -1}; //分割数量/////这里要说明一下,分割的大小是这样决定的,如上面分的3个窗口,第一大小为100,第二个也为100(即200-100),第三个是状态栏的整个大小减去200.m_StatusBar.SetParts(3, strPartDim);//设置状态栏文本m_StatusBar.SetText("分栏一", 0, 0);m_StatusBar.SetText("分栏二", 1, 0);m_StatusBar.SetText("分栏三", 2, 0);//下面是在状态栏中加入图标m_StatusBar.SetIcon(1,SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME),FALSE));//为第二个分栏中加的图标方法二:1.添加成员变量CStatusBar m_wndStatusBar;2.在OnInitDialog()中加入:static UINT indicators[] ={ID_SEPARATOR, // status line indicatorID_INDICATOR_CAPS, //CAP lock indicator.ID_INDICATOR_NUM, //NUM lock indicator.ID_INDICATOR_SCRL, //SCRL lock indicator.};if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))){TRACE0("Failed to create status barn");return -1; // fail to create}UINT nID; //控制状态栏里面的分栏m_wndStatusBar.SetPaneInfo(0,nID,SBPS_STRETCH|SBPS_NOBORDERS,100); //返回值存nID中m_wndStatusBar.SetPaneText(0,"就绪");m_wndStatusBar.SetPaneInfo(1,nID,SBPS_NORMAL,100);m_wndStatusBar.SetPaneText(1,"大写");m_wndStatusBar.SetPaneInfo(2,nID,SBPS_POPOUT,100);m_wndStatusBar.SetPaneText(2,"数字");// SetPaneInfo()函数的第三个参数的可选项如下:// The following indicator styles are supported:// SBPS_NOBORDERS No 3-D border around the pane.// SBPS_POPOUT Reverse border so that text "pops out."// SBPS_DISABLED Do not draw text.// SBPS_STRETCH Stretch pane to fill unused space. Only one pane per status bar can have this style.// SBPS_NORMAL No stretch, borders, or pop-out.//----------------让这个状态栏最终显示在对话框中-------------RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);。
VC++控件使用——状态栏
VC++控件使用——状态栏一、创建状态栏/1.创建一个基于对话框的应用程序2.在对话框头文件中声明一个CStatusBar类变量m_StatusBar3.2程序3.1在对话框的OnInitDialog函数中创建工具栏UINT array[4];for(int i=0;i<4;i++){array[i]=1001+i;}m_StatusBar.Create(this);m_StatusBar.SetIndicators(array,sizeof(array)/sizeof(UINT));for(int n=0;n<4;n++){4.成功运行m_StatusBar.SetPaneInfo(n,array[n],0,100);}CTime time=CTime::GetCurrentTime();m_StatusBar.SetPaneText(0,"当前用户");m_StatusBar.SetPaneText(1,"TM");m_StatusBar.SetPaneText(2,"当前日期:");m_StatusBar.SetPaneText(3,time.Format("%Y-%m-%d"));RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);二、在状态栏中显示控件1.创建一个基于对话框的应用程序2.在对话框头文件中声明一个CStatusBar 类变量m_StatusBar3.控件菜单调出来;在工具栏空白处右击,选择控件4.利用控件工具栏创建进度条,并右击点击属性查看ID5.在菜单栏-》查看中点击建立类向导,在Member Variables 关联变量m_Progress 6.2程序UINT array[4];for(int i=0;i<4;i++){array[i]=1001+i;}m_StatusBar.Create(this);m_StatusBar.SetIndicators(array,sizeof(array)/sizeof(UINT));for(int n=0;n<4;n++){m_StatusBar.SetPaneInfo(n,array[n],0,90); } 6.1在对话框的OnInitDialog 函数中创建工具栏CTime time=CTime::GetCurrentTime();m_StatusBar.SetPaneText(0,"当前用户");m_StatusBar.SetPaneText(1,"TM");m_StatusBar.SetPaneText(2,"当前状态:");RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);RECT m_rect;m_StatusBar.GetItemRect(3,&m_rect);m_Progress.SetParent(&m_StatusBar);m_Progress.MoveWindow(&m_rect);m_Progress.ShowWindow(SW_SHOW);m_Progress.SetRange(0,100);m_Progress.SetPos(80);7.程序运行成功。
VC对话框程序添加目录菜单、工具条和状态栏
VC对话框程序添加目录菜单、工具条和状态栏为<对话框>添加工具条和状态栏前,先说说添加目录菜单栏;1,在Insert下拉菜单中选择Resorce,新建一个MENU,2,在CDialog::OnInitDialog();后面添加代码:CMenu menu;menu.LoadMenu(IDR_MENU1); // 红色部分为你新建MENU的ID索引SetMenu(&menu);为对话框程序添加工具条和状态栏摘要:本文介绍了在对话框程序基础上通过程序控制来动态添加工具条和状态条的实现过程和方法。
一、引言对于不需要文档/视图结构支持的程序一般都采用对话框做为程序的基础框架。
虽然在对话框程序上可以通过修改其属性来添加系统菜单,但对比SDI和MDI程序的工具条和状态栏未免使界面显得简单、单调。
虽然在Visual Basic 中提供有独立的工具条和状态栏标准控件可以直接在对话框上使用,但Visual C++ 6.0所提供的26种基本Windows标准控件却没有将它们包含其中。
因此要在对话框程序中实现工具条和状态栏只能通过编程来动态实现。
二、工具条的实现过程MFC对于工具条和状态栏分别提供了CToolBar和CStatusBar两个基本类库,但由于在实现时MFC 对其做了过多的封装,以至无法了解内部的一些核心技术。
因此本文在实现过程中放弃了相对比较方便的CToolBar和CStatusBar类的使用,而是通过SDK(Software Developers Kit,软件开发工具箱)式的WinAPI 应用程序接口来实现的。
在API函数中经常需要用到对话框的窗口句柄和当前的实例句柄,在SDK程序设计中以上两个句柄可以直接从入口函数WinMain()中引出,而在MFC下也对其做了封装,不能直接获取。
但MFC也为其留有接口:CWnd窗口类提供的GetSafeHwnd()可以返回对话框的窗口句柄;函数AfxGetInstanceHandle()则可以获取当前应用程序的实例句柄。
VC++_第2章_菜单、工具栏和状态栏的设计
第2章菜单、工具栏和状态栏的设计例2.2 在顶层菜单栏里建立一个菜单项,并在其下面建立带有子菜单的菜单项,使有的子菜单具有加速键、变灰和核对符,又使每个子菜单都能显示信息。
步骤如下:(1)建一个单文档的应用程序(或用例2.1程序),名为:山东旅游(2)建立菜单:1)ResourceView→Menu→IDR_MAINFRAME→右面出现菜单编辑器→左键选中顶层最后的空白菜单不放,将其拖到“帮助”的前面,松开鼠标(或选中“帮助”菜单,按Insert键)。
双击这个空白菜单,出现“菜单属性对话框”,在Caption处写:山东旅游(&S)→ Pop_up 处于选中状态(屏蔽ID)→退出。
2)双击下面出现的空白菜单,出现“菜单属性对话框”,选中Pop_up(屏蔽ID)→Capton 处写:烟台(&Y)3)右边出现空白子菜单,双击它,出现“菜单属性对话框”→ID处写:ID_SD_YT_PL→Capton处写:蓬莱Ctrl +F5 (注:Ctrl +F5是加速键标识)→注释栏prompt 处写:蓬莱仙境4)双击“蓬莱”下面的子菜单,双击它,出现“菜单属性对话框”→ID处写:ID_SD_YT_NS→Capton处写:南山(&N)→prompt处写:南山大佛5)双击“烟台”下面的空白菜单, 出现“菜单属性对话框”→选中Pop up(屏蔽ID)→Capton 处写:青岛(&Q)6)右边出现空白子菜单,双击它,出现“菜单属性对话框”→ID处写:ID_SD_QD_LS→Capton处写:崂山Ctrl +F6→prompt处写:崂山道士表2. 1 菜单General属性对话框的各项含义项目含义ID 菜单的资源ID标识符Caption(标题)用于标识菜单项显示文本,助记符字母前面须有一个&符号,这个字母与Alt构成组合键Separator(分隔符)选中时,菜单项是一个分隔符或一条水平线Checked(选中的)选中时,菜单项文本前显示一个选中标记Pop_up(弹出)选中时,菜单项含有一个弹出式子菜单Grayed(变灰)选中时,菜单项显示是灰色的,用户不能选用Inactive(非激活)选中时,菜单项没有被激活,用户不能选用Help(帮助)选中时,菜单项在程序运行时被放在顶层菜单的最右端Break(暂停)当为Column时,对于顶层菜单项来说,被放置在另外一行上,而对于弹出式子菜单的菜单项来说,则被放置在另外一列上,当为Bar时,与Column相同,只不过对于弹出式子菜单来说,它还在新列与原来的列之间增加一条竖直线,注意:这些效果只能在程序运行后才能看到。
VC内部培训资料——第6章 菜单、工具栏和状态栏
第六章菜单、工具栏和状态栏菜单、工具栏和状态栏是组成Windows图形界面的三个主要元素。
其中菜单、工具栏提供了用户操作应用程序的命令界面;状态栏提供了一个输出区域,用来显示当前程序运行的状态和数据变化等等。
本章将详细的介绍菜单、工具栏和状态栏的使用方法。
6.1 菜单大多数的Windows应用程序都提供菜单作为用户与应用程序之间传递命令的一个特殊的途径。
利用菜单可以不用将大量的命令按钮摆放在窗口上。
既节省空间又使用方便。
本节将主要讲述菜单的种类,菜单的设计与创建,及菜单的消息处理等等。
6.1.1 菜单介绍在众多的应用程序当中,我们最常见到的菜单有下拉式菜单、级联菜单和快捷方式菜单。
下拉式菜单一般出现在应用程序窗口的顶部,分类的类别排成一行,和某个类别相关的所有功能排在那个类别的下面,如果选中某个类别时,其下就会拉出菜单,该菜单中有一系列具有相关功能的菜单项可供选择。
级联菜单是下拉菜单的一个扩展。
如果某个菜单项的右边有一个向右的黑三角符号,那么这个菜单项其实就是一个级联菜单。
级联菜单带有另一个子菜单,子菜单一般显示在所属菜单项的右边。
这个子菜单和下拉式菜单相似,有一系列菜单项可供选择。
需要注意的是,请读者一定要区别弹出式菜单和菜单项。
一般来说,把单击后会出现下拉子菜单的菜单称为弹出式菜单,而把其他菜单叫菜单项。
级联菜单也是弹出式菜单,它右边出现的子菜单中的各个小菜单也叫菜单项。
第三种菜单风格是可以通过在应用程序区域中单击鼠标右键调出的一种很方便的菜单,叫快捷菜单或弹出式菜单。
由于该菜单的菜单项内容依赖于被选中的对象或光标、鼠标在工作区域内所指的位置,因此该种菜单也称为上下文菜单。
一般情况下,当我们新建好一个MFC应用程序时,AppWizard都会为我们生成一个常用的菜单。
单文档应用程序会自动生成标识符为IDR_MAINFRAME的菜单资源,而多文档应用程序自动生成标识符为IDR_MAINFRAME和IDR_xxxTYPE的菜单资源,其中xxx为你的工程名。
VC++工具栏与状态栏
指针;dwStyle指定状态栏的风格,除了标准的 Windows风格外,还可以是CBRS_TOP(状态栏
既然我们已经取得应用程序的指针所以马上就能得到应用程序对象的公共数据成员mpmainwnd它是一个指向cwin应用程序的主窗口的指针利用这个指针我们又可使用该指针所指向的对象cwin对象的成员函数getdescendantwindow这个函数的作用是求得某个子窗口即状态栏这个窗口的指针
工具栏与状态栏
BOOL LoadToolBar(LPCTSTR lpszResourceName);
BOOL LoadToolBar(UINT nIDResource); 参数lpszResourceName指向被重载的工具栏 资源名字的指针,参数nIDResource为被重 载的工具栏资源的ID。
13
14
2 状态栏
lpIDArray所指向的数组元素的个数。该函数按照 数组lpIDArray中的对应元素的值设定标识符ID
19
的值,加载由每个ID所指定的字符串资源,并把字 符串设置为标识符的文字。如果该函数操作成功, 在返回一个非0值,否则返回0。 2、SetPaneInfo()函数
函数SetPaneInfo()用于设置给定索引值的指示器 ID、风格和宽度。它的原型为:
6
工具栏按钮可以以按钮、复选框或单选框的形 式出现和起作用,默认情况下以按钮形式出现。 若想让工具栏按钮以复选框形式出现时,应将风 格TBBS_ CHECKBOX赋给该CToolBar对象或在一个 ON_UNDATE_COMMAND_UI处理程序中使用某个 CCmdUI对象的SetCheck函数;如果按钮为单选框 形式,那么应在命令更新处理函数中调用 CCmdUI::SetRadio。
vc_5菜单和工具条
if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP|C BRS_GRIPPER|CBRS_FLYBY|CBRS_SIZE_DY NAMIC) ||!m_wndToolBar.LoadToolBar(IDR_TOOLBAR1)) {TRACE0("Failed to create toolbar\n"); return -1; } RepositionBars(AFX_IDW_CONTROLBAR_FIR ST,AFX_IDW_CONTROLBAR_LAST,0);
工具条执行的功能往往已由相应的菜单实现 了。因此,一般情况下,没有必要为工具栏 设置消息响应函数,而只需为工具条上的按 钮指定正确的ID(按钮要响应函数的菜单调用 者的ID)来保证响应函数的正确调用。
1.创建工具条。 Resource View->右击顶层文件夹->Insert>Toolbar->new 2. 编辑工具栏按钮
void CMenuDlg::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code here CMenu menu; menu.LoadMenu(IDR_QUICKMENU); CMenu *pquickmenu= menu.GetSubMenu(0); pquickmenu->TrackPopupMenu (TPM_LEFTALIGN|TPM_RIGHTBUTTON,poi nt.x,point.y,pWnd); }
1.在工程中插入新的菜单
在Workspace的“Resource View”中右击顶层文件夹, 在激活的快捷菜单中选择 “Insert”选项,在弹出对 话框中选“Menu”,单击New 按钮。
VC++之对话框中添加工具栏
VC++之对话框中添加工具栏1、添加工具栏资源ID为IDR_TOOLBAR2、在对话框的类定义中加:CToolBar m_ToolBar;3、在OnInitDialog中或其它合适的消息响应中加如下代码:(函数可查看MSDN)01 m_ToolBar.Create(this); //创建工具栏02 m_ToolBar.LoadToolBar(IDR_TOOLBAR);//加载工具栏0304 //得出控件条大小.05 CRect rect;06 CRect rectNow;7GetClientRect(rect);0 8 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rectNow);0910 //放置控件条位置11 CPoint ptOffset(rectNow.left-rect.left,rectNow.top-rect.top);1213 CRect rcChild;14 CWnd* pwndChild=GetWindow(GW_CHILD);15 while (pwndChild)16 {17 pwndChild->GetWindowRect(rcChild);18 ScreenToClient(rcChild);19 rcChild.OffsetRect(ptOffset);20 pwndChild->MoveWindow(rcChild,FALSE);21 pwndChild=pwndChild->GetNextWindow();22 }2324 //调整对话框尺寸25 CRect rcWindow;26 GetWindowRect(rcWindow);27 rcWindow.right+=rect.Width()-rectNow.Width();28 rcWindow.bottom+=rect.Height()-rectNow.Height();29 MoveWindow(rcWindow, FALSE);3031//控件条定位3 2RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST, 0);3334 //对框居中35 CenterWindow();4、手工添加处理函数1 afx_msg void OnBtnXXX();//消息响应函数声明2 ON_COMMAND(ID_BTN_XXX/*工具按钮ID*/,OnBtnXXX/*函数名*/)//消息映射3 void CXXXDlg::OnBtnXXX(){}//消息处理函数。
VC++对话框的应用程序的菜单操作
VC++对话框的应用程序的菜单操作对话框的应用程序的菜单操作一、课程设计的功能:在一个基于对话框的应用程序中增加一个菜单资源,并把它连接到对话框窗口中,运行时显示出来。
完成以后的程序其运行界面如图1所示。
应用程序的标题为Application of Dialog based。
其主窗口中有三个按钮,它们分别为“时间”、“显示”和“退出”,以及两个“文件”和“帮助”的菜单栏。
单击“文件”菜单,出现一个下拉菜单,选择“时间”菜单,可以看到显示当前系统时间的消息框;单击菜单中的“显示”选项,则弹出一个显示基本信息的消息框;选择“退出”菜单,退出本应用程序。
单击相应的按钮完成同样的效果。
若单击“帮助”菜单,出现一个“关于应用程序”菜单项。
图1 Ex4_2程序主窗口二、课程的设计步骤1使用AppWizard创建一个对话框MFC应用程序(2)在Visual C++主菜单栏中选择File菜单中的New选项,打开New对话框。
(3)选择Project标签页,并在该标签页中选择MFC AppWizard应用程序向导,在Project name编辑框中输入工程文件名为Ex4_2,单击“OK”按钮。
(4)在MFC AppWizard-Step1对话框中,选择Dialog based选项,在MFCAppWizard-Step 2 of 4对话框中,在Please enter a title for your dialog 编辑框中给应用程序主窗口标题命名为“Application of Dialog based”。
单击“Finish”完成应用程序框架文件的创建。
2编辑对话框(1)选择项目工作区的ResourceView面板,(2) 切换到资源视图。
展开Dialog对话框资源类型。
双击IDD_EX4_2_DIALOG菜单资(3) 将弹出对话框编辑窗口和一个控件工具栏面板如下图所示。
图2 初始对话框编辑窗口控件工具栏面板列出了VC中所可以建立的控件类型,用户只要把鼠标停在某个控件标识上,可显示该控件的类型提示。
VC随笔工具栏和状态栏
VC随笔工具栏和状态栏工具栏:创建一个工具栏的步骤:1、插入新的工具栏资源2、在框架主窗口类中声明一个工具栏类的对象3、在主框架窗口类的OnCreate函数中产生工具栏窗口,并将工具栏资源装入4、停靠工具栏在主框架窗口上下面就根据以上步骤来为2DCAD程序添加一个新的工具栏,如下:1、在ResourceView中添加一个ID为IDR_GRAPHTOOL的工具栏2、打开MainFrm.h文件,在主框架窗口类CMainFrame中声明一个新的CToolBar类的对象,简单的方法是仿制AppWizard在程序中自动加入的m_wndToolBar对象代码//产生图形工具栏CToolBar m_newToolBar;3、在主框架窗口类CMainFrame的OnCreate成员函数中,(1)调用CToolBar的成员函数CreateEx产生工具栏窗口,(2)然后调用CToolBar的成员函数LoadToolBar将工具栏资源IDR_GRAPHTOOL加载到新声明的工具栏对象m_newToolBar中//创建新的工具栏资源窗口if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FL YBY | CBRS_SIZE_DYNAMIC) ||!m_newToolBar.LoadToolBar(IDR_GRAPHTOOL))//加载工具栏资源IDR_GRAPHTOOL{TRACE0("Failed to create toolbar\n");return -1; //如果创建失败,返回-1}4、在主框架窗口类的OnCreate函数中,(1)调用CToolBar的成员函数EnableDocking使工具栏窗口可以停靠,(2)调用CMainFrame类的成员函数DockControlBar把工具栏停靠在主框架窗口中m_newToolBar.EnableDocking(CBRS_ALIGN_ANY);//使工具栏可停靠DockControlBar(&m_newToolBar);//停靠新工具栏在主框架窗口上注意:使用“复制—修改”的方式,仿制AppWizard在程序中自动加入的m_wndToolBar对象代码,稍微修改一下就容易创建出新的工具栏设置工具栏标题:在框架窗口CMainFrame类的OnCreate成员函数中设置工具栏的标题m_newToolBar.SetWindowText("Graph Tools");//设置绘图工具栏标题m_wndToolBar.SetWindowText("标准");//设置默认工具栏标题为绘图工具栏添加显示/隐藏功能的步骤:1、添加新的菜单项在【查看】菜单下新增加一个菜单项【绘图工具栏】,ID为ID_VIEW_GRAPHTOOL2、添加菜单项的命令处理消息使用ClassWizard为新增加的ID_VIEW_GRAPHTOOL菜单项添加命令消息处理函数,注意一定要添加到框架窗口类CMainFrame中,修改代码如下:void CMainFrame::OnViewGraphtool(){// TODO: Add your command handler code hereShowControlBar(&m_newToolBar, !m_newToolBar.IsWindowVisible(), FALSE);}3、添加更新用户界面消息处理使用ClassWizard在框架窗口类CMainFrame中添加菜单项的更新用户界面消息处理函数,修改代码如下:void CMainFrame::OnUpdateViewGraphtool(CCmdUI* pCmdUI){// TODO: Add your command update UI handler code here//根据工具栏的显示状态设置菜单项是否有选中标志pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());}状态栏:状态栏的编程工作主要集中在设置状态栏窗格上修改状态栏窗格的方法:打开MainFrm.cpp文件,在文件的开始部分可以发现这样的代码:static UINT indicators[] ={ID_SEPARATOR, // status line indicatorID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,};指示器数组indicators说明了状态栏窗格的数量以及意义,第一项一般为ID_SEPARATOR(显示一个提示行窗格),后面三项都是字符串ID,用户可以在String Table字符串资源中找到这三个字符串。
VC++ 第2章 菜单、工具栏和状态栏的设计
第2章菜单、工具栏和状态栏的设计在Windows应用程序中,菜单、工具栏、状态栏等内容都是不可缺少的界面元素。
菜单是一系列可视的命令列表,用户能够选中其中的菜单项(命令)并执行相应任务。
工具栏提供图形按钮,实现快捷操作,用户可以通过工具栏执行最常用的命令,增强方便程度。
在状态栏中,可以显示动态的提示信息,便于用户的一些操作。
2.1 设计菜单菜单为用户控制程序提供了一套分级选项,无论是标准菜单及命令,还是热键或弹出式菜单,以及为菜单或其命令定义加速键和状态条提示,都可用菜单编辑器来完成;除此之外,菜单项作为一个普通的对象也可在编辑时进行移动、复制、删除等操作。
图2.1是一个典型的菜单实例,图中包含了标准菜单命令、快捷键、加速键、子菜单、核对符等。
这些都是编写程序时经常遇到的。
下面我们就介绍如何创建和编辑菜单项。
图2.1 典型菜单实例2.1.1 用编辑器设计菜单当用户使用AppWizard创建SDI或MDI应用程序时,系统将为用户自动生成默认的菜单栏。
用户需要做的工作仅仅是打开菜单编辑器,进行必要的修改,再编写菜单选项相应的消息处理函数即可。
当然也可在菜单编辑器中创建新的菜单或创建新的菜单资源,如快捷菜单等。
无论是编辑已有菜单资源还是创建新的菜单资源,首先应当进入菜单资源编辑器。
例2.1 在菜单编辑器的”文件(F)”下拉的某个位置加一个菜单,其作用是单击它后,能在屏幕上显示一行字。
编程步骤如下:(1)建一个SDI单文档应用程序名为:显示一行字(2)用编辑器设计菜单:项目工作区ResourceView→单击打开Menu →双击IDR_MAINFRAME→右面出现菜单编辑器,见图2.1.1→单击“文件(F)”出现下拉菜单,见图2.1.2所示→点中最后的空白菜单,双击它→出现“菜单项属性对话框”→在Caption处写菜单名:显示一行字(&C)→在ID处写ID_FILE_XS→在prompt(注释)栏中写:点击新建菜单项,在窗口显示一行字→关闭该对话框。
vc的菜单,工具栏
vc的菜单,⼯具栏⾸先,MFC会⾃动⽣成⼀些菜单,我们也可以在resource view中添加菜单。
点击菜单栏属性--〉左上⾓校园最图形,可以将属性页显⽰。
不会随着菜单项变动丢失。
ID号变灰的栏是不可以编辑的。
是弹出的POPUP菜单。
它不能被⽤来做响应。
⼤写字母标⽰资源。
IDI IDC IDM分别表⽰不同的类型资源。
⼀个菜单项可以由CMAINFRAM CXXXVIEW CXXApp CXXDOC view类先对其响应,接着doc类对其进⾏响应,MAINFRAM第三个对其进⾏响应,第四个响应的APP类对其进⾏响应。
Afxmessagebox框架函数,可以响应⾮WND派⽣类的弹出的提⽰,⽽wnd派⽣的可以直接⽤MessageBox函数。
消息包括三类:WM_XXX标准消息,从cwnd派⽣的类可以接收也可以接受命令消息,WM_COMMANed命令消息(通过ID号标识识别,由cmdtarget派⽣的类可以接受,⽐如说⽂档类,CEIDTview类),第三类通知消息,有cmdtarget派⽣的类可以接收。
APP和Doc类从CMDTARGET派⽣,所以不能接收标准消息。
命令消息,头⽂件消息影射中添加原形,原⽂件中添加ON_COMMND宏完成影射,还有命令函数实现。
命令函数由ONCOMMAND来处理,通知消息由ONNOTIFY来实现。
命令消息到来时⾸先到达CMAINFRAM然后到送达CVIEW 来处理,根据命令消息影射来处理,如果没有处理函数,交给DOC类,如果还没有处理函数,交还给VIEW类,------〉交还CMAINFRAM 类,如果他也没有处理函数,交给APP类来处理。
标记菜单(打对购得):在CMAINFRAM中ONCREATE中创建。
菜单属于框架窗⼝,获取菜单栏指针的⽅法为GetMenu,它返回⼀个返回CMenu的指针。
但是其指向的对象是不⼀样的,⼀个为菜单,⼀个为⼦菜单。
CMenu中的checkmenuitem⽅法可以设置标记。
VC++的菜单与工具栏使用方法解析
m_rectangle = TRUE; m_ellipse =FALSE; dc.SelectObject(pOldBrush); dc.SelectObject(oldpen); delete pNewBrush;
}
对应的更新命令UI控制函数OnUpdateGraphEllipse , 根据变量m_ellipse的值来控制菜单的有效性状态, 决定菜单项“ellipse”什么时候有效
CWnd*pWnd, LPCRECT lpRct=NULL); 其中参数nFlags为弹出式菜单的标志,例如若其值为 TPM_RIGHTALIGN,表示创建的弹出式浮动菜单,其右边 界位于X处;若其值为TPM_LEFTALIGN,表示其左边界位 于X处,参数X与Y表示屏幕坐标。
(1)浮动菜单的创建
对应的更新命令UI控制函数 OnUpdateGraphRec根据变量m_rectangle的值 来控制菜单的有效性状态,决定菜单项 “rectangle ”什么时候有效。
void CMenuitemView::OnUpdateGraphRec(CCmdUI*pCmdUI)
{ pCmdUI->Enable(m_rectangle);
CBrush* pNewBrush, * pOldBrush; pNewBrush=new CBrush; pNewBrush->CreateSolidBrush(m_crbk); pOldBrush=dc.SelectObject(pNewBrush); dc.Ellipse(230,70,310,150);
如果菜单项有更新处理函数,那么它被调用进行 更新;如果没有,那么框架检查命令处理函数是否 存在,若不存在,则使菜单变灰。
必须提供一个菜单处理函数或更新函数。
VC语言程序设计第4次实验_菜单、工具栏和状态栏
5.工具按钮的更新
工具按钮的更新有如下步骤。
(1)为CMainFrame类添加一个BOOL型的成员变量m_bIsTest,在CMainFrame类构造函数中将m_bIsTest的初值设为FALSE
return TRUE;
}
(5)编译运行,看看主框架窗口的大小是否为屏幕的1/4大小,且移动到屏幕的右上角。
3.添加并设计一个工具按钮
添加并设计一个工具按钮的具体步骤如下。
(1)将项目工作区窗口切换到ResourceView页面,双击“Toolbar”项中的IDR_MAINFRAME,打开工具栏资源。
(2)在字符串列表的最后一行的空项上双击鼠标左键,弹出一个对话框,在该对话框中,指定一个字符串标识符ID_TEST_PANE,设置字符串值为“你在(1024,1024)处双击鼠标”,注意该字符串的字符个数将决定添加的状态栏窗口的大小。添加一个字符串资源的结果如图T12.5所示。
(3)关闭字符串属性对话框。
BOOL CmainFrame::onSetCursor(CWnd*pWnd,UINT nHitTest,UINT message)
{
BOOL bRes=CframeWnd::OnSetCursor(pWnd,nHitTest,message);
if(nHitTest==HTCLENT)&&(m_bIsTest))
Str.Format(“你在(%b,%d)处双击鼠标,”point..x,point.y);//格式化文本
else
Str.EmptyO;//为空字符
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、引言
对于不需要文档/视图结构支持的程序一般都采用对话框做为程序的基础框架。
虽然在对话框程序上可以通过修改其属性来添加系统菜单,但对比SDI和MDI程序的工具条和状态栏未免使界面显得简单、单调。
虽然在V isual Basic 中提供有独立的工具条和状态栏标准控件可以直接在对话框上使用,但V isual C++ 6.0所提供的26种基本Windows标准控件却没有将它们包含其中。
因此要在对话框程序中实现工具条和状态栏只能通过编程来动态实现。
二、工具条的实现过程
MFC对于工具条和状态栏分别提供了CToolBar和CStatusBar两个基本类库,但由于在实现时MFC 对其做了过多的封装,以至无法了解内部的一些核心技术。
因此本文在实现过程中放弃了相对比较方便的CToolBar和CStatusBar类的使用,而是通过SDK(Software Developers Kit,软件开发工具箱)式的WinAPI 应用程序接口来实现的。
在API函数中经常需要用到对话框的窗口句柄和当前的实例句柄,在SDK程序设计中以上两个句柄可以直接从入口函数WinMain()中引出,而在MFC下也对其做了封装,不能直接获取。
但MFC也为其留有接口:CWnd窗口类提供的GetSafeHwnd()可以返回对话框的窗口句柄;函数AfxGetInstanceHandle()则可以获取当前应用程序的实例句柄。
由于对话框和状态栏属于程序界面的一部分,需要程序启动时就显示出来,因此获取句柄的代码和后面创建显示工具条、状态栏的全部代码都应当放在对话框初始化消息WM_INITDIALOG的响应函数OnInitDialog()中进行:
HWND hDlg=GetSafeHwnd();
HINSTANCE hInstance=AfxGetInstanceHandle();
对于待添加的工具条按钮可以根据情况细分为两种:
一种是Windows标准的一些工具条按钮比如打开文件、打印预览、在线帮助等等,这类工具条按钮可以直接使用预定义好的按钮图标的ID号,在VC自带的CommCtrl.h头文件中有详细定义;
另一种就是用户自己添加的工具栏按钮,只能由用户在资源视图中为其指定相应的图标。
不论是那种工具条按钮的创建都是通过对TBBUTTON结构的设置来决定每一个工具条按钮的状态,对于第一个填充好的工具条按钮可以用CreateToolbarEx()来直接将其加入到工具条上,并返回指向工具条的窗口句柄,而对于以后工具条按钮的添加则只能通过向工具条发送TB_ADDBUTTONS消息来实现:
……
//填充工具条按钮结构:
TBBUTTON ptoolbar[30]={{STD_HELP, //指定Windows的标准帮助图标
MU_ONE, //工具条按钮的ID
TBSTA TE_ENABLED, //可用状态
TBSTYLE_BUTTON, //指定创建一个可以下按的按钮
0, //保留,由应用程序定义该参数意义
0}, //按钮字串索引
//创建一个分割按钮用的竖线
{0,0,TBSTA TE_ENABLED,TBSTYLE_SEP,0,0}};
//在对话框上动态创建工具条,并添加工具条按钮:
HWND hToolsWindow=::CreateToolbarEx(hDlg, //指定对话框为父窗口,将工具条创建在对话框上
WS_CHILD|WS_VISIBLE|TBSTYLE_WRAPABLE|TBSTYLE_TOOLTIPS|
TBSTYLE_FLAT|CCS_ADJUSTABLE,//指定工具条的创建风格
IDB_TOOLBAR,//预定义的工具条资源ID
30,HINST_COMMCTRL, //包含图片资源的可执行文件的实例句柄
IDB_STD_SMALL_COLOR,//图片的资源ID
ptoolbar, //待添加的按钮
2, //加入到工具条的按钮的个数
0,0,0,0,sizeof(TBBUTTON));
……
//从IDR_TOOLBAR1资源中装载按钮图标到对话框的工具条上
TBADDBITMAP tab;
tab.hInst=hInstance;
tab.nID=IDR_TOOLBAR1;
iBmp=::SendMessage(hToolsWindow,TB_ADDBITMAP,(WPARAM)3,(LPARAM)&tab);
向工具条添加工具条按钮的关键在于对TBBUTTON数据结构的填充,该数据结构也是在CommCtrl.h 头文件中定义的,原形为:
typedef struct _TBBUTTON {
int iBitmap;
int idCommand;
BYTE fsState;
BYTE fsStyle;
DWORD dwData;
int iString;
} TBBUTTON, NEAR* PTBBUTTON, FAR* LPTBBUTTON;
该结构的数据成员包含了处在工具条里的按钮的相关信息:成员iBitmap是从0开始记数的按钮图象的索引;idCommand标识了匹配的按钮,当按钮被按下产生WM_COMMAND消息的时候会用到该标识;fsState指定了按钮的状态标志,可以是以下8种标志的逻辑组合TBSTA TE_CHECKED、TBSTA TE_ELLIPSES、TBSTATE_ENABLED、TBSTA TE_HIDDEN、TBSTA TE_INDETERMINATE、TBSTA TE_MARKED、TBSTA TE_PRESSED、TBSTA TE_WRAP。
至于以上各标志的具体含义在MSDN的在线帮助中有详细说明;fsStyle成员指定了按钮的风格;dwData是应用程序定义的值,通常为0;iString 为从0开始技术的按钮字串的索引。
下面这段代码用于向工具条添加自定义的工具条按钮:
TBBUTTON tb;
tb.iBitmap=iBmp+0;
tb.idCommand=MU_TWO;
tb.fsState=TBSTATE_ENABLED;
tb.fsStyle=TBSTYLE_BUTTON;
tb.dwData=0;
tb.iString=0;
完成对TBBUTTON结构的设置后可以通过窗口句柄hToolsWindow向工具条发送TB_ADDBUTTONS 消息来添加按钮到工具条,如想添加按钮之间的分割条,只需将TBBUTTON结构的fsStyle成员变量取值为TBSTYLE_SEP即可:
::SendMessage(hToolsWindow,TB_ADDBUTTONS,(WPARAM)1,(LP ARAM)&tb);
三、状态栏的实现
状态栏的实现与工具条的实现相比非常简单,只需在CreateStatusWindow()函数中对其参数进行设置即可实现:
HWND hStatusWindow=CreateStatusWindow(WS_CHILD|WS_VISIBLE|WS_BORDER,
TEXT("状态栏"),//显示在状态栏上的信息
hDlg, //父窗口句柄
IDS_STATUS); //预定义的资源ID
此时创建的状态栏只是一个位于对话框底部的长条,如需要将其分割为几部分可以在数组中设定好分割点的X坐标,然后通过向状态栏发送SB_SETPARTS消息即可,该消息的wParam参数指定了要将状态栏分割为几部分,lParam参数指定了各分割点的坐标值:
int pint[4]={110,250,300,-1};//110,250,300设定间隔
::SendMessage(hStatusWindow,SB_SETPARTS,4,(LPARAM)pint);
如需向分割后的状态栏内填写信息,可以通过hStatusWindow向状态条发送消息SB_SETTEXT来完成,该消息的两个参数分别用来标识在第几个窗格显示和待显示的信息内容:
::SendMessage(hStatusWindow,SB_SETTEXT,1,(LP ARAM)TEXT("信息一"));
……
小结:本文以SDK的方式实现了在MFC对话框程序下工具条和状态栏的动态添加,使普通的对话框程序也可以象SDI和MDI程序一样拥有自定义风格的工具条和状态栏。
全部实现过程的重点是在对相关结构的设置和消息的发送以及控件的动态创建。
至于本文所涉及到的结构和函数的详细内容请参阅Microsoft 的MSDN Library 6.0。
本文所述程序在Windows 98下,由Microsoft V isual C++ 6.0编译通过。