VC++动态加入和删除菜单的方法

合集下载

vC++菜单

vC++菜单

C++下,对于菜单的处理有动态菜单和静态菜单两种,动态菜单比较麻烦,静态菜单系统已经搭好了框架。

前期巩固:1、每一个资源都对应一个类,在添加资源的时候同时也应该创建一个类。

2、消息函数添加流程,(1)、在CMainFrame()的DECLARE_MESSAGE_MAP()之前声明函数,声明格式:afx_msg void OnMybye();(2)、在构造函数中,On_Command(ID,函数名)增加映射消息宏3、客户端坐标与屏幕坐标的区别,客户端坐标是从窗体的左上角到右下角的坐标,而屏幕坐标是从屏幕左上角到右下角的坐标,坐标转换函数clienttoscren();关于菜单:1、菜单->子菜单->菜单项,子菜单不需要ID,菜单项需要ID2、获得菜单指针的方式:GetMenu()->GetSubMenu()前者获得菜单中的子菜单数组,子菜单元素用索引号表示,GetSubMenu(4),获得子菜单的菜单项两者都是通过函数获得菜单的指针得到菜单项的ID3、给菜单项增加复选标记,GetMenu()->GetSubMenu()->CheckMenuItem(所选项,操作)两个参数是相互对应的,(索引号,MF_BYPOSITION/MF_CHECKED)(ID,MF_BYCOMMAND/MF_CHECKED)3、注意,在菜单项中,分隔符也算一个索引值4、SetMenuItemBitmaps(1,2)给菜单项增加图标参数:索引号,MI_BYPOSITION,&图标,&未被选中时的图标5、总结:无论是新增菜单项还是移走菜单项,都是先获得子菜单指针,再获得菜单项指针,对菜单项进行操作。

6、移走菜单:SetMenu(Null)移走当前菜单7、创建菜单:CMenu menu;Menu.Loadmenu(ID)Menu.Deteach();8、右键创建菜单两种方式:1。

系统提供2.。

VC++控件使用——菜单

VC++控件使用——菜单

