用VC制作带弹出式菜单的按钮
Visual C++工具按钮和菜单项相结合代码

【例Ex_TM】工具按钮和菜单项相结合
①创建一个默认的单文档应用程序Ex_TM。
②在项目工作区窗口中选择ResourceView页面,展开结点,双击资源“Menu”项中的IDR_MAINFRAME,利用菜单编辑器在“编辑”菜单的子菜单最后添加一个水平分隔符和一个“测试(&T)”菜单项(ID_EDIT_TEST)。
双击资源“Toolbar”项中的IDR_MAINFRAME,打开工具栏资源编辑器,为其添加并设计一个按钮,其位置和内容如图12.16所示。
图12.16 设计的工具栏按钮
③双击刚才设计的第一个工具按钮,弹出该工具按钮的属性对话框,将该工具按钮的ID号设为ID_EDIT_TEST,在提示框内键入“工具栏按钮和菜单项命令相结合。
\n测试”。
④编译运行并测试。
当程序运行后,将鼠标移至刚才设计的工具按钮处,这时在状态栏上显示出“工具栏按钮和菜单项命令相结合。
”信息,若稍等片刻后,还会弹出提示小窗口,显示出“测试”字样。
但此时的“测试”按钮和“测试”菜单项都是灰显,暂时无法操作它,
这是因为程序中还没有任何与ID_EDIT_TEST命令相映射的消息处理函数。
⑤用MFC ClassWizard在CMainFrame添加ID_EDIT_TEST 的COMMAND消息映射,保留默认的消息处理函数名,添加下列代码:void CMainFrame::OnEditTest()
{
MessageBox("测试命令已执行!");
}
⑥再次编译运行并测试。
VC按钮控件编程

VC按钮控件编程一按钮控件(Button)二复选框checkbox三单选按钮RadioButton四CButton类的常用函数MFC的CButton类对应着3个控件,按钮控件、复选框控件和单选框控件。
一按钮控件(Button)属性ID设置控件的ID。
Caption设置在控件上显示的字符串visible是否可见group将控件分组。
help id确定控件是否具有帮助IDdisabled是否可用tab stop按tab键是否能够获得焦点default button按钮具有黑色边框。
用户在对话框中按Enter键,如窗口中没有其他命令要处理,该按钮的单击事件将要被执行。
owner draw自定义按钮。
用户需要在OnDrawItem消息处理函数中绘制按钮外观。
Icon、Bitmap用一个图标或位图代替文本Multiline能够在按钮上显示多行文本Notify按钮能够将单击或双击事件通知父窗口,一般按钮按钮能够处理的消息是click 消息,是否选择这个属性后就可以写单击或双击消息了?通过实验好像是否选择都可以执行BN_CLICKED和BN_DOUBLECLICKED消息。
flat按钮不具有3D外观。
client edge使控件边框下凹static edge控件边缘为实边框modal frame控件呈现3D效果transparent控件透明。
控件下方的窗口不会被控件掩盖。
accept files是否接受文件拖动。
用户在对话框中拖动一个文件,控件将收到WM_DROPFILES消息。
Right aligned text文本右对齐Right-to-left reading order文本从右到左显示。
主要用于阿拉伯文等中东地区的语言习惯。
二复选框checkboxAuto是单击时,自动判断和设置是否选中,如果不选择就要通过GetCheck()和SetCheck ()来判断和设置。
left text表示文本在复选框的左边。
vc 弹出菜单跟踪函数

HWnd:拥有快捷菜单的窗口的句柄。此窗口接收来自菜单的所有消息。函数返回前,此窗口不接受来自菜单的WM_COMMAND消息。
如果在参数uFlags里指定了TPM_NONOTIFY值,此函数不向hWnd标识的窗口发消息。 但必须给hWnd里传一个窗口句柄,可以是应用程序里的任一个窗口句柄。
AfxMessageBox(temp);
}
HMENU hmenu = menu.Detach();
menu.DestroyMenu();
delete lpoint;
ቤተ መጻሕፍቲ ባይዱ
TrackPopupMenu
函数功能:该函数在指定位置显示快捷菜单,并跟踪菜单项的选择。快捷菜单可出现在屏幕上的任何位置。
用下列标志位之一来确定在菜单没有父窗口的情况下用户的选择:
TPM_NONOTIFY:若设置此标志,当用户单击菜单项时函数不发送通知消息。
TPM_RETURNCMD;若设置此标志;函数将用户所选菜单项的标识符返回到返回值里。
(补充:当TrackPopupMenu的返回值大于0,就说明用户从弹出菜单中选择了一个菜单。以返回的ID号为参数wParam的值,程序给自己发送了一个WM_SYSCOMMAND消息)
uFlags:一种指定功能选项的位标志。用下列标志位之一来确定函数如何水平放置快捷菜单:
TPM_CENTERALIGN:若设置此标志,函数将按参数x指定的坐标水平居中放置快捷菜单。
TPM_LEFTALIGN:若设置此标志,函数使快捷菜单的左边界与由参数X指定的坐标对齐。
TPM_RIGHTALIGN:若设置此标志,函数使快捷菜单的右边界与由参数X指定的坐标对齐。
用VC6.0编写Word插件(Office2K、XP、03)

