孙鑫VC++深入详解:Lesson6 Part3 ---创建右键弹出菜单 TrackPopupMenu

VC鼠标右键弹出菜单的实现 1添加Menu资源,在里面设好内容2添加鼠标右键点击消息具体实现:void DIALOG1::OnRclickTree1(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here LPPOINT lpoint=new tagPOINT;      ::GetCu 阅读详情


1

 -----增加右键弹出菜单方法一: 
    Project-->Add to Project-->Components and Controls -->Visual C++ Components
   -->Pop-up menu 注意要加到View类中,不要加到Frame类中,因为Frmae被View覆盖,收不到鼠标消息.

2

 -----增加右键弹出菜单方法二: 模仿一,在鼠标右键响应函数中加载自己创建的资源menu,用TrackPopupMenu弹出菜单


3  消息响应顺序: 对"显示"添加消息响应函数,在CMenuView和CMainFrame类中都添加

void CMenuView::OnMenuitemShow() 
{
// TODO: Add your command handler code here
MessageBox("CMenuView::OnMenuitemShow()");
}

void CMainFrame::OnMenuitemShow() 
{
// TODO: Add your command handler code here
MessageBox("CMainFrame::OnMenuitemShow()");
}

      

// pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,this);
//最后一个参数用 this --- 就是把菜单的拥有者指定为CMenuView,那就只能是CMenuView可以响应菜单项的COMMAND消息
   
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,GetParent());
//最后一个参数用 GetParent()---拥有者为框架,那么框架CMainFrame就可以响应菜单的COMMAND消息
    // 但是前提是CMenuView中没有设计该菜单项COMMAND消息,才会轮到CMainFrame响应
    // 这就是 消息响应顺序: 所有的子类中都没有设计响应函数,才会轮到父类.

    

//---  不知道为什么给"显示"添加了COMMAND响应后,"退出"变灰色了....

//---


//---

//---


// MenuView.cpp : implementation of the CMenuView class
//

#include "stdafx.h"
#include "Menu.h"

#include "MenuDoc.h"
#include "MenuView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMenuView

IMPLEMENT_DYNCREATE(CMenuView, CView)

BEGIN_MESSAGE_MAP(CMenuView, CView)
	ON_WM_CONTEXTMENU()
	//{{AFX_MSG_MAP(CMenuView)
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_MENUITEM_SHOW, OnMenuitemShow)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMenuView construction/destruction

CMenuView::CMenuView()
{
	// TODO: add construction code here

}

CMenuView::~CMenuView()
{
}

BOOL CMenuView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMenuView drawing

void CMenuView::OnDraw(CDC* pDC)
{
	CMenuDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CMenuView printing

BOOL CMenuView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMenuView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMenuView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMenuView diagnostics

#ifdef _DEBUG
void CMenuView::AssertValid() const
{
	CView::AssertValid();
}

void CMenuView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMenuDoc* CMenuView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMenuDoc)));
	return (CMenuDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMenuView message handlers

//DEL void CMenuView::OnTest() 
//DEL {
//DEL 	// TODO: Add your command handler code here
//DEL 		MessageBox("MenuView clicked");
//DEL }



//DEL void CMenuView::OnUpdateEditCut(CCmdUI* pCmdUI) 
//DEL {
//DEL 	// TODO: Add your command update UI handler code here
//DEL 	// pCmdUI->Enable();	
//DEL }

// -----增加右键弹出菜单方法一: 
//      Project-->Add to Project-->Components and Controls -->Visual C++ Components
 //     -->Pop-up menu 注意要加到View类中,不要加到Frame类中,因为Frmae被View覆盖,收不到鼠标消息.

#include "resource.h"
void CMenuView::OnContextMenu(CWnd*, CPoint point)
{

	// CG: This block was added by the Pop-up Menu component
	{
		if (point.x == -1 && point.y == -1){
			//keystroke invocation
			CRect rect;
			GetClientRect(rect);
			ClientToScreen(rect);

			point = rect.TopLeft();
			point.Offset(5, 5);
		}

		CMenu menu;
		VERIFY(menu.LoadMenu(CG_IDR_POPUP_MENU_VIEW));

		CMenu* pPopup = menu.GetSubMenu(0);
		ASSERT(pPopup != NULL);
		CWnd* pWndPopupOwner = this;

		while (pWndPopupOwner->GetStyle() & WS_CHILD)
			pWndPopupOwner = pWndPopupOwner->GetParent();

		pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
			pWndPopupOwner);
	}
}

// -----增加右键弹出菜单方法二: 模仿一,在鼠标右键响应函数中加载自己创建的资源menu,用TrackPopupMenu弹出菜单

void CMenuView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

    // 仿照上面的void CMenuView::OnContextMenu(CWnd*, CPoint point)编写

	CMenu menu;
	menu.LoadMenu(IDR_MENU1);
	CMenu *pPopup = menu.GetSubMenu(0);//获取右键弹出菜单的子菜单,只有一个子菜单,必须是0
	ClientToScreen(&point); //把客户区坐标转换为屏幕坐标