VC++控件使⽤——菜单VC++简单应⽤指南四——菜单⼀、菜单资源设计1.打开⼯作区窗⼝,在Resource View选项卡中,右击,选择插⼊2.打开插⼊资源对话框,选择Menu节点,点击新建3.打开菜单资源设计窗⼝,再按Enter键,显⽰菜单资源属性窗⼝4.在菜单资源属性窗⼝中填写标题5.选中菜单标题填写的⼦菜单,并点击Enter 键或者双击6.添加分割线,在菜单资源属性中点选分隔符(Separator)7.⼦菜单添加弹出菜单,菜单资源属性中点选弹出(Pop-up)8.给菜单添加快捷键,在标题后添加“&+字母”,则Alt+字母就是快捷键⼆、菜单项的命令处理1.命令设置在类向导中;打开类向导,点选Message Maps选项卡2.打开Message Maps选项卡,Class name对应对话框;Object IDs对应菜单项ID;Messages 对应事件:COMMAND单击事件3.选择COMMAND单击事件,点击Add Function,弹出创建窗⼝,点击OK4.在类向导中点击Edit Code按钮,显⽰命令处理函数三、动态创建菜单1.创建基于对话框的应⽤程序2.头⽂件中声明⼀个CMenu类对象m_Menu3.1在FileView选项卡中打开资源头⽂件(Resource.h),定义命令ID3.2在资源头⽂件中添加的代码如下#define ID_MENUCAT 1001#define ID_MENUDOG 1002#define ID_MENUMONKEY 10034.1在对话框OnInitDialog⽅法中创建菜单 4.2创建菜单程序m_Menu.CreateMenu();CMenu m_PopMenu;m_PopMenu.CreatePopupMenu();m_Menu.AppendMenu(MF_POPUP,(UINT)m_PopMenu,m_hMenu,"动物");m_PopMenu.AppendMenu(MF_STRING,ID_MENUCAT,"猫");m_PopMenu.AppendMenu(MF_STRING,ID_MENUDOG,"狗");m_PopMenu.AppendMenu(MF_STRING,ID_MENUMONKEY,"猴⼦");m_PopMenu.Detach();SetMenu(&m_Menu);5.2程序5.1在对话框的头⽂件中声明菜单的消息处理函数afx_msg void OnMenucat();afx_msg void OnMenudog();afx_msg void OnMenumonkey();6.2程序6.1在对话框源⽂件中添加消息映射宏,将命令ID关联到消息处理函数中ON_COMMAND(ID_MENUCAT,OnMenucat)ON_COMMAND(ID_MENUDOG,OnMenudog)ON_COMMAND(ID_MENUMONKEY,OnMenumonkey) 7.1在对话框源⽂件中添加消息处理函数7.2程序void CMy124Dlg::OnMenucat(){MessageBox("猫");}void CMy124Dlg::OnMenudog(){MessageBox("狗");}void CMy124Dlg::OnMenumonkey(){MessageBox("猴⼦");}四、创建弹出式菜单1.创建基于对话框的应⽤程序2.在资源选项卡中右击,选择插⼊,在插⼊资源窗⼝中选择Menu 点击新建3.对菜单进⾏编辑4.在对话框头⽂件中声明⼀个CMenu类对象m_Menu6.在类视图选项卡中,右击对话框程序节点,然后选择Add Windows Message Handler命令,在弹出的对话框中选择WM_RBUTTONUP 事件,点击Add Handler ,点击确定:⿏标右键抬起触发m_Menu.LoadMenu(IDR_MENU1);7.1在⿏标右键抬起事件处理函数中添加代码7.2程序CMenu *pMenu =m_Menu.GetSubMenu(0);CRect rect;ClientToScreen(&point);rect.top = point.x;rect.left = point.y;pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,rect.top,rect.left,this,&rect);8.1给弹出菜单中添加⽂件增加单击事件8.2程序MessageBox("成功");五、创建图标菜单1.创建基于对话框的应⽤程序2.在⼯作区窗⼝选择Recource View选项卡,右击⼀个节点,弹出快捷菜单,点击Insert命令3.在插⼊资源窗⼝,选择菜单资源,插⼊并编辑4.新建⼀个类;打开类向导,创建类名为CMenuIcon,5.打开CMenuIcon类的头⽂件,为该类添加⼀个基类Cmenu6.1在CMenuIcon头⽂件中定义⼀个数据结6.2程序构,⽤来保存菜单信息struct CMenuItem{CString m_ItemText;int m_IconIndex;int m_ItemID;};int m_Index;int m_IconIndex;CImageList m_ImageList;8.2程序8.1在CMenuIcon类的构造函数中初始化图像列表m_Index=0;m_IconIndex=0;m_ImageList.Create(16,16,ILC_COLOR24|ILC_MASK,0,0);m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON4));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON5));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON6));9.1在CMenuIcon类中添加AttatchMenu⽅法9.2AttatchMenu⽅法中添加程序9.3程序LoadMenu(m_uID);return TRUE;10.210.1在CMenuIcon类中添加MenuItem⽅法,并添加程序BOOL CMenuIcon::MenuItem(CMenu *pMenu){if(pMenu!=NULL){int m_Count=pMenu->GetMenuItemCount();for(int i=0;ipMenu->GetMenuString(i,m_ItemLists[m_Index].m_ItemText,MF_B YPOSITION);int m_itemID=pMenu->GetMenuItemID(i);m_ItemLists[m_Index].m_ItemID=m_itemID;if(m_itemID>0){m_ItemLists[m_Index].m_IconIndex=m_IconIndex;m_IconIndex+=1;}RING,m_ItemLists[m_Index].m_ItemID,(LPSTR)&(m_ItemLists[m_Index])); m_Index+=1;CMenu *m_SubMenu=pMenu->GetSubMenu(i);if(m_SubMenu){MenuItem(m_SubMenu);}}} return TRUE;}11.2程序11.1重载CMenuIcon类中MeasureItem虚拟⽅法,计算菜单项的⼤⼩1.在类上⽅右击,选择新建成员函数,并创建voidCMenuIcon::MeasureItem(LPMEASUREITEMSTRUCT IpStruct){if(IpStruct->CtlType==ODT_MENU){IpStruct->itemHeight=ITEMHEIGHT;IpStruct->itemWidth=ITEMWIDTH;CMenuItem* m_item;m_item=(CMenuItem*)IpStruct->itemData;IpStruct->itemWidth=((CMenuItem*)IpStruct->itemData)->m_ItemText.GetLength()*10;if(m_item->m_ItemID==0){IpStruct->itemHeight=2;}}}员函数,绘制菜单项⽂本void CMenuIcon::DrawItemText(CDC *pDC,LPSTR Str, CRect Rect){pDC->DrawText(Str,Rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);13.2程序13.1在CMenuIcon类中添加DrawItemIcon成员函数,绘制菜单项图标void CMenuIcon::DrawItemIcon(CDC *pDC, CRect Rect, int Icon){m_ImageList.Draw(pDC,Icon,CPoint(Rect.left+2,Rect.top+4),ILD_TRANSPARENT);}14.2程序14.1在CMenuIcon类中添加DrawSeparater成员函数,绘制分隔条void CMenuIcon::DrawSeparater(CDC *pDC, CRect Rect){pDC->Draw3dRect(Rect,RGB(255,0,255),RGB(255,0,255));}15.2程序15.1在CMenuIcon类中添加DrawTopMenu成员函数,绘制顶层菜单void CMenuIcon::DrawTopMenu(CDC *pDC, CRect Rect, BOOL Selected){if(Selected){pDC->Rectangle(&Rect);Rect.DeflateRect(1,1);pDC->FillSolidRect(Rect,RGB(192,170,220));}else{pDC->FillSolidRect(&Rect,RGB(192,192,192));}成员函数,绘制普通菜单项void CMenuIcon::DrawComMenu(CDC *pDC, CRect Rect, BOOL Selected) {if(Selected){pDC->Rectangle(&Rect);Rect.DeflateRect(1,1);pDC->FillSolidRect(Rect,RGB(255,0,0));}else{pDC->FillSolidRect(&Rect,RGB(255,255,255));}}17.2程序17.1重载CMenuIcon类中DrawItem虚拟⽅法,根据菜单项的不同状态绘制菜单项void CMenuIcon::DrawItem(LPDRAWITEMSTRUCT IpStruct){ if(IpStruct->CtlType==ODT_MENU) {if(IpStruct->itemData==NULL)return;unsigned int m_state=IpStruct->itemState;CDC* pDC=CDC::FromHandle(IpStruct->hDC);CString str =((CMenuItem*)(IpStruct->itemData))->m_ItemText;LPSTR m_str = str.GetBuffer(str.GetLength());intm_itemID=((CMenuItem*)(IpStruct->itemData))->m_ItemID;intm_itemicon=((CMenuItem*)(IpStruct->itemData))->m_IconIndex;CRect m_rect=IpStruct->rcItem;pDC->SetBkMode(TRANSPARENT);switch(m_itemID) {case -1: {DrawTopMenu(pDC,m_rect,(m_state&ODS_SELECTED)||(mDrawItemText(pDC,m_str,m_rect);break; }case 0: {DrawSeparater(pDC,m_rect);break;}default: {DrawComMenu(pDC,m_rect,m_state&ODS_SELECTED);DrawItemText(pDC,m_str,m_rect);DrawItemIcon(pDC,m_rect,m_itemicon);break; }}}}18.在对话框头⽂件中声明CMenuIcon类对象m_Menu 19.在对话框OnInitDialog⽅法中加载菜单资源,并设置菜单项m_Menu.AttatchMenu(IDR_MENU1);m_Menu.MenuItem(&m_Menu);this->SetMenu(&m_Menu);20重载对话框的OnDrawItem⽅法,在该⽅法中体⽤菜单类中DrawItem⽅法21重载对话框的OnMeasureItem⽅法,在该⽅法中体⽤菜单类中MeasureItem⽅法22.屏蔽message_map 23.析构函数中添加程序m_ImageList.Detach();。

