VC++控件使用——菜单
VC6.0常用控件使用方法

VC6.0常用控件使用方法 26、List Box---------------列表框控件--类CListBox(1)插入项m_list.AddString(string);(2)设置当前选择项m_list.SetCurSel(项索引);(3)获取当前选择项int nIndex = m_list.GetCurSel();m_list.GetText(nIndex, string);(4)删除一项m_list.DeleteString(项索引);(5)删除所有项m_list.ResetContent();(6)获取总项数m_list.GetCount()(7)List Box的选项前面加复选框(Check Box)a.风格声明时用类CCheckListBox代替CListBox,即CCheckListBox m_list;而不是CListBox m_list;属性对话框->Styles->Owner draw设为Fixed属性对话框->Styles->勾选Has stringsb.设置选择void SetCheck( int nIndex, int nCheck );ParametersnIndexIndex of the item whose check box is to be set.nCheckState of the check box: 0 for clear, 1 for checked, and 2 for indeterminate.c.获取选择int GetCheck( int nIndex );ParametersnIndexIndex of the item whose check status is to be retrieved.Return ValueZero if the item is not checked, 1 if it is checked, and 2 if it is indeterminate.7、List Control----------列表框扩展控件--类CListCtrl(1)样式:属性对话框框->Styles->Format有4,分别是Icon/Small Icon/List/Report;(2)Report格式设置扩展风格DWORD dwStyle = m_list.GetExtendedStyle();dwStyle |= LVS_EX_FULLROWSELECT; // 选中某行使整行高亮(只适用与report风格的listctrl)dwStyle |= LVS_EX_GRIDLINES; // 网格线(只适用与report风格的listctrl)m_list.SetExtendedStyle(dwStyle);(3)Report格式插入列m_list.InsertColumn(1, "列一", LVCFMT_RIGHT, 150);m_list.InsertColumn(2, "列二", LVCFMT_LEFT, 100);m_list.InsertColumn(3, "列三", LVCFMT_LEFT, 100);m_list.InsertColumn(4, "列四", LVCFMT_LEFT, 200);m_list.InsertColumn(5, "ID", LVCFMT_CENTER, 0);(4)Report格式插入一行数据int nIndex = m_list.GetItemCount();m_list.InsertItem(nIndex, s1);m_list.SetItemText(nIndex, 1, s2);m_list.SetItemText(nIndex, 2, s3);m_list.SetItemText(nIndex, 3, s4);m_list.SetItemText(nIndex, 4, s5);(5)Report格式删除所有行m_list.DeleteAllItems();(6)Report格式获取某行某列数据CString sID = m_list.GetItemText(行索引,列索引);(7)Report格式删除选择行,多选时可用循环。
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();。
VC6.0中控件及按钮的设置和使用

VC6.0中控件及按钮的设置和使用VC学习笔记1:按钮的使能与禁止用ClassWizard的Member Variables为按钮定义变量,如:m_Button1;则m_Button1.EnableWindow(true); 使按钮处于允许状态m_Button1.EnableWindow(false); 使按钮被禁止,并变灰显示VC学习笔记2:控件的隐藏与显示用CWnd类的函数BOOL ShowWindow(int nCmdShow)可以隐藏或显示一个控件。
例1:CWnd *pWnd;pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT为控件ID号pWnd->ShowWindow( SW_HIDE ); //隐藏控件例2:CWnd *pWnd;pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT为控件ID号pWnd->ShowWindow( SW_SHOW ); //显示控件以上方法常用于动态生成控件,虽说用控件的Create函数可以动态生成控件,但这种控件很不好控制,所以用隐藏、显示方法不失为一种替代手段。
VC学习笔记3:改变控件的大小和位置用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置。
void MoveWindow(int x,int y,int nWidth,int nHeight);void MoveWindow(LPCRECT lpRect);第一种用法需给出控件新的坐标和宽度、高度;第二种用法给出存放位置的CRect对象;例:CWnd *pWnd;pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT1为控件ID号pWnd->MoveWindow( CRect(0,0,100,100) ); //在窗口左上角显示一个宽100、高100的编辑控件SetWindowPos()函数使用更灵活,多用于只修改控件位置而大小不变或只修改大小而位置不变的情况:BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);第一个参数我不会用,一般设为NULL;x、y控件位置;cx、cy控件宽度和高度;nFlags常用取值:SWP_NOZORDER:忽略第一个参数;SWP_NOMOVE:忽略x、y,维持位置不变;SWP_NOSIZE:忽略cx、cy,维持大小不变;例:CWnd *pWnd;pWnd = GetDlgItem( IDC_BUTTON1 ); //获取控件指针,IDC_BUTTON1为控件ID号pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE ); //把按钮移到窗口的(50,80)处pWnd = GetDlgItem( IDC_EDIT1 );pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE ); //把编辑控件的大小设为(100,80),位置不变pWnd = GetDlgItem( IDC_EDIT1 );pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER ) ; //编辑控件的大小和位置都改变以上方法也适用于各种窗口。
VC经验技巧:标题栏、按钮、菜单等。-wonsoft的专栏-CSDN博客