//	pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,this);
		 //最后一个参数用 this --- 就是把菜单的拥有者指定为CMenuView,那就只能是CMenuView可以响应菜单项的COMMAND消息
   
	pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,GetParent());
		 //最后一个参数用 GetParent()---拥有者为框架,那么框架CMainFrame就可以响应菜单的COMMAND消息
	     // 但是前提是CMenuView中没有设计该菜单项COMMAND消息,才会轮到CMainFrame响应
	     // 这就是 消息响应顺序: 所有的子类中都没有设计响应函数,才会轮到父类.
	
	CView::OnRButtonDown(nFlags, point);
}

// 除非把这个函数删除,否则CMainFrame中的void CMainFrame::OnMenuitemShow() 是没有机会响应的.
void CMenuView::OnMenuitemShow() 
{
	// TODO: Add your command handler code here
	 MessageBox("CMenuView::OnMenuitemShow()");	
}




如何使用TrackPopupMenu创建菜单 我在使用clistctrl时,右击其元素希望弹出一个菜单,具有“定位、复制、删除、重命名、属性”功能。 首先处理弹出菜单,对clistctrl建立右击消息:ON_NOTIFY(NM_RCLICK, IDC_LIST, OnRclickList) 函数如下: void CFinderDemoDlg::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult)  阅读详情

相关推荐

MFC控件积累——CContextMenuManager控件

1.使用VS2010或VS2008SP1提供的CMFCxxxx框架时,弹出菜单的调用发生了变化,但与之前使用CMenu产生弹出菜单相同的是都是响应窗口的WM_CONTEXTMENU消息中进行。 2.使用CContextMenuManager产生的弹出菜单比CMenu产生的弹出菜单漂亮。 3.不要继承或者手动实例化CContexMenuManager类,通过CWinAppEx::GetConte

菜鸟天路 3000

TrackPopupMenu( ) 函数详解

TrackPopupMenu( ) 函数详解

懒人一个 586

VC在列表控件中添加右键弹出菜单PopManu实例源代码

摘要:VC/C++源码,界面编程,右键菜单,弹出菜单,列表控件  VC++实现在列表控件中添加右键弹出菜单PopManu实例源代码,测试时请把PopManu.exe拷贝至根目录下,以保证Access数据库连接正确,否则实例不能运行。   本例源码主要演示了如何在VC++的列表控件中添加右键弹出菜单的功能,以增强列表的功能,比如数据排序、数据筛选等功能,部分代码注释:   SetIcon(m_hIcon, TRUE); // 设置大图标   SetIcon(m_hIcon, FALSE); //设置小图标   m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LV

孙鑫VC++讲座笔记-(6)菜单编程

1,弹出菜单(Pop-up)是不能用来作命令响应的。2,MFC中菜单项消息如果利用ClassWizard来对菜单项消息分别在上述四个类中进行响应,则菜单消息传递顺序:View类--Doc类--CMainFrame类--App类。菜单消息一旦在其中一个类中响应则不再在其它类中查找响应函数。具体:当点击一个菜单项的时候,最先接受到菜单项消息的是CMainFrame框架类,CMainFrame框架类将会

hbyufan的专栏 8712

VC++实现生成右键菜单及添加图标

VC++实现弹出菜单比较简单,这里介绍其中的一种来实现一个鼠标右键弹出菜单,效果如下图所示:     步骤: 一、新建一个基于对话框的MFC应用程序-----PopMenu 二、添加一个菜单资源------IDR_MENU1,并加几个子项,如下   三、添加一个Bitmap资源------IDB_BITMAP1(可以自己绘制图标,也可以导入图标)       完成后项目的资源视图...

qq_24127015的博客 1828

CMenu::TrackPopupMenu

 BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd,LPCRECT lpRect = NULL );返回值:如果成功,则返回非零值,否则为0。参数: nFlags 指定屏幕位置标志或鼠标键标志。屏幕位置标志可以为下列值之一: · TPM_CENTERALIGN 使弹出菜单在水平方向相对于

lanpishu1984的专栏 1906