用VC6.0编写Wo rd插件(O ffi ce2K、XP、03)作者:hjp hy源代码下载最近因为工作的需要,学习了一下Off ic e插件的编写方法。
在走了不少弯路以后,最后终于把编写插件的原理给搞清楚了,不敢独享,拿出来跟大家共享一下。
下面就以Word 2003为例,向大家简单介绍一下。
第一步,利用向导生成一个AT L COM App Wiz ard的新工程。
图1在向导的第一个对话框中,服务器类型选择Dy na mi c Li nk Li bra ry(DLL),然后单击Fi nish即可。
图2然后,选取菜单Ins ert->N ew AT L Ob je ct项,在弹出的AT L对象向导对话框中选中相应O bj ect s对应右侧的Sim p le Ob j ect 选项,点击下一步。
图3在弹出的对话框中Sho rt Nam e中输入相应名称,点确定完成插入AT L对象。
图4这样一个简单的基于AT L的COM组件工程就建立成功了。
第二步,通过导入类型库来实现_IDT E xt ens ibi l it y2接口。
在C l assVi ew中的新加的类上点鼠标右键,在弹出的右键菜单中选Imp l em ent Int erf ac e项。
图5在弹出的实现接口对话框中点击Ad d T y p elib图6在弹出的Br owse T y p e L ibr ar ies对话框中,选取M ic rosoft Ad d-in D esi gne r(1.0)子项,点OK按钮图7在弹出的接口列表对话框中选中_IDT E xt ens ibi l it y2接口,点OK按钮完成导入这样的话,系统将会自动为你生成空的五个所需接口函数,分别是On Con ne ct ion、OnD isco nn ect i on、O nAddI nsUp dat e、OnSt a rt up Comp let e、On Be gin Shut down。
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++单文档工程点击菜单弹出相应对话框--总结笔记

