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();。
VC对话框的工具栏添加图标

m_toolbar.SetSizes(CSize(105,60),CSize(28,40));//设置按钮大小
m_toolbar.EnableToolTips(TRUE);//激活提示信息
::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,
SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
return TRUE;
}
return FALSE;
}
5.在字串表中创建相应ID的字串;
ScreenToClient(rcChild);
rcChild.OffsetRect(ptOffset);
pwndChild->MoveWindow(rcChild,FALSE);
pwndChild=pwndChild->GetNextWindow();
}
//调整对话框尺寸
CRect rcWindow;
GetWindowRect(rcWindow);
rcWindow.right+=rect.Width()-rectNow.Width();
rcWindow.bottom+=rect.Height()-rectNow.Height();
MoveWindow(rcWindow, FALSE);
//控件条定位
// if there is a top level routing frame then let it handle the message
VC中对话框使用技巧集合

注:以下代码以一个名为CTest6Dlg的对话框类为例--------------------------------------------------------------------------------1. 在任务栏隐藏对话框ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);--------------------------------------------------------------------------------2. 使对话框为顶层窗口SetWindowPos(&this->wndTopMost, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);--------------------------------------------------------------------------------3. 在运行时添加最大化,最小化按钮SetWindowLong(this->m_hWnd, GWL_ST YLE,GetWindowLong(this->m_hWnd, GWL_ST YLE) |WS_MINIM IZEBOX | WS_MAXIMIZEBOX);UpdateWindow();--------------------------------------------------------------------------------4. 使能对话框右上角关闭按钮在OnInitDialog中方法一:CMenu* menu = GetSystemMenu(FALSE);menu->Modify M enu(SC_CLOSE, MF_BYCOMMAND | M F_GRAYED );方法二:CMenu* menu = GetSystemMenu(FALSE);menu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);--------------------------------------------------------------------------------5. 当对话框一部分在屏幕外时,显示全部对话框SendMessage(DM_REPOSITION);--------------------------------------------------------------------------------6. 改变鼠标外形添加WM_SETCURSOR 消息映射函数BOOL CTest6Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) {SetCursor(AfxGetApp()->LoadStandardCursor(IDC_HELP));return 0;}--------------------------------------------------------------------------------7. 改变对话框背景色和文本颜色在CTest6App的InitInstance中添加SetDialogBkColor(RGB(255,0,0), RGB(0,255,0));--------------------------------------------------------------------------------8. 改变对话框caption上的图标导入自己的图标资源到工程中,把原来ID为IDR_MAINFRAME 的资源删除,把新的图标的ID命名为IDR_MAINFRAME --------------------------------------------------------------------------------9. 在主对话框显示前,显示一个login对话框BOOL CTest6App::InitInstance(){//...int nResponse;CLoginDlg loginDlg;nResponse = loginDlg.DoModal();if (nResponse == IDOK){}if (nResponse == IDCANCEL){return FALSE;}CTest6Dlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse == IDOK ){}else if (nResponse == IDCANCEL){}return FALSE;}然后重载CLoginDlg对话框的哦OnOK(),在其中判断条件void CLoginDlg::OnOK(){if (条件满足)CDialog::OnOK();elseAfxMessageBox(_T("invalid password!"));}--------------------------------------------------------------------------------10. 在对话框中添加工具栏方法一:添加以下代码到OnInitDialog 中if ( !m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1) ){TRACE0("Failed to Create Dialog Toolbar\n");EndDialog(IDCANCEL);}CRect rcClientOld; // 久客户区RECTCRect rcClientNew; // 加入TOOLBAR后的CLIENT RECTGetClientRect(rcClientOld); //// Called to reposition and resize control bars in the client area of a window// The reposQuery FLAG does not really traw the Toolbar. It only does the calculations.// And puts the new ClientRect v alues in rcClientNew so we can do the rest of the Math.//重新计算RECT大小RepositionBars(AFX_IDW_CONT ROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rcClientNew);// All of the Child Windows (Controls) now need to be moved so the Tollbar does not cov er them up. //所有的子窗口将被移动,以免被TOOLBAR覆盖// Offest to move all child controls after adding Tollbar//计算移动的距离CPoint ptOffset(rcClientNew.left-rcClientOld.left,rcClientNew.top-rcClientOld.top);CRect rcChild;CWnd* pwndChild = GetWindow(GW_CHILD); //得到子窗口while(pwndChild) // 处理所有子窗口{//移动所有子窗口pwndChild->GetWindowRect(rcChild);ScreenToClient(rcChild);rcChild.OffsetRect(ptOffset);pwndChild->MoveWindow(rcChild,FALSE);pwndChild = pwndChild->GetNextWindow();}CRect rcWindow;GetWindow Rect(rcWindow); // 得到对话框RECTrcWindow.right += rcClientOld.Width() - rcClientNew.Width(); // 修改对话框尺寸rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height();Mov eWindow(rcWindow,FALSE); // Redraw WindowRepositionBars(AFX_IDW_CONT ROLBAR_FIRST,AFX_IDW_CONT ROLBAR_LAST,0);方法二:/dialog/dlgtoolstatusbar.asp--------------------------------------------------------------------------------11.响应对话框的最大化、最小化、关闭、恢复事件方法一:添加WM_SYSCOMMAND 消息映射函数v oid CTest6Dlg::OnSysCommand(UINT nID, LPARAM lParam) {if ( (nID & 0xFFF0) == IDM_ABOUTBOX ){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{if ( nID == SC_MAXIMIZE ){AfxMessageBox(_T("最大化"));}else if ( nID == SC_MINIMIZE ){AfxMessageBox(_T("最小化"));}else if ( nID == SC_CLOSE ){AfxMessageBox(_T("关闭"));}CDialog::OnSysCommand(nID, lParam);}方法二:添加WM_SIZE 消息映射函数v oid CTest6Dlg::OnSize(UINT nT y pe, int cx, int cy){CDialog::OnSize(nT y pe, cx, cy);if ( nT y pe == SIZE_MAXIM IZED ){AfxMessageBox(_T("最大化"));}else if ( nT ype == SIZE_MINIMIZED ){AfxMessageBox(_T("最小化"));}else if ( nT ype == SIZE_RESTORED ){AfxMessageBox(_T("恢复"));}}--------------------------------------------------------------------------------12.代码实现窗口最小化,最大化,关闭PostMessage(WM_SYSCOMMAND, SC_MINIMIZE);PostMessage(WM_SYSCOMMAND, SC_MAXIMIZE);PostMessage(WM_SYSCOMMAND, SC_CLOSE);--------------------------------------------------------------------------------13.按下ESC和ENTER键时禁止关闭对话框方法一:(1) 重载OnCancel和OnOk,屏蔽其中的CDialog::OnCancel()和CDialog::OnOk();(2) 添加以下代码v oid CTest6Dlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout; //if you have an about dialogdlgAbout.DoModal();}else if ((nID & 0xFFF0) == SC_CLOSE){//用户点击右上角"X"EndDialog(IDOK);}else{CDialog::OnSysCommand(nID, lParam);}}方法二:BOOL CTest6Dlg::PreTranslateMessage(MSG* pM sg){if ( pMsg->message == WM_KEYDOWN ){switch(pMsg->wParam){case VK_ESCAPE:return T RUE; //直接返回TRUEbreak;case VK_RET URN:return T RUE;break;}}return CDialog::PreTranslateMessage(pM sg);}方法三:Q122489:How to Disable Default Pushbutton Handling for MFC Dialog/kb/122489/en-us--------------------------------------------------------------------------------14.在对话框中处理键盘鼠标消息处理PreTranslateMessage消息以下代码示例只演示了键盘WM_KEYDOWN消息,你也可以处理鼠标消息,比如WM_LBUTTONDOWN,WM_LBUTTONUP,WM_RBUTTONDOWN等。
vc++菜单全集

在系统菜单中添加菜单项(一)本文介绍如何向系统菜单中添加自己的菜单项,如下:1.创建一个基于对话框的工程:AddMenuToSysMenu。
2.在对话框类中添加一个成员函数:CMenu* m_pMenu;用来添加自己的菜单项。
3.在resouce.h中定义#define IDI_PECULIARMENU1201来代表自己要添加的菜单项资源。
4.在OnInitDialog中添加如下代码:m_pMenu = GetSystemMenu(FALSE);m_pMenu->AppendMenu(MF_STRING,IDI_PECULIARMENU,"系统菜单");5.在OnSysCommand中添加如下代码相应自己的消息。
elseif(nID == IDI_PECULIARMENU){MessageBox("系统菜单"," 提示",MB_OK|MB_ICONINFORMATION);}注:1.改变标题栏菜单图标如下:m_hIcon = AfxGetApp()->LoadIcon(IDI_MAINMENU);2.用位图填充对话框如下:在OnPaint中添加如下代码:CDC *pDC = this->GetDC();CDC m_Menu;m_Menu.CreateCompatibleDC(pDC);CBitmap m_bitmap;m_bitmap.LoadBitmap(IDB_MAIN);m_Menu.SelectObject(&m_bitmap);CRect m_rect;pDC->BitBlt(0,0,800,700,&m_Menu,0,0,SRCCOPY);m_bitmap.DeleteObject();pDC->DeleteDC();带图标的程序菜单(二)本文介绍在基于单文档程序中,如何实现带图标的程序菜单。
给对话框添加菜单工具栏状态栏简易方法

给对话框添加菜单工具栏状态栏简易方法给对话框添加菜单工具栏状态栏简易方法DLGCBR32 示例:演示如何向对话框添加状态栏和工具栏给对话框添加菜单工具栏状态栏简易方法收藏VC++6.0MFC中为对话框添加工具栏VC++6.0 VS2008给图标工具栏添加响应函数VC++6.0 VS2008给图标工具栏添加响应函数1、在对话框的:OnInitDialog()函数中添加以下红色代码:BOOL CGSM_MessageDlg::OnInitDialog(){CDialog::OnInitDialog();// 设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE); // 设置大图标SetIcon(m_hIcon, FALSE); // 设置小图标// TODO: 在此添加额外的初始化代码//创建图像列表m_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,1);//向图像列表中添加图标m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONBOOK));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONNOTE));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONSEND));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONRECV));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONSET));m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONUSER));UINT array[8];for(int i=0;i<8;i++){if(i==2 || i==5)array[i] = ID_SEPARATOR; //第、个按钮为分隔条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)); //设置按钮和图标的大小m_T oolBar.SetButtonText(0,L"电话簿管理");m_T oolBar.SetButtonText(1,L"常用语管理");m_T oolBar.SetButtonText(3,L"短信息发送");m_T oolBar.SetButtonText(4,L"短信息接收");m_T oolBar.SetButtonText(6,L"短信猫设置");m_T oolBar.SetButtonText(7,L"操作员管理");RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CO NTROLBAR_LAST,0);return TRUE; // 除非将焦点设置到控件,否则返回TRUE}2、从代码中的“array[i] = i+1001; //为工具栏按钮设置索引”可以看出,工具栏图标的地址是1001开始的。
VC++添加菜单并读写ini文件数据

VC++添加菜单并读写ini文件数据1、打开VC++6.0,选择新建。
2、选择“工程”,选择“MFC AppWizard(exe)”,选择工程所建立的位置,并输入工程名。
单击“确定”。
3、在弹出的对话框中选择“基本对话框(D)”,点击“下一步”。
4、在弹出的想到对话框中取消“‘关于’对话框”(可省略该步)。
点击“完成”。
5、在弹出的对话框中直接点击“确定”。
6、在“ResourceView”标签下,在“Testresources”上单击右键,再弹出菜单中选择“插入”。
7、在弹出对话框中选择“Menu”,并点击“新建”。
8、弹出下面的对话框,选择“Menu”,并选中所要编辑的菜单,这里是“IDR_MENU”,在右边的编辑区编辑菜单。
9、双击菜单区中白色方框,弹出“菜单项目属性”对话框,在“标明”框中输入要显示的菜单项。
这里随便输入一个,说明操作方法和效果。
我们输入“文件(&W)”,括号内表示快捷键。
10、在“文件”菜单出现之后,其下面会再有一个白色框的空白区域,表示下拉菜单。
双击,出现“菜单项目属性”对话框,输入“ID”(必须)和“标明”,我们在“标明”中输入“操作ini\t(Ctrl+A)”,“操作ini”表示要显示的菜单项,“(Ctrl+A)”表示快捷键,“\t”会将所有下拉菜单的快捷键自动对齐。
11、还可以选择“分隔符”,在前面的小方框内打勾,会出现一个分隔符。
12、按照上述方法设计好菜单。
13、将所设计的菜单加入对话框。
在“TestDlg.cpp”的OnInitDialog函数中中加入下面代码:CMenu m_menu;m_menu.LoadMenu(IDR_MENU1);SetMenu(&m_menu);如下图所示:14、运行程序,看是否有误,如果无误,会出现下图所以的结果。
15、在“ResourceView”标签下,在“Dialog”上单击右键,再弹出菜单中选择“插入Dialog”。
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对话框添加右键菜单

VC对话框添加右键菜单VC对话框添加右键菜单(2008-12-21 10:15:24)标签:it 分类:VC++学习实例及资料VC对话框添加右键菜单2006-12-05 22:34一.在资源创建对话框中选择Menu项并单击New按钮自动创建ID为IDR_MENU1的菜单,为该菜单添加一个菜单项File,并在File 菜单项下添加Cut,Copy和Paste三个菜单(为这三个菜单添加消息响应代码)如:void CExampleDlg::OnCut(){AfxMessageBox("Cut"); //弹出对话框}void CExampleDlg::OnCopy(){AfxMessageBox("Copy"); //弹出对话框}void CExampleDlg::OnPaste(){AfxMessageBox("Paste"); //弹出对话框}二.当在窗口内右击时,窗口将接收到WM_CONTEXTMENU消息,在该消息的处理函数中装载右键菜单,并调用CMenu::TrackPopupMenu函数便可显示右键菜单,添加对话框WM_CONTEXTMENU消息处理函数的响应代码如下:void CExampleDlg::OnContextMenu(CWnd* pWnd, CPoint point){CMenu menu;menu.LoadMenu(IDR_MENU1); //读取资源menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN| TPM_LEFTBUTTON|TPM_RIGHTBUTTON, point.x, point.y, this) //弹出自定义右键菜单}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<在mousemove中使用if(rect.PtInRect(point))MessageBox("hi");不起作用,即使鼠标落入有效区域。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)字体 -----------------------------------------------------------------------------源代码
char szBuffer[1024] = ""; RtlZeroMemory(&stCC, sizeof(stCC)); stCC.lStructSize = sizeof(stCC); stCC.hwndOwner = NULL; stCC.rgbResult = dwBackColor; stCC.Flags = CC_RGBINIT|CC_FULLOPEN; stCC.lpCustColors = dwCustColors; if (ChooseColor(&stCC)) {
ቤተ መጻሕፍቲ ባይዱif (GetOpenFileName(&stOF) != NULL)
{
MessageBox(szFileName, "执行结果", MB_OK);
}
------------------------------------------------------------------------------
此时就可以了. 方法二: 不用方法一,直接添加代码完成上述功能. 添加代码到 DialogDlg ::OnInitDialog 中 CMenu *menu = new CMenu; menu ->LoadMenu(MAKEINTRESOURCE(IDR_MENU)); //IDR_MENU 菜单 ID this ->SetMenu(menu); 或者 Cmenu m_menu; m_menu.LoadMenu(IDR_MENU); SetMenu(&m_menu); 此时结果如下图
CHOOSEFONT stCF; char szBuffer[1024] = ""; LOGFONT stLogFont = {5}; COLORREF dwFontColor = RGB(0, 0, 0); RtlZeroMemory(&stCF, sizeof(stCF)); stCF.lStructSize = sizeof(stCF); stCF.hwndOwner = NULL; stCF.lpLogFont = &stLogFont; stCF.rgbColors = dwFontColor; stCF.Flags = CF_SCREENFONTS|CF_INITTOLOGFONTSTRUCT|CF_EFFECTS; if (ChooseFont(&stCF) != NULL) {
源程序:
char szFileName[MAX_PATH] = "";
OPENFILENAME stOF;
//必须的
RtlZeroMemory(&stOF,sizeof(stOF));//必须的
stOF.lStructSize = sizeof(stOF); //必须的
stOF.hwndOwner = NULL;
(2)文件另存为
------------------------------------------------------------------------------
源代码: OPENFILENAME stOF;
char szFileName[MAX_PATH] = ""; memset(&stOF, 0, sizeof(OPENFILENAME)); stOF.lStructSize = sizeof(stOF); stOF.hwndOwner = NULL; stOF.lpstrFilter = "Text Files(*.txt)\0 *.txt\0 All Files"; stOF.lpstrFile = szFileName; stOF.nMaxFile = MAX_PATH; stOF.Flags = OFN_PATHMUSTEXIST; stOF.lpstrDefExt = "txt"; stOF.lpstrTitle = "请输入保存的文件名"; if (GetSaveFileName(&stOF) != NULL) {
VC++对话框程序中添加菜单 在 VC 中创建一个基于对话框的 MFC 程序,要在其中添加菜单总共分三步:
1、首先插入一个菜单资源 IDR_MENU1,然后可以编辑修改菜单;
2、 然后在为对话框添加一个 CMenu 类型的成员变量 m_Menu;
3、在 OnInitDialog()中添加如下的代码:
stOF.lpstrFilter = "Text Files(*.txt)\0 *.txt\0 All Files";
stOF.lpstrFile = szFileName;
stOF.nMaxFile = MAX_PATH;
stOF.Flags = OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;
OFN_PATHMUSTEXIST -输入文件名时,路径必须存在
OFN_READONLY -对话框中的“以只读方式打开”复选框初始化的时候处于选中状态
------------------------------------------------------------------------------
m_Menu.LoadMenu(IDR_MENU1);//载入菜单
SetMenu(&m_Menu);
//显示菜单
经过这三步以后菜单就可以显示出来了。
MFC 对话框工程中添加菜单(VC++ 6.0 编译器)
MFC 对话框工程中添加菜单(VC++ 6.0 编译器) 第一步:创建对话框资源和菜单资源. 第二步:添加菜单到对话框中 方法一: 在创建的对话框中右键,在 Menu 选项选择自己的菜单 ID 如下图
最后在添加菜单到对话框类中,实现其各种功能. 下面是在上面的基础上实现的通用对话框空间的功能代码,方便以后开发使用. (1)打开文件对话框 条件: OPENFILENAME 结构体初始化
GetOpenFileName 函数调用
GetOpenFileName()通过 OPENFILENAME 这个结构体的大小来确定 windows 的版本的,初始化 这个结构体的大小是必须的. OPENFILENAME stOF 结构体必须清零.
dwBackColor = stCC.rgbResult; wsprintf(szBuffer, "您选择的颜色值:%08x", dwBackColor); MessageBox(szBuffer,"执行结果", MB_OK); }
MessageBox(szFileName, "执行结果", MB_OK); } -----------------------------------------------------------------------------(3)页面设置对话框 -----------------------------------------------------------------------------源代码 PAGESETUPDLG stPS; char szBuffer[1024] = ""; RtlZeroMemory(&stPS, sizeof(stPS)); stPS.lStructSize = sizeof(PAGESETUPDLG); stPS.hwndOwner = NULL; if (PageSetupDlg(&stPS) && stPS.hDevMode) {
OFN_CREATEPROMPT -如果输入不存在的文件名,对话框提问“是否建立文件”
OFN_FILEMUSTEXIST -只能选择一个已经存在的文件名,必须使用 OFN_PATHMUSTEXIST