VC++界面编程总结

 一、改变视图背景色:    在CView的OnDraw函数中添写如下一段程序代码:    void CFileNameView::OnDraw(CDC* pDC)    {CFileNameDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CRect rectClient;CBrush brushBkColor;GetClientRect(rectClie

尹成的技术博客 3万+

VC 右键弹出菜单

1   新建菜单资源     2  为窗口类 或视图类添加 鼠标右键处理器   3 编写处理器代码      void CPopMenuDlg::OnContextMenu(CWnd* pWnd, CPoint point) { //加载菜单资源 CMenu menu; menu.LoadMenu(IDR_POPMENU); //获取子菜单 CMenu* p

。。。专栏 819

VC中为clistctrl右键弹出菜单

<br />一、在资源编辑器中建立一个菜单资源 <br />  新建一个菜单资源,比如把菜单的ID号为IDC_POPMENU。此菜单有一项两层,即有一个可弹出的菜单项,而此菜单项的弹出内容即为将要建立的弹出式菜单的内容。至于每一个菜单项的消息映射,和一般的菜单相同。 <br />      例如:新建弹出菜单IDR_POPMENU<br />      PopMenu-> Item1<br />                       -> Item2<br />                    

oldmtn的专栏 4329

TrackPopupMenu函数参数

TrackPopupMenu的输入坐标是屏幕坐标。所以,首先,在使用TrackPopupMenu函数之前,不要忘记利用 void ClientToScreen(    LPPOINT lpPoint ) const; 函数把窗口坐标转换为屏幕坐标。 TrackPopupMenu函数    原型:BOOL TrackPopupMenu( UINT nFlags,int x,i

u012750259的专栏 3821

解决TrackPopupMenu显示菜单不全的问题

经常使用菜单,但是如果直接加载菜单资源,调用TrackPopupMenu时 就会出现菜单显示不全的问题, 基本上解决方法就是先GetSubMenu,再TrackPopupMenu, 两种方法,一种就是在菜单资源里把所要加载的资源放到一个Popup属性的菜单下面, 另外就是程序创建一个Popup菜单,把菜单资源附加到这个Popup菜单上,再从Popup菜单中GetSubMenu(0)  取得需要

zgl7903的专栏 4285

TrackPopupMenu参数为屏幕坐标的转换

第一次接触TrackPopupMenu函数的时候大家可能会发现:编写出来的窗口的动态弹出菜单位置始终不能如愿地显示在正确位置,仔细观察或者查MSDN就知道,TrackPopupMenu函数中的坐标参数是屏幕坐标,而不是我们的窗口相对坐标,因此在使用时我们可能会想到查找当前窗口在屏幕上的坐标来实现窗口坐标与屏幕坐标转换。而有个现存的函数可供我们利用,就是void ClientToScreen( 

loongee的专栏 2095

TrackPopupMenu和DoModal

        昨天跟同学一起调程序,在一个单文档多视图的项目里,有一个视图是从CTreeView继承的,同学希望右键点击弹出菜单,然后点击菜单项弹出模式对话框。       然后就在那个视图里加了OnRButtonDown响应,由于系统自动生成,就在响应的最后调用了CTreeView::OnRButtonDown。同时在视图里添加了响应菜单命令的函数,并在其中弹出模式对话框。       但发现

m_sean的专栏 1058

如何控制弹出菜单向上弹出(how to control popup menu pop direction)

Popup Menu是windows组件,默认只能控制弹出点,但弹出方向是向上还是向下是系统自动控制的。如果有屏幕下方有足够的空间,默认是向下的。但有的时候需要菜单向上弹出,如图所示: 以前我的做法是计算菜单高度,然后从左上角向下弹出,看似向上弹出的。可是这个菜单高度是个系统相关的东西,没有一个直接的属性在菜单弹出前得到。比如xp和vista的默认高度不一样,大字体的系统和标准字体的高度也不

技术只是工具,人生才是目标 6803

MFC界面编程基础(09):菜单(二)

快捷菜单 我们平时在使用程序时,经常会用到单击鼠标右键显示快捷菜单(也称上下文菜单,右键菜单)这一功能。如果想要自己实现这个功能,需要通过以下步骤来完成: 1.为程序添加一个新的菜单资源。 可在【资源视图】选项卡上的Menu分支上单击鼠标右键,从弹出的菜单中选择【添加资源】菜单命令 这时,在Menu分支下就多了一个名为IDR_MENU1的菜单资源,并同时在VS开发界面窗口的右边窗口中打开了这个...

半个月儿上来的博客 3281

API全功略(API编程的详细介绍)

API全功略(API编程的详细介绍)什么是API 首先,有必要向大家讲一讲,什么是API。所谓API本来是为C和C++程序员写的。API说来说去,就是一种函数,他们包含在一个附加名为DLL的动态连接库文件中。用标准的定义来讲,API就是Windows的32位应用程序编程接口,是一系列很复杂的函数,消息和结构,它使编程人员可以用不同类型的编程语言编制出的运行在Windows95和Windows NT

April的学习全纪录 1万+

关于动态创建菜单后,如何获取选择的菜单项

在动态创建菜单后,如果想知道用户是选择的哪一个菜单项 retId = TrackPopupMenu( hMenu , TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD ,  pt.x , pt.y , 0 , this -> m_hWnd , NULL );  //  start the menu 如果选中了:  TPM_RETURNCMD这个属

zhubo的学习笔记 1637
上一篇: 孙鑫VC++深入详解:Lesson6 Part2 -- MFC菜单更新机制 用该机制实现 Enable or Disable MenuItem
下一篇: 孙鑫VC++深入详解:Lesson6 Part4 ---CMenu 类的应用:添加子菜单项AppendMenu,插入子菜单项InsertMenu,删除菜单DeleteMenu
sergery
博客等级 码龄18年 113粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值