VC经验技巧:标题栏、按钮、菜单等。
-wonsoft的专栏-CSDN博客VC经验技巧1.窗口最大最小化按纽的控制①怎样在程式开始的时候让他最大化?②vC++做出来的exe文档在窗体的右上方是没有最大化和最小化按钮的,怎样实现这一功能?③如何在显示窗口时,使最大化按钮变灰?①在App类里的C…App::InitInstance()中把m_pMainWnd->ShowWindow(SW_SHOW)改成m_pMainWnd->ShowWindow(SW_MAXIMIZE);②在CreateWidnow时用WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX 风格.③ 第一种方法:BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {if( !CFrameWnd::PreCreateWindow(cs) )return FALSE;// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT cs// disable the maxmini boxcs.style &= ~WS_MAXIMIZEBOX;return TRUE;}第二种方法:CMenu*pMenu=AfxGetApp()->m_pMainWnd->GetSystemMenu(FALSE );int x=pMenu->GetMenuItemCount( );UINT pID=pMenu->GetMenuItemID(x-1);pMenu->EnableMenuItem(pID, MF_DISABLED);第三种方法:ModifyStyle(WS_MAXIMIZEBOX, 0);这个函数也能够是最大化按钮失效!并且能够在程式中动态的改变窗口的风格2.创建动态菜单void CMainFrame::OnSelectState(NMTOOLBAR* pnmtb, LRESULT *plr){CMenu menu;if(!menu.CreateMenu())return;menu.AppendMenu(MF_STRING,0,"开始");menu.AppendMenu(MF_STRING,0,"结束");CRect rc;m_wndT oolBar.SendMessage(TB_GETRECT, pnmtb->iItem, (LPARAM)&rc);m_wndT oolBar.ClientToScreen(&rc);menu.TrackMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,rc.left, rc.bottom, this, &rc);// menu.DestroyMenu();menu.detach();}3.如何禁止对话框关闭按钮和浮动工具条上的系统菜单1、禁止对话框中的关闭按钮有二种方法。
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++控件使用——状态栏一、创建状态栏/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++ 控件使用方法大全

在 Member variable name 处链接变量名 m_strEdit (这里 m 表示该变量为类 CDialogDemoDlg 的一 个成员变量,str 表明其类型为字符串,即类 CString),在 Category 下拉列表中选择 Value (另一 种选择是 Control,两种选择的不同将在后面的内容中讲述),在 Variable type 下拉列表中选择 CString (还有其它很多数据类型可供选择,但由于这里编辑框中的内容为一字符串,因此 CString 是最恰当的选择)。单击 OK 关闭对话框。
• 类 CCheckListBox 用于创建选择列表框,这种列表框中的每一项前面有一个复选框,以决定 该项是否被选中。
• 类 CDragListBox 用于创建一种特殊的列表框,这种列表框允许用户移动列表项。 在本章我们仅讲述第一类控件,即 Windows 标准控件。所涉及的内容包括各个控件的使用及相应的 技巧。
图 6. 7 使用 ClassWizard 设置数据验证方案 6. 从 Workspace 窗口的 ClassView 中双击类 CDialogDemoDlg 的 OnInitDialog 成员函数,使用下 面的代码来代替位于语句 return TRUE; 前的// TODO 注释:
m_strEdit="您好! 请在这里输入一些字符串。"; UpdateData(FALSE); 7. 在 ClassView 中双击类 CDialogDemoApp 的 InitInstance 成员函数,使用下面的代码来找替位 于选择支 if (nResponse == IDOK) 下的//TODO 注释: AfxMessageBox(dlg.m_strEdit); 然后将同一成员函数中的下面的代码行删掉(或注释掉): m_pMainWnd = &dlg; 8. 编译并运行该应用程序。显示如图 6.8 所示的对话框。
VC常用控件的使用

m_scrollbar.SetScrollPos(m_scrollbar.GetScrollPos()-10); break;
case SB_PAGERIGHT: m_scrollbar.SetScrollPos(m_scrollbar.GetScrollPos()+10); break;
case SB_THUMBTRACK:
m_scrollbar.SetScrollPos( nPos ); break; }
m_score=m_scrollbar.GetScrollPos();
UpdateData(FALSE);
非模态对话框
1.在视图类头文件中添加对话框成员指针 , 并包含对话框头文件 public: DlgModaless * pdlg;
SetCurSel( ) GetCurSel( )
例如:m_comboyear. InsertString (0, “1984”); m_comboyear. SetCurSel(0) ; int i= m_comboyear .GetCurSel( ); CListBox 列表框控件 GetLBText( i, temp );
WM_HSCROLL, 水平滚动,
加入控件并为控件加成员变量和函数
在OnInitDialog()消息函数中添加滑动条初始化代码
m_slider.SetRange(0,100); //变化范围,默认0~100 m_slider .SetPos(0);//初始值为零
在对话框类中为滑动条添加WM_HSCROLL消息
并包含对话框头文件
#include “DlgModaless.h”
2.在视图源文件中添加消息响应函数
void CDialogView::OnShowdlg ( ) {
Vc++控件ListControl用法总结

Vc++控件ListControl⽤法总结1.新建对话框MFC,在对话框上放⼀个ListCtrlID:IDC_PATHView:Report2.为ListCtrl添加变量右击->添加变量m_wndPath3.找到OnInitDialog()函数添加如下代码:// TODO: 在此添加额外的初始化代码m_wndPath.DeleteAllItems();//清空m_wndPath.InsertColumn(0,_T("项⽬"));//添加列m_wndPath.InsertColumn(1,_T("所在路径"));m_wndPath.SetColumnWidth(0, 150);//设置列宽m_wndPath.SetColumnWidth(1, 350);m_wndPath.SetRedraw(FALSE);//防⽌重绘int nIndex;//char|TCHAR项⽬属性->字符集:使⽤多字节字符集TCHAR Path[MAX_PATH+1];//TCHAR取代char MAX_PATH最长路径nIndex=m_wndPath.InsertItem( 0,_T("Windows⽬录") );if( nIndex < 0 ) return TRUE;GetWindowsDirectory(Path,MAX_PATH);//取得windows⽬录m_wndPath.SetItemText( nIndex, 1, Path );LPITEMIDLIST pidl;//桌⾯CSIDL_DESKTOPDIRECTORY//⽤来得到系统的某些特定⽂件夹的位置信息if(SUCCEEDED(SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOPDIRECTORY,&pidl))) {if(SHGetPathFromIDList(pidl, Path))//功能是把项⽬标志符列表转换为⽂档系统路径{nIndex=m_wndPath.InsertItem( 0,_T("桌⾯"));//成功则返回0if( nIndex < 0 ){return TRUE;}m_wndPath.SetItemText( nIndex, 1, Path );}}m_wndPath.SetRedraw(TRUE);//显⽰return TRUE; // 除⾮将焦点设置到控件,否则返回 TRUE4.char被TCHAR取代,若要⽤则:项⽬属性->字符集:使⽤多字节字符集参考代码:m_wndPath.DeleteAllItems();m_wndPath.InsertColumn(0,"项⽬");m_wndPath.InsertColumn(1,"所在路径");m_wndPath.SetColumnWidth(0, 150);m_wndPath.SetColumnWidth(1, 350);m_wndPath.SetRedraw(FALSE);int nIndex;const int nFolder[]={ CSIDL_ALTSTARTUP,CSIDL_APPDATA,CSIDL_BITBUCKET,CSIDL_COMMON_ALTSTARTUP,CSIDL_COMMON_DESKTOPDIRECTORY,CSIDL_COMMON_FAVORITES,CSIDL_COMMON_PROGRAMS,CSIDL_COMMON_STARTMENU,CSIDL_COMMON_STARTUP,CSIDL_CONTROLS,CSIDL_COOKIES,CSIDL_DESKTOP,CSIDL_DESKTOPDIRECTORY,CSIDL_DRIVES,CSIDL_FAVORITES,CSIDL_FONTS,CSIDL_HISTORY,CSIDL_INTERNET,CSIDL_INTERNET_CACHE,CSIDL_NETHOOD,CSIDL_NETWORK,CSIDL_PERSONAL,CSIDL_PRINTERS,CSIDL_PRINTHOOD,CSIDL_PROGRAMS,CSIDL_RECENT,CSIDL_SENDTO,CSIDL_STARTMENU,CSIDL_STARTUP,CSIDL_TEMPLATES };const CString strFolderName[]={ "CSIDL_ALTSTARTUP","CSIDL_APPDATA","回收站","CSIDL_COMMON_ALTSTARTUP", "CSIDL_COMMON_DESKTOPDIRECTORY","CSIDL_COMMON_FAVORITES","CSIDL_COMMON_PROGRAMS","CSIDL_COMMON_STARTMENU","CSIDL_COMMON_STARTUP","控制⾯板","CSIDL_COOKIES","CSIDL_DESKTOP","桌⾯","我的电脑","收藏夹","字体","历史纪录","CSIDL_INTERNET","CSIDL_INTERNET_CACHE","⽹上邻居","CSIDL_NETWORK","我的⽂档","打印机","CSIDL_PRINTHOOD","程序组","最近打开的⽂档","发送","任务条启动菜单⽬录","启动⽬录","临时⽂档" };char Path[MAX_PATH+1];nIndex=m_wndPath.InsertItem( 0,"Windows⽬录" );if( nIndex < 0 ) return TRUE;GetWindowsDirectory(Path,MAX_PATH);m_wndPath.SetItemText( nIndex, 1, Path );nIndex=m_wndPath.InsertItem( 0,"System⽬录" );if( nIndex < 0 ) return TRUE;GetSystemDirectory(Path,MAX_PATH);m_wndPath.SetItemText( nIndex, 1, Path );int i,count=sizeof(nFolder)/sizeof(int);for(i=0;i<count;i++){LPITEMIDLIST pidl;LPMALLOC pShellMalloc;if(SUCCEEDED(SHGetMalloc(&pShellMalloc))){if(SUCCEEDED(SHGetSpecialFolderLocation(NULL,nFolder[i],&pidl))){if(SHGetPathFromIDList(pidl, Path)){nIndex=m_wndPath.InsertItem( 0,strFolderName[i] );if( nIndex < 0 ){pShellMalloc->Free(pidl);pShellMalloc->Release();return TRUE;}m_wndPath.SetItemText( nIndex, 1, Path );}pShellMalloc->Free(pidl);}pShellMalloc->Release();}}m_wndPath.SetRedraw(TRUE);以上所述就是本⽂的全部内容了,希望⼤家能够喜欢。
动态添加菜单项、子菜单、右键菜单 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()函数来删除指定位置的菜单/菜单项。
vc_5菜单和工具条 vc入门ppt

工具栏(Toolbar) 工具栏(Toolbar) (Toolbar
m_colorref=RGB(255,0,0); Invalidate();
}
void CMenuDlg::OnQuicWhite()
{ // TODO: Add your command handler code here
m_colorref=RGB(255,255,255); Invalidate();
(2) 双击“编辑”菜单下的空菜单项,弹出如图所 双击“编辑”菜单下的空菜单项, Properties” 对话框, ID”列 示“Menu Item Properties 对话框,在“ID 列 表框中输入新添加菜单项的标识符ID_MYMENU ID_MYMENU。 表框中输入新添加菜单项的标识符ID_MYMENU。在 Caption文本编辑框中输入“我的菜单”。 Caption文本编辑框中输入“我的菜单” 文本编辑框中输入
void CMenuDlg::OnMessText() {
// TODO: Add your command handler code here
m_stredit="你好,世界!"; 你好,世界! 你好 UpdateData(FALSE); }
oid CMenuDlg::OnAbout() {
// TODO: Add your command handler code here
菜单标题 显示 隐藏 红色 蓝色 白色
菜单ID 菜单ID ID_QUICKSHOW ID_QUICKHIDE ID_QUICKRED ID_QUICKBLUE ID_QUICKWHITE
显示 隐藏 红色 蓝色 白色
(3)为了能在对话框中显示快捷菜单,必须 为了能在对话框中显示快捷菜单, 为对话框类CMenuDlg CMenuDlg添加一个消息映射函数 为对话框类CMenuDlg添加一个消息映射函数 OnContextMenu()(对应的Messages列表框中 对应的Messages OnContextMenu()(对应的Messages列表框中 WM_CONTEXTMENU) 选WM_CONTEXTMENU)
VC++“成员变量,菜单项,新建对话框应用”

1
第一步 建立单文档应用程序,设置菜单项
2
第二步. 插入新的对话框,放置静态文本框和编辑框控件
3
第三步,将新插入的对话框和菜单选项关联起来
3.1 创建一个新的对话框类
3.2 利用类向导为菜单选项添加消息映射函数
4
5
3.3 在映射函数中添加2行代码,并把新建类的头文件包含在内
6
3.4 编译试运行,可弹出对话框
第四步设置对话框中5个编辑框控件的成员变量
4.1 设置整型变量 4.2 设置完毕,控件和成员变量建立了对应关系
7
4.3 给对话框中的按钮控件添加3行代码
8
9
第五步 编译,运行
Done!
多练习几遍,熟能生巧!。
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 制作菜单 menu

Member functions
• 选中ID_DRAW_LINETO 后我们会看到 在“Messages:”列表框中列出了它所支持 的MFC 系统消息,也就是菜单项所支持的 MFC 系统消息。而在“Member functions:” 列表框中列出了CDrawTestView 类当前所 有的成员函数。如图所示。
二级菜单
• 按照上述方法,可以将我们所需要的菜 单项创建出来,二级菜单项输入Caption”, 并且选择“Pop-up”复选框,三级菜单项不 选择“Pop-up”复选,输入“Caption”和 “ID”,具体值在菜单结构表中已经列出。
ClassWizard(类向导)
此时我们运行应用程序,可以看到应用 程序菜单已经是我们所创建的了。但是各 菜单项都处于灰色不可用状态,这是因为 我们还没有为各菜单项连接处理函数。 • 下面我们将用ClassWizard(类向导) 为菜单项来连接处理函数。 •
vc 制作菜单 menu
10 11 23
选择资源面板,在Menu(菜单)节点 下,双击IDR_MAINFRAME 页节点, • 在编辑区就会将当前应用程序的菜单打 开。如图所示。该菜单是由MFC应用程序 框架所提供的初始菜单。我们要修改此菜 单,添加我们所需要的菜单项。 •
修改菜单
• 在修改菜单之前,我们先了解一些菜单编辑的 相关知识。我们都知道,Windows 的菜单是一种 分级菜单,我们在菜单编辑区中用鼠标选择“文 件(F)”菜单项,会打开该菜单项的下级菜单。 • 如图所示。我们可以称“文件(F)”菜单项为第 一级菜单,而其下级菜单为第二级菜单,如果第 二级菜单还有下级菜单,选择该第二级菜单,其 下级菜单会自动打开,这些菜单就是第三级菜单, 以此类推。选中菜单项后可以按按“Delete”键将
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主要菜单工具使用

主要用于选择或制 定开发环境中的一 些实用工具。
(八) Windows菜单
Windows菜单中的命
令主要用于文档窗口 的操作。如排列文档、 打开或关闭一个文档 窗口、重组或切分文 档窗口等。
(九)Help菜单
Visual
C++6.0同大 多数其它的 Windows 应用软件 一样,提供了大量详 细的帮助信息,而 Help菜单便是得到 这些帮助信息的最有 效和最主要的途径。
菜单介绍
Visual
C++ 6.0的菜单栏如图所示,其中包括 File,Edit,View等共九个菜单选择项,通过 它们,你可以轻松地完成编辑程序和资源、 编译、链接及调试程序等各项工作。
菜单使用方法
用鼠标左键直接单击相应的菜单,
在按住Alt键的同时,按下相应菜单的热键,
例如要激活Edit菜单只要按下Alt+E键即可。
Insert菜单中的命令
主要用于项目及资 源的创建和添加。
(五) Project菜单
Project菜单中的命
令主要用于项目的 操作,如项目中添 加源文件等。
(六) Build菜单
Build菜单中的命令
主要用来应用程序 的编译、连接、调 试、运行。
(七) Tools菜单
Tools菜单中的命令
子菜单
当激活某个菜单后,会弹出相应的下拉子菜
单。如果某菜单项的右面有个三角符号,则 停留一会,将会出现相应的子菜单。
(一)File菜单
File菜单包含了各种对文件
进行操作的选项,如加载、 保存、打印和退出等。各 菜单项的功能分述如下: New菜单项(Ctrl+N)此菜 单项的快捷键是Ctrl+N。用 于创建新的文件、工程、 工作区或其他文档。当选 中此菜单项后,屏幕将会 出现New对话框。
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菜单命令详解(文件打开、保存与关闭)

VC菜单命令详解(文件打开、保存与关闭)第一部分:五个命令ID:处理函数ID_FILE_NEW CWinApp::OnFileNewID_FILE_OPEN CWinApp::OnFileOpenID_FILE_SA VE CDocument::OnFileSaveID_FILE_SA VEAS CDocument::OnFileSaveAsID_FILE_CLOSE CDocument::OnFileClose1.ID_FILE_NEWCWinApp::OnFileNew调用CDocManager::OnFileNew。
|CDocManager::OnFileNew判断文档模板是否多于一个,是则显示文档类型对话框(AFX_IDD_NEWTYPEDLG)让用户选择要创建的文档类型。
然后调用CDocTemplate::OpenDocumentFile(NULL)。
|CDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,BOOL bMake_Visible=TRUE)对于SDI和MDI的处理不一样。
对于SDI,1,若已有文档打开,对其重新初始化,调用CDocument::SaveModified()保存当前文档;若没有文档存在,则调用CreateNewDocument()创建文档对象,再调用CreateNewFrame(pDoucment,NULL)创建文档的框架窗口。
2,若lpszPathName为NULL,则调用CDocument::OnNewDocument()处理新文档,用pDocument->SetPathName(lpszPathName)设置文档的路径。
3,判断当前线程主框架窗口是否存在,不存在则将1中创建的新框架作为主框架。
4,调用InitialUpdateFrame显示框架窗口。
对于MDI,与SDI基本相同,但是没有第3步。
|CDocument::OnNewDocument()首先调用DeleteContents()删除原文档内容,使用m_strPathName.Empty()清除当前文档路径,SetModifiedFlag(FALSE)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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_Menu.AppendMenu(MF_POPUP,-1,"植物");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_Menu5.在OnInitDialog方法中调用LoadMenu方法加载菜单资源6.在类视图选项卡中,右击对话框程序节点,然后选择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;};7.1在CMenuIcon的头文件中声明成员变量7.2程序CMenuItem m_ItemLists[50];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;i<m_Count;i++){pMenu->GetMenuString(i,m_ItemLists[m_Index].m_ItemText,MF_BYPOSITION);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;}pMenu->ModifyMenu(i,MF_OWNERDRAW|MF_BYPOSITION|MF_STRING,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, CRectRect, 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)||(m_state&0x0040));DrawItemText(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();。