C++ Button右键弹出式菜单

 

Button右键弹出式菜单

 

关键点

用类来实现 的

 

实现过程

新建1个类  类名CButtonPopMenu 基类CButton

新建1个菜单资源 IDR_MENU1

 

// ButtonPopMenu.h : header file
// Attributes
public:
    CRect m_Rect;  
    CMenu m_Menu;  
    int m_MenuID;
    
// ButtonPopMenu.cpp : implementation file     
void CButtonPopMenu::OnRButtonDown(UINT nFlagsCPoint point
{
    GetWindowRect( &m_Rect);
    point.x += m_Rect.left;
    point.y += m_Rect.top;
    
    VERIFY(m_Menu.LoadMenu(m_MenuID));    
    CMenupPopup = m_Menu.GetSubMenu(0); 
    ASSERT(pPopup != NULL); 
    CWndpWndPopupOwner = this; 
    
    while ( pWndPopupOwner->GetStyle() & WS_CHILD )
    {    
        pWndPopupOwner = pWndPopupOwner->GetParent(); 
        pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTONpoint.xpoint.ypWndPopupOwner);
    }
    m_Menu.Detach(); 
    m_Menu.DestroyMenu(); 
    CButton::OnRButtonDown(nFlagspoint);
}
    
// project02Dlg.h : header file
#include "ButtonPopMenu.h"
CButtonPopMenu    m_btn1
    
// project02Dlg.cpp : implementation file
BOOL CProject02Dlg::OnInitDialog()
    // TODO: Add extra initialization here
    m_btn1.m_MenuID=IDR_MENU1;
         

 

 

011911330711896.png   

图-1

011911341968451.png

图-2


 

备注

此文可以实现任意控件的右键菜单弹出

像一些控件默认所没有的功能都可以通过定义类 然后关联类来实现

 

相关链接

                           

控件上弹出菜单

 




附件列表

 

转载于:https://www.cnblogs.com/xe2011/p/3885702.html

从VC++项目中的菜单资源建立结构相同的自绘弹出式菜单,原理和步骤如下: (1)CMenu::LoadMenu读入菜单资源; (2)CImageList::Create读入工具栏位图; (3)CMenu::CreatePopupMenu和CMenu::AppendMenu拷贝菜单资源,建立弹出式菜单。其中CMenu::AppendMenu第1个参数设置成MF_OWNERDRAW(自绘), 第四个参数设置成一个附加结构的指针,包括菜单项文字和位图索引等信息。通过这个结构,在自绘制时,可以获取对应的菜单项文字和位图位置索引,其中位图保存在第(2)步中的CImageList变量中; (4)在对右鼠标键的响应函数里,使用CMenu::TrackPopupMenu启动显示弹出式菜单; (5)在弹出式菜单的拥有者窗口(CxxxView)里,处理WM_MEASUREITEM消息和WM_DRAWITEM消息,分别调用CMenuEx::MeasureItem和CMenuEx::DrawItem, 分别用来定义菜单项的尺寸,对菜单项进行自绘; (6)在自绘函数CMenuEx::DrawItem里,通过每个菜单项的附加结构lpDIS->itemData,获得其文字和位图索引,然后分别使用CDC::DrawText和CImageList::Draw,画出该菜单项的文字和位图,从而实现自绘制。 程序在VC6下编译通过。 没有处理的地方:如果菜单项状态是checked或者radio,程序没做处理。另外,弹出式菜单的激活/禁止时,不会自动触发其拥有者窗口的ON_UPDATE_COMMAND_UI宏。不过,可以处理owner窗口的WM_INITMEMUPOPUP消息(在弹出式菜单的每个子菜单弹出时,都会发出此消息),为每个子菜单项单独生成一个CCmdUI对象,调用其CCmdUI::DoUpdate函数,来手动触发ON_UPDATE_COMMAND_UI宏中对应的消息处理函数,使得菜单项能够根据应用环境进行激活和禁止。详见博客: http://oliver.zheng.blog.163.com/blog/static/14241159520143210595266/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值