C#.NET中动态添加与删除控件

C#.NET中动态添加与删除控件

C#.NET中动态添加与删除控件数组为共享公用功能的一组控件一起工作提供了便捷的途径。

例如,一组控件可能用于显示相关的数据,或者在被点击时提供相关的行为。

C#本身并不支持控件数组的建立,但是你可以通过编程复制控件数组的所有功能。

本文介绍复制控件数组功能的简单组件的建立。

控件数组的主要用处有:1,使用相同的名称与索引访问一组控件,允许用编号检索和设置数据项并且在整个数组中重复。

这个功能可以使用下面的代码实现。

伪代码myControl[myIndex].MyProperty = myValue;myControl[myIndex + 1].MyMethod2,多个对象使用同一个事件处理程序(event handler)处理事件,在这些事件中检索和使用索引,代码如下:伪代码private void myControl_Click(System.Object sender, System.EventArgs e){Messagebox.Show("You have clicked MyControl number " +myControl.Index);}3,在运行时动态添加或者删除控件,代码如下:伪代码for (int i = 1; i < 6; i++){//插入代码来建立控件并给属性赋值}C#允许你复制与控件数组相关的一些功能。

例如,你能使用委托把多个对象的事件绑定到一个事件处理程序。

但是,如果把这些功能合并到一个动态的、容易管理的组件中更加简便。

本文将建立有下面特性的组件:·建立索引和排序控件的集合。

将使用按钮集合来演示。

·一个事件处理程序来处理衍生的按钮的点击事件。

·使用索引引用控件和成员的代码。

·给窗体动态添加和删除控件的代码。

建立项目在本节中将建立并命名一个项目,并给该项目添加一个类。

该类将封装实现控件数组的代码。

1、选择File-> New-> Project菜单打开New Project对话框。

Vc++ 6.0 菜单的基本操作

Vc++ 6.0 菜单的基本操作

Vc++ 6.0 菜单的基本操作凡是从CWnd派生的类,它们既可以接收标准消息,也可以接收命令消息和通告消息。

而对于那些从CCmdTarget派生的类,则只能接收命令消息和通告消息,不能接收标准消息。

响应菜单项命令的顺序依次是:视类,文档类,框架类,最后才是应用程序类。

基本菜单操作:1. 标记菜单:可以通过CWnd的成员函数:GetMenu来获得指向菜单栏的指针,在框架类的OnCreate函数中,加入以下代码GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_C HECKED);2. 默认菜单项:分隔栏在子菜单中占据索引位置,一个子菜单只有一个默认菜单项GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);3. 图形标记菜单:m_bitmap.LoadBitmap(IDB_BITMAP1);GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION ,&m_bitmap,&m_bitmap);图形标记菜单上显示的位图的尺寸有固定的标准,我们创建的位图太大了,只显示了当前位图左上角的一小部分内容,通过GetSystemMetrics函数可以得到图形标记菜单上显示的位图的尺寸。