VC++单文档工程点击菜单弹出相应对话框
1、“资源视图-> Dialog”右键选择“添加资源”,在弹出的对话框中选择“Dialog ->新建”,创建新的对话框;
2、右键点击对话框,选择“属性”,为新的对话框指定一个ID和Caption(此步骤可省略,使用默认值);
3、右键点击对话框,选择“添加类”,为新的对话框添加相应的类,完成后会生成“xxx.h”和“xxx.cpp”两个文件;
4、“资源视图->Menu”,选择要使用的菜单,双击打开,在需要添加菜单的地方点击右键选择“新插入”,插入一个新的菜单以及具体菜单项。
5、右键点击具体菜单项,选择“属性”,为其指定一个ID(此步骤可省略,使用默认值);右键点击具体菜单项,选择“添加事件处理程序”,为其添加事件处理程序,并为其选择一个类,一般选择“CxxxView”。
6、在生成的事件处理函数中,添加以下代码
(1)DoModal
(2)Create、ShowWindow
以上两种方法在每次点击时都会生成新的对话框,不能保留对话框中输入的数据等信息。
(3)在主框架中实现。
cmfcpopupmenu的用法
cmfcpopupmenu的用法cmfcpopupmenu的用法:cmfcpopupmenu是一个用于创建自定义弹出菜单的类,该类是MFC(Microsoft Foundation Class)中的一部分。
它可以让开发者在他们的应用程序中添加自定义的右键菜单。
要使用cmfcpopupmenu类,首先需要在项目中包含afxpopupmenumanager.h头文件,并链接到afxpopupmenumanager.lib库。
然后,可以通过以下步骤来创建一个弹出菜单:1. 创建一个cmfcpopupmenu对象:```cppCMFCPopupMenu menu;```2. 使用cmfcpopupmenu的Create方法创建菜单:```cppmenu.Create(this, x, y, pParentWnd, FALSE);```这里的x和y是菜单的位置,pParentWnd是弹出菜单的父窗口,FALSE表示菜单并不是一个菜单栏。
3. 使用cmfcpopupmenu的AppendMenu或InsertMenu方法添加菜单项:```cppmenu.AppendMenu(MF_STRING, ID_MENUITEM1, _T("Menu Item 1"));menu.AppendMenu(MF_STRING, ID_MENUITEM2, _T("Menu Item 2"));```这里的ID_MENUITEM1和ID_MENUITEM2是菜单项的ID,_T("Menu Item 1")和_T("Menu Item 2")是菜单项的显示文本。
4. 可以使用cmfcpopupmenu的TrackPopupMenu方法显示菜单:```cppmenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, pParentWnd);```这里的TPM_LEFTALIGN表示菜单将左对齐显示,TPM_RIGHTBUTTON表示在鼠标右键按下时显示菜单。
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中透明浮动按键的实现
在VC中透明浮动按键的实现有一种按键,看起来是一幅完整的图片,当鼠标移到按键区域时,图片的一部分凸现,形成一个按键,当鼠标移走时又恢复原来状态。
源码爱好者最近,看了一些关于浮动按键的代码,其原理大致上跟CBitmapButton差不多,用数幅位图代表按键的各个状态,响应鼠标的各种消息来设置按键的状态,实现按键的浮动显示,但是这样的按键却不能和周围的背景混和成一幅图片。
为了实现“透明”按键,可以简单地做个试验:先在对话框中加入一个BUTTON,通过属性框选“Owner Draw”风格,再加入一个PICTURE,并加入图片,将BUTTON移到PICTURE上。
运行结果发现,按键没有显示出来,但在按键区域按下鼠标时,该按键仍然能发出WM_COMMAND消息,这样一个纯透明的按键建立了。
显然,这个按键是毫无使用意义的,因为用户不知道按键的位置,必须让用户容易觉察到按键的位置,可以把这个按键改造一下:(首先从CButton派生出一个新类CDrawButton)·把按键的标题显示出来这个实现起来比较简单,我们可以重载CButton类的成员函数DrawItem(),void CDrawButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){CDC dc;CRect rect=lpDrawItemStruct->rcItem;//得到按键区域CString sCaption;dc.Attach(lpDrawItemStruct- >hDC); //得到设备环境CDCVERIFY(lpDrawItemStruct- >CtlType==ODT_BUTTON);GetWindowText(sCaption);//得到按键的标题dc.SetBkMode(TRANSPARENT);//透明显示CFont* m_pOldFont=dc.SelectObject(m_pFont);dc.DrawText(sCaption,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);dc.SelectObject(m_pOldFont);}其中的m_pFont是成员变量,它保存了对话框的字体指针,为了按键的标题风格与对话框的字体风格一致,在初始化时调用对话框的成员函数GetFont()即可得到指向对话框字体的CFont类指针。
VC动态创建工具栏及工具栏上的按钮及为按钮添加消息响应函数
VC动态创建工具栏及工具栏上的按钮及为按钮添加消息响应函数// OnInitDialog函数中//向列表中添加图标m_imagelist.Create(32,32,ILC_COLOR24|ILC_MASK,1,1);m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON12));m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON13));m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON9));m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON10));//m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON5));// m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON6));UINT arry[10];for(int i=0;i<5;i++){if(i==2) //第四个按钮为分割条;arry[i]=ID_SEPARATOR;elsearry[i]=i+1001;}m_toolbar.Create(this);m_toolbar.SetButtons(arry,5);m_toolbar.SetButtonText(0,"增加"); //图片下面添加文字;m_toolbar.SetButtonText(1,"修改");m_toolbar.SetButtonText(3,"删除");m_toolbar.SetButtonText(4,"关闭");//m_toolbar.SetButtonText(5,"学生管理");// m_toolbar.SetButtonText(6,"远程连接");m_toolbar.GetT oolBarCtrl().SetButtonWidth(20,30);m_toolbar.GetT oolBarCtrl().SetImageList(&m_imagelist);m_toolbar.SetSizes(CSize(50,50),CSize(32,32));//设置大小;RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CO NTROLBAR_LAST,0);//窗口类h头文件中//工具栏上的按钮的ID是连续的,如果不连续,一个按钮一个响应,或者修改为连续的,视情况而定afx_msg void OnBnClickedToolBar(UINT nID);//消息映射部分ON_COMMAND_RANGE(ID_BUTTON_1, ID_BUTTON_N, OnBnClickedToolBar)//工具栏上按钮的消息响应void CXXXDlg::OnBnClickedToolBar(UINT nID){int nIndex = nID - ID_BUTTON_1;CString strText(_T(""));strText.Format(_T("You select index: %d"), nIndex + 1);AfxMessageBox(strText);}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用VC制作带弹出式菜单的按钮vchelp2005-11-23 10:31分享到:我要吐槽带有弹出式菜单的按钮可以使一个按钮具有多项选择功能,扩展了按钮的功能,相当于把多个按钮集成于一体,可以减少按钮数目。
这种按钮的按钮体分为两个区域,单击主体区域时,执行主体按钮的功能,单击选择区域时,弹出一个菜单,可从中选择要执行的功能。
下面,我们看一下它的制作过程:一、新建一个以CButton类为基类的新类单击“Insert”→“New Class”,建立一个新类。
基类设置为CButton,新类起名为CMenuButton。
二、利用自绘方法绘制按钮,主体区显示按钮文本,选择区画一个小箭头在CMenuButton类中用ClassWizard添加函数:PreSubclassWindow()和DrawItem()。
PreSubclassWindow()函数在建立按钮时执行,可用于做一些准备工作。
在这里我给按钮添加自绘属性:void CMenuButton::DrawButton(CDC *pDC){m_LRect.SetRect( m_ButRect.left, m_ButRect.top,m_ButRect.right-21, m_ButRect.bottom ); //按钮主体区尺寸m_RRect.SetRect( m_ButRect.right-20, m_ButRect.top,m_ButRect.right, m_ButRect.bottom ); //按钮选择区尺寸CPen Pen;Pen.CreatePen(PS_SOLID, 1, RGB(192,192,192) );pDC->SelectObject( &Pen );pDC->FillSolidRect( m_ButRect, m_BackColor ); //画背景switch( m_State ) //不同状态画不同边框{case 0: //正常按钮pDC->DrawEdge( &m_LRect, BDR_RAISEDINNER, BF_RECT );pDC->DrawEdge( &m_RRect, BDR_RAISEDINNER, BF_RECT );break;case 1: //鼠标进入时的按钮pDC->DrawEdge( &m_LRect, BDR_RAISEDINNER, BF_RECT );pDC->DrawEdge( &m_RRect, BDR_RAISEDINNER, BF_RECT );pDC->MoveTo( m_ButRect.TopLeft() );pDC->LineTo( m_ButRect.right, m_ButRect.top );break;case 2: //单击按钮主体区时的按钮pDC->DrawEdge( &m_RRect, BDR_RAISEDINNER, BF_RECT );break;case 3: //单击按钮选择区时的按钮pDC->DrawEdge( &m_LRect, BDR_RAISEDINNER, BF_RECT );break;}POINT m_pt[3], m_ptCentre; //箭头坐标(三个顶点)m_ptCentre = m_RRect.CenterPoint(); //选择区中点位置m_pt[0].x = m_ptCentre.x-3; //计算箭头坐标m_pt[0].y = m_ptCentre.y-2;m_pt[1].x = m_ptCentre.x+4;m_pt[1].y = m_ptCentre.y-2;m_pt[2].x = m_ptCentre.x;m_pt[2].y = m_ptCentre.y+2;pDC->SelectStockObject( BLACK_BRUSH ); //定义画刷(黑色)CRgn rgn;rgn.CreatePolygonRgn( m_pt, 3, ALTERNATE );pDC->PaintRgn( &rgn ); //画选择区箭头pDC->SetTextColor( m_ForeColor ); //画主体区文字pDC->SetBkMode( TRANSPARENT );pDC->DrawText( m_strText, &m_LRect, DT_SINGLELINE | DT_CENTER | DT_VCENTER |DT_END_ELLIPSIS);}m_State是个标志,其值为0表示正常按钮;1表示鼠标进入按钮,绘制暗线边框;2表示在按钮主体区按下鼠标左键;3表示在按钮选择区按下鼠标左键。
在m_State的不同取值下,绘制不同的按钮边框,可以增加按钮的动态效果。
三、添加鼠标响应函数在CMenuButton类中用ClassWizard添加函数:OnMouseMove()、OnLButtonDown()、OnLButtonUp()。
OnMouseMove()函数用于响应鼠标移动消息,当鼠标进入按钮时,设置相应标志,并重绘按钮边框,当鼠标离开按钮时,清除标志,恢复原边框。
m_Menu.DestroyMenu();b_ClickFlag = false;}Invalidate(); //重绘按钮}else{if ( !m_ButRect.PtInRect(point) ) //鼠标离开按钮{b_InFlag = false; //清除进入标志ReleaseCapture(); //释放鼠标捕获b_ClickBut = false; //清除单击标志m_State = 0; //置按钮状态(0-正常按钮)if( b_ClickFlag ) //检测单击选择区标志{m_Menu.Detach(); //清除打开的菜单m_Menu.DestroyMenu();b_ClickFlag = false;}Invalidate(); //重绘按钮}}CButton::OnMouseMove(nFlags, point);}b_InFlag是个BOOL型量,鼠标进入时设置,离开时清除,目的是防止鼠标在按钮上移动时重复刷新按钮,以避免闪烁。
b_ClickFlag是单击按钮选择区标志,当它为true时,表示弹出菜单已打开,为false 时表示菜单未弹出。
当菜单已经弹出,而鼠标又移回按钮单击时,应清除菜单。
b_ClickBut是单击按钮主体区标志。
OnLButtonDown()函数响应按钮单击消息,当单击的是按钮主体区时,设置b_ClickBut 标志;当单击的是按钮选择区时,要根据单击次数,决定是否弹出菜单。
b_ClickBut = true; //设置单击按钮标志Invalidate(); //重绘按钮}else if( m_RRect.PtInRect(point) && m_MenuID ) //单击选择区{m_State = 3;b_ClickBut = false; //清除单击按钮标志Invalidate(); //重绘按钮b_ClickFlag = !b_ClickFlag; //单击选择区标志if( b_ClickFlag ) //一次单击,弹出菜单{CRect rect = m_RRect;ClientToScreen(rect); //转换为屏幕坐标point = rect.BottomRight();point.x -= rect.Width(); //设置弹出菜单的位置VERIFY(m_Menu.LoadMenu(m_MenuID)); //装入菜单资源CMenu* pPopup = m_Menu.GetSubMenu(0);ASSERT(pPopup != NULL);CWnd* pWndPopupOwner = this;while (pWndPopupOwner->GetStyle() & WS_CHILD)pWndPopupOwner = pWndPopupOwner->GetParent();pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, point.x, point.y, pWndPopupOwner); //弹出菜单}else //再次单击,清除菜单{m_Menu.Detach();m_Menu.DestroyMenu();}}CButton::OnLButtonDown(nFlags, point);}当单击按钮选择区时,在选择区的左下角弹出菜单,函数中的point是鼠标的屏幕坐标,求菜单位置时也使用屏幕坐标。
m_MenuID是与按钮关联的弹出菜单的ID,它在创建按钮时进行设置。
OnLButtonUp()函数响应按钮弹起消息,这是只要恢复按钮正常状态即可,以产生单击动画效果。
//设置关联菜单IDvoid CMenuButton::SetMenuID(int nID){m_MenuID = nID;}//设置按钮文本void CMenuButton::SetText(CString str){m_strText = str;}//设置文本颜色void CMenuButton::SetForeColor(COLORREF color){m_ForeColor = color;Invalidate();}//设置背景颜色void CMenuButton::SetBkColor(COLORREF color){m_BackColor = color;Invalidate();}//是否单击主按钮区BOOL CMenuButton::isClick(){return b_ClickBut;这样,带菜单的按钮类就做好了,用它定义的按钮实例可以连接一个弹出式按钮,下面我们就看看怎样定义按钮实例。
六、生成按钮实例1、在对话框中放置按钮,把它的大小调整合适;2、用ClassWizard为按钮添加变量,把变量的类型设置为CMenuButton;3、定义按钮的关联菜单关联菜单就是普通的弹出式菜单,用VC的菜单编辑器生成即可。
进入资源的“Menu”项,插入一个新的菜单,根据需要添加菜单项。
4、设置按钮在对话框的OnInitial()函数中初始化按钮:按钮变量.SetMenuID( 菜单ID );按钮变量.SetText( 按钮文本);按钮变量.SetBkColor( 按钮背景色);七、按钮的响应对按钮的响应包括单击按钮主体区的响应和单击菜单项的响应两部分。