当该参数的值为SM_XMENUCHECK or SM_CYMENUCHECK时,这个函数将获取标记菜单项上标记图形的默认尺寸。

CString类提供了一个名为Format的函数,这个函数可以按照一定的格式把内容格式,然后将结果保存到CString类型的字符串对象中。

4. 禁用菜单项一旦在CMainFrame类的构造函数中把成员变量m_bAutoMenuEnable设置为FALSE后,就不需要对ON_UPDATE_COMMAND_UI或ON_COMMAND消息进行响应处理了,CMenu 类的EnableMenuItem函数将能够正常工作。

VC++中链接数据库并实现(添加、修改、删除、清空)功能

VC++中链接数据库并实现(添加、修改、删除、清空)功能

VC++中链接数据库并实现(添加、修改、删除、清空)功能VC++中⽤ADO编程⽅法链接数据库并实现添加、修改、删除、清空等功能1、数据库为Microsoft Office Access 2003为例2、数据库名为DataBase.mdb,表名employees,添加编号、学号、姓名字段,类型为⽂本。

数据库放在p5根⽬录下。

3、建⽴新建⼯程MFC AppWizard[exe]名称为p5。

选择基本对话框。

然后添加控件,⼀个列表控件,三个编辑框,五个按钮。

如下在列表控件,右键属性。

设置如下:然后建⽴类向导,在Member V ariables视图中为3个编辑框和1个列表控件添加变量名称和类型如图:五个按钮的ID和名字改为:IDC_BUTADD,添加;IDC_BUTMOD,修改;IDC_BUTDEL,删除;IDC_BUTCLICK,清空;IDC_BUTTON1,退出。

4、为⼯程加类ADO类,在ClassView中视图中在p5 classes上⾯点右键新建类,类的类型选Generic Class,名称为ADO,点确定。

同时在StdAfx.h头⽂件中加⼊ADO动态链接库,代码如下:#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace\rename("EOF","adoEOF")rename("BOF","adoBOF") //导⼊ADO动态链接库在Class View视图中的CP5Dlg中加⼊⾃定义函数AddToGrid和OnButclear。

这两个函数是⼿动添加的。

5、在ADO.app中程序为// ADO.cpp: implementation of the ADO class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "p5.h"#include "ADO.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////ADO::ADO(){}ADO::~ADO(){}void ADO::OnInitADOConn(){::CoInitialize(NULL);try{m_pConnection.CreateInstance("ADODB.Connection"); //创建连接对象实例_bstr_t strConnect="DRIVER={Microsoft Access Driver (*.mdb)};\uid=;pwd=;DBQ=DataBase.mdb;";m_pConnection->Open(strConnect,"","",adModeUnknown); //打开数据库}catch(_com_error e){AfxMessageBox(e.Description()); //弹出错误处理}}_RecordsetPtr& ADO::OpenRecordset(CString sql){ASSERT(!sql.IsEmpty()); //SQL语句不能为空try{m_pRecordset.CreateInstance(__uuidof(Recordset)); //创建记录集对象实例m_pRecordset->Open(_bstr_t(sql),m_pConnection.GetInterfacePtr(),adOpenDynamic, adLockOptimistic, adCmdText); //执⾏SQL得到记录集}catch(_com_error e) //捕获可能的异常{AfxMessageBox(e.Description());}return m_pRecordset;}void ADO::CloseRecordset(){if(m_pRecordset->GetState() == adStateOpen) //判断当前的记录集状态m_pRecordset->Close(); //关闭记录集}void ADO::CloseConn(){m_pConnection->Close(); //关闭数据库连接::CoUninitialize(); //释放COM环境}UINT ADO::GetRecordCount(_RecordsetPtr pRecordset){int nCount = 0; //声明保存记录数的变量try{pRecordset->MoveFirst(); //将记录集指针移动到第⼀条记录}catch(...) //捕捉可能出现的错误{return 0; //产⽣错误时返回0}if(pRecordset->adoEOF) //判断记录集中是否没有记录return 0; //⽆记录时返回0while (!pRecordset->adoEOF) //当记录集指针没有指向最后时{pRecordset->MoveNext(); //将记录集指针移动到下⼀条记录nCount = nCount + 1; //记录个数的变量加1}pRecordset->MoveFirst(); //将记录集指针移动到第⼀条记录return nCount; //返回记录数}6、在ADO.h头⽂件中程序为// ADO.h: interface for the ADO class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_ADO_H__E0F8432E_F797_4979_8FB0_EAC60CA6 C7F9__INCLUDED_) #defineAFX_ADO_H__E0F8432E_F797_4979_8FB0_EAC60CA6C7F9__INC LUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000class ADO{public:_ConnectionPtr m_pConnection; //连接对象指针_RecordsetPtr m_pRecordset; //记录集对象指针public:ADO();virtual ~ADO();void OnInitADOConn(); //连接数据库_RecordsetPtr& OpenRecordset(CString sql); //打开记录集void CloseRecordset(); //关闭记录集void CloseConn(); //关闭数据库连接UINT GetRecordCount(_RecordsetPtr pRecordset); //获得记录数};#endif// !defined(AFX_ADO_H__E0F8432E_F797_4979_8FB0_EAC60CA6C 7F9__INCLUDED_)这是⼀个封装的连接数据库⽂件。

动态添加菜单项、子菜单、右键菜单 VC

动态添加菜单项、子菜单、右键菜单 VC

动态添加菜单项、子菜单、右键菜单VC动态添加菜单项、子菜单、右键菜单(VC)2010-06-27 16:56如何动态添加菜单/菜单项、子菜单、右键菜单有关菜单的操作主要用到CMenu类,当然也可用相应API函数,CMenu类只是MFC对API中操作菜单的函数的封装而已。

不过能用类就尽量用类,类的组织方式好呗,代码看着也舒服。

若是SDK编程,那就用API吧。

CMenu menuMain,menu1;//首先定义CMenu对象一、创建菜单,有两种方法1.用LoadMenu函数从资源加载menuMain.LoadMenu(IDR_MAINFRAME);//从资源加载,这里使用SDI的主菜单资源2.用CreateMenu函数创建menu1.CreateMenu();//创建菜单,还没有菜单项二、添加菜单项,可用AppendMenu()在菜单的最后加、InsertMenu()在指定的位置加.//ID_TEST1在Resource.h中定义,随便给个整数值,不要和已有的重复就行了menu1.AppendMenu(MF_STRING,ID_TEST1,"Test1");//第一项菜单项menu1.AppendMenu(MF_STRING,ID_TEST2,"Test2");//第二项菜单项menu1.InsertMenu(1,MF_BYPOSITION|MF_STRING,(UINT)ID_TEST1,"ID_TEST1");//在第二项菜单项前添加新菜单项三、添加子菜单同样用AppendMenu()、InsertMenu()函数。

不过要注意参数的设置。

menu1.AppendMenu(MF_BYPOSITION|MF_POPUP|MF_STRING,(UINT)menuMain.GetSubMenu(0)-m_hMenu,"子菜单");//第二个参数是菜单的句柄HMENU四、删除菜单用DeleteMenu()、RemoveMenu()函数来删除指定位置的菜单/菜单项。

VCMFC之ListCtrl控件使用经验总结

VCMFC之ListCtrl控件使用经验总结本文将从创建ListCtrl控件、数据的插入、删除和修改、列表项的选择和排序等方面,总结一些经验和注意事项。

一、创建ListCtrl控件创建ListCtrl控件的方法有很多,下面介绍两种常用的方法。

2. 动态创建ListCtrl控件:可以通过CListCtrl类的Create函数来动态创建ListCtrl控件。

例如:```cppCListCtrl m_listCtrl;m_listCtrl.Create(WS_CHILD , WS_VISIBLE , LVS_REPORT, CRect(0, 0, 500, 300), this, IDC_LIST_CTRL);```此外,还可以通过控件向导创建ListCtrl控件,控件向导在创建ListCtrl控件时会生成相关的代码。

二、数据的插入、删除和修改1.插入数据:可以使用InsertItem函数向ListCtrl控件中插入新的项。

例如:```cppm_listCtrl.InsertItem(0, _T("Item 1"));2.删除数据:可以使用DeleteItem函数删除ListCtrl控件中的其中一项。

例如:```cppm_listCtrl.DeleteItem(0);```3.修改数据:可以通过SetItemText函数修改ListCtrl控件中其中一项的文字。

例如:```cppm_listCtrl.SetItemText(0, 1, _T("Modified Item"));```三、列表项的选择和排序1.列表项的选择:可以使用GetNextItem函数和SetItemState函数来获取和设置ListCtrl控件中的选中项。

例如:```cppint nItem = m_listCtrl.GetNextItem(-1, LVNI_SELECTED);m_listCtrl.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);2.列表项的排序:可以使用SortItems函数对ListCtrl控件中的数据进行排序。

VC++环境下菜单和工具栏的动态修改技术

VC++环境下菜单和工具栏的动态修改技术Visual C++是一种可视化很强的编程工具,其内置的向导AppWizard可以自动生成程序的基本框架,减少了大量程序开发基本工作。

比如利用的AppWizard 可以自动为应用程序生成菜单和工具栏,非常方便。

如果是编写一般的应用程序,完全可以在其提供的菜单和工具栏上进行修改,添加或删除菜单项。

但在实际使用中,如果遇上些比较复杂的程序,仅用系统提供的菜单和工具栏是远远不够的。

应用程序应该可以按照用户的不同状态,显示不同菜单项和工具栏,以实现动态的对菜单和工具栏进行修改,加载新的菜单和工具栏。

在编程过程中实现菜单和工具栏的动态修改基本上有两种方法。

一是在程序运行过程中利用Cmenu类的AppendMenu和Cmenu类的InsertMenu按需在菜单上插入新的菜单项,但此方法如果只是用在动态改变少数菜单项,其编程工作量还是可以接收,但如果需要改变的部分较多则编程工作量就很大,而且最大问题是如果采用此法插入的菜单项,CLASS WIZARD不能产生相应的消息响应函数,程序员必须自己编写消息响应循环。

因此,提出第二种动态修改方法。

该方法的关键是不对菜单和工具栏进行修改,而是通过加载不同的菜单和工具栏实现对菜单和工具栏的动态修改。

该方法的优点在于不必编写大量的菜单项插入命令,只需事先在资源内根据实际的情况定义不同的菜单和工具栏,然后在程序中根据用户状态加载不同的菜单和工具栏资源实现菜单和工具栏的动态更新。

而且此方法适用于CLASS WIZARD,可以在CLASS WIZARD中直接产生各菜单项的消息响应和其它相关函数,大大减少了程序的开发工作量。

其具体步骤如下:首先分析程序运行过程中所出现的各种变化情况,按照不同的菜单状态在资源管理中创建不同的菜单资源和工具栏资源。

然后在需要修改菜单和工具栏的地方利用LoadToolBar函数和LoadMenu函数调入相应的菜单资源和工具栏资源。

VisualC使用方法

1
[File]文件菜单
[File]菜单共有14选项,分成6组:
1、[New]新建一个一般文件,工程,工作区,其他文档。 [Open]打开、[Close]关闭 2、Workspace工作区操作,打开、保存和关闭工作区。 3、有三个菜单项,用于文件保存。 4、有二个菜单项,用于文件打印。 5、用于打开以前打开过的文件或工作区。 6、一个菜单项Exit,用于退出Visual C++ 6.0。
24
用VC++开发程序的过程
• 用App Wizard新建一个工程 • 编辑代码 • 编译代码 • 调试和执行程序
25
App Wizard
• App Wizard(应用程序生成器)是Visual C++自带 的一个工具,通过它,可以方便地生成各种类型的程 序的框架。
• 选择菜单中的File---->New…,即可以使用App Wizard来新建程序。
10
工具栏
工具栏由多个操作按钮组成,这些操作一般都与某个菜单项对 应。主要工具栏如下: 1、Standard提供最基本的功能:文件操作、编辑、查找等。 2、Build工程的编译、连接、修改活动配置、运行调试程序。 3、Build MiniBar由部分按钮组成的工具栏。 4、Resource添加各种类型的资源。 5、Edit剪切、复制和粘贴等功能。 6、Debug用于调试状态的若干操作 7、Browse源程序浏览操作 8、Database跟数据库有关的操作。
22
5.在弹出窗口选择标签File,选C++ Source File,并 在File框输入文件名。(此时,Add to project框应该是 刚输入的工程名,Location框应是刚输入的路径名).

MicrosoftVisual++使用方法实用!


[Tools]工具菜单
[Tools]菜单中是Visual C++附带的各种工具。 其中常用的工具有 ActiveX Control Test Container(测试一个 ActiveX控件的容器)、 Spy++(用于程序运行时以图形化方式查看系统进程 、线程、窗口、窗口信息等), 以及MFC Tracer(用于程序跟踪)等。
11
工具栏
工具栏由多个操作按钮组成,这些操作一般都与某个菜单项对 应。主要工具栏如下: 1、Standard提供最基本的功能:文件操作、编辑、查找等。 2、Build工程的编译、连接、修改活动配置、运行调试程序。 3、Build MiniBar由部分按钮组成的工具栏。 4、Resource添加各种类型的资源。 5、Edit剪切、复制和粘贴等功能。 6、Debug用于调试状态的若干操作 7、Browse源程序浏览操作 8、Database跟数据库有关的操作。
Visual C++使用方法简介
1
Visual C++菜单栏
Visual C++6.0的菜单分成9大类: [File]文件 [Edit]编辑 [View]视图 [Insert]插入 [Project]工程 [Build]组建 [Tools]工具 [Window]窗口 [Help]帮助
在程序运行时, Visual C++ 6.0的菜单栏可以动态改变,还 有[Layout]和[Debug]。 如在调试状态下, [Build]变成了[Debug]。
23
5.在弹出窗口选择标签File,选C++ Source File,并 在File框输入文件名。(此时,Add to project框应该是 刚输入的工程名,Location框应是刚输入的路径名).
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC++动态加入和删除菜单的方法
在应用程序中,往往要根据当前的操作来增加相应的菜单。

动态增加菜单的方法有多
种,本文只讲述利用资源编辑器预创建菜单资源,然后在程序运行中动态加入(或删
除)到主菜单中去的方法。

一、用AppWizard建立一个单文档工程,默认一切选项。

在WorkSpace(工作空间)的
ResourecView页中右击Menu资源,加入一个新的菜单,其ID为:IDR_MENU1。


IDR_MENU1加入一个菜单项和相应的子菜单。

如(图一)所示。

二、编辑IDR_MAINFRAME菜单(ID为IDR_MAINFRAME的菜单一般均为主菜单),在【查看
(V)】菜单项下面增加二个子菜单项。

如(图二)所示。

其属性如下:
ID
Caption
IDC_ADD
加入菜单
IDC_DELETE
删除菜单
三、要访问要菜单,可使用CWnd类的GetMenu()成员函数、或使用全局函数AfxGetMainWnd()―>GetMenu(),它们都返回一个CMenu对象的指针。

一旦得到Cmenu指
针,就可以对菜单进行各种操作(装入、增加、插入,删除,更新等等)。

通过Cmenu
指针对菜单进行操作后,应使用Cmenu类的Detach()成员函数从Cmenu对象中分离出菜
单,避免发生冲突。

之后调用CWnd::DrawMenuBar()重画菜单。

四、为实现加入、删除操作,我们用“ClassWizard”向导为IDC_ADD和
IDC_DELETE增加
两个COMMAND消息映射函数,它们分别为CMainFrame::OnAdd() 和CMainFrame::OnDelete()。

接着我们为其编写代码如下:
void CMainFrame::OnAdd() //加入菜单操作。

{
CMenuaddmenu,*mainmenu;
if(!addmenu.LoadMenu(IDR_MENU1)) //装入菜单资源。

{
MessageBox("菜单装入失败!","错误",MB_OK|MB_ICONERROR);
return; //如装入失败,显示消息框,且返回。

}
CStringstr="颜色(&C)"; //要增加的菜单项的标签。

mainmenu=AfxGetMainWnd()->GetMenu();
//取得指向窗口菜单的Cmenu对象的指针。

mainmenu->InsertMenu (1,MF_POPUP|MF_BYPOSITION|MF_STRING,
(UINT)addmenu.GetSubMenu(0)->m_hMenu,str);
//将弹出式菜单插入到第2项菜单之前(菜单项从0开始计算)。

// addmenu.GetSubMenu(0)->m_hMenu是被装入菜单的第一个菜单项的弹出式菜单的菜单句柄。

mainmenu->Detach(); //将窗口菜单与Cmenu对象分离。

addmenu.Detach(); //将资源菜单(IDR_MENU1)与Cmenu对象分离。

DrawMenuBar(); //重画菜单。

}
Cmenu::InsertMenu的函数原形如下:
BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
参数 nPosition:指定在那个菜单项前插入新菜单项。

被参数nFlags用于以下列方式解释nPosition
NFlags参数
NPosition参数的解释
MF_BYCOMMAND
指定参数给出巳存在的菜单项的命令ID号。

此为缺省值。

MF_BYPOSITION
指定参数给出巳存在的菜单项的位置。

第一项位于位置0。

如果Nposition为-1,新菜单将添加到菜单尾。

参数 nFlags:指定Nposition、nIDNewItem、lpszNewItem值如何被解释。

参数 nIDNewItem:指定新菜单项的命令ID号,或者,若nFlags被设置为
MF_POPUP,则指定为弹出菜单的菜单句柄(HMENU)。

若nFlags被设置为
MF_SEPARATOR,那么参数nIDNewItem将被忽略。

参数 lpszNewItem:指定新菜单项的文本。

被nFlags以下列方式解释
NFlags参数
LpszNewItem的解释
MF_STRING
包含指向以空格位终止符的字符串指针。

它为缺省解释。

MF_SEPARATOR
参数将被忽略。

void CMainFrame::OnDelete() //删除菜单操作。

{
CMenu *m
ainmenu;
CStringstr;
mainmenu=GetMenu(); //取得指向窗口菜单的Cmenu对象的指针。

for(int i=mainmenu->GetMenuItemCount()-1;i>=0;i--) //取得菜单的项数。

{
mainmenu->GetMenuString(i,str,MF_BYPOSITION);
//将指定菜单项的标签拷贝到指定的缓冲区。

MF_BYPOSITION的解释见上。

if(str=="颜色(&C)") //如果是刚才我们增加的菜单项,则删除。

{
mainmenu->DeleteMenu(i,MF_BYPOSITION);
break;
}
}
mainmenu->Detach(); //将窗口菜单与Cmenu对象分离。

DrawMenuBar(); //重画菜单。

}
五、编译,运行程序,看看到底是怎样的!用这种方法动态增加菜单有它的好处:即我们可以事先为菜单ID编写好COMMAND、UPDATE_COMMAND_UI消息映射入口,在程序需要时动态的装入菜单即可。

相关文档
最新文档