menusampleview.cpp

来自「《突破Visual C++.NET编程实例五十讲+源文件,初学者学习的好东东!」· C++ 代码 · 共 296 行

CPP
296
字号
#include "stdafx.h"
#include "MenuSampleView.h"
#include "FlatPopupMenu.h"
#include "resource.h"


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


IMPLEMENT_DYNCREATE(CMenuSampleView, CView)

BEGIN_MESSAGE_MAP(CMenuSampleView, CView)
	//{{AFX_MSG_MAP(CMenuSampleView)
	ON_WM_CONTEXTMENU()
	ON_WM_LBUTTONUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

CMenuSampleView::CMenuSampleView()
{
	m_pFont=NULL;
	m_pBrush=NULL;

	m_crBack=PALETTERGB(192,192,192);
	m_crText=PALETTERGB(0,0,0);

	m_bCheck1=true;
	m_bCheck2=false;
}

CMenuSampleView::~CMenuSampleView()
{
	if(m_pFont)
		delete m_pFont;

	if(m_pBrush)
		delete m_pBrush;
}

void CMenuSampleView::OnDraw(CDC *pDC)
{
	int		x,y,nDC,width1,width2;
	TEXTMETRIC tm;
	CRect	rect;

	if(m_pFont==NULL)
	{
		m_pFont=new CFont;
		//m_pFont->CreatePointFont(10,"MS Sans Serif");
		m_pFont->CreateFont(-20,
					0,0,0,
					FW_NORMAL,
					FALSE,FALSE,FALSE,
					ANSI_CHARSET,
					OUT_DEFAULT_PRECIS,
					CLIP_DEFAULT_PRECIS,
					DRAFT_QUALITY,
					DEFAULT_PITCH | FF_ROMAN,
					"Times New Roman");

		GetTextMetrics(*pDC,&tm);
		m_Height=tm.tmHeight;
	}

	if(m_pBrush==NULL)
	{
		m_pBrush=new CBrush;
		m_pBrush->CreateSolidBrush(m_crBack);
	}

	nDC=pDC->SaveDC();

	x=10;
	y=10;

	pDC->SelectObject(&m_pFont);
	pDC->SelectObject(m_pBrush);
	pDC->SelectStockObject(BLACK_PEN);
	pDC->SetTextColor(m_crText);
	pDC->SetBkMode(TRANSPARENT);

	m_rcControl.left=10;
	m_rcControl.top=10;
	m_rcControl.right=200;
	m_rcControl.bottom=100;

	pDC->Rectangle(m_rcControl);

	width1=pDC->GetTextExtent("文件").cx;
	pDC->Rectangle(x,y,x+width1+9,y+m_Height);
	pDC->TextOut(x+4,y+1,"文件");

	x+=width1+8;
	width2=pDC->GetTextExtent("编辑").cx;
	pDC->Rectangle(x,y,x+width2+8,y+m_Height);
	pDC->TextOut(x+4,y+1,"编辑");

	rect.left=10;
	rect.right=200;
	rect.top=10+m_Height+10;
	rect.bottom=100;

	m_rcFile.left=10;
	m_rcFile.top=10;
	m_rcFile.right=10+width1+8;
	m_rcFile.bottom=10+m_Height;

	m_rcEdit.left=m_rcFile.right;
	m_rcEdit.right=m_rcEdit.left+width2+8;
	m_rcEdit.top=10;
	m_rcEdit.bottom=10+m_Height;

	pDC->DrawText("选择菜单标题或右击",rect,DT_CENTER | DT_WORDBREAK);
	pDC->RestoreDC(nDC);
}

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

void CMenuSampleView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}
#endif

void CMenuSampleView::OnContextMenu(CWnd *pWnd,CPoint point)
{
	ScreenToClient(&point);

	if(m_rcControl.PtInRect(point))
		ControlMenu(point);
}

void CMenuSampleView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if(m_rcFile.PtInRect(point))
		FileMenu();
	else if(m_rcEdit.PtInRect(point))
		EditMenu();
}

void CMenuSampleView::FileMenu(void)
{
	CFlatPopupMenu menu;
	CPoint	p;
	int		id;
	TCHAR	szBuffer[100];

// 颜色设置
	menu.SetColor(CFlatPopupMenu::colorBorder,m_crText);
	menu.SetColor(CFlatPopupMenu::colorText,m_crText);
	menu.SetColor(CFlatPopupMenu::colorBackground,m_crBack);

// 创建菜单
	menu.Create(AfxGetInstanceHandle(),IDB_FILE);

// 增加菜单项
	menu.AppendItem(0,"新建(&N)",1,0);
	menu.AppendItem(0,"打开(&O)",2,1);
	menu.AppendItem(0,"关闭",3);
	menu.AppendItem(CFlatPopupMenu::itemSeparator,NULL,0);
	menu.AppendItem(0,"保存(&S)",4,2);
	menu.AppendItem(0,"另存为(&A)",5);
	menu.AppendItem(0,"全部保存(&L)",6,3);
	menu.AppendItem(CFlatPopupMenu::itemSeparator,NULL,0);
	menu.AppendItem(0,"页面设置(&U)",7);
	menu.AppendItem(0,"打印(&P)",8,4);

// 选择菜单项
	p.x=m_rcFile.left;
	p.y=m_rcFile.bottom-1;
	ClientToScreen(&p);

	id=menu.Track(p.x,p.y,NULL,true);

	if(id>0)
	{
		wsprintf(szBuffer,"选择菜单项 #%d",id);
		AfxMessageBox(szBuffer);
	}
}

void CMenuSampleView::EditMenu(void)
{
	CFlatPopupMenu menu;
	CPoint	p;
	int		id;
	TCHAR	szBuffer[100];

// 颜色设置
	menu.SetColor(CFlatPopupMenu::colorBorder,m_crText);
	menu.SetColor(CFlatPopupMenu::colorText,m_crText);
	menu.SetColor(CFlatPopupMenu::colorBackground,m_crBack);

// 创建菜单
	menu.Create(AfxGetInstanceHandle(),IDB_EDIT);

// 增加菜单项
	menu.AppendItem(0,"撤消(&U)",1,0);
	menu.AppendItem(0,"重复(&R)",2,1);
	menu.AppendItem(CFlatPopupMenu::itemSeparator,NULL,0);
	menu.AppendItem(0,"剪切(&T)",3,2);
	menu.AppendItem(0,"复制(&C)",4,3);
	menu.AppendItem(0,"粘贴(&P)",5,4);
	menu.AppendItem(0,"清除(&D)",6,5);
	menu.AppendItem(CFlatPopupMenu::itemSeparator,NULL,0);
	menu.AppendItem(0,"全选(&L)",7);

// 选择、跟踪菜单项
	p.x=m_rcEdit.left;
	p.y=m_rcEdit.bottom-1;
	ClientToScreen(&p);

	id=menu.Track(p.x,p.y,NULL,true);

	if(id>0)
	{
		wsprintf(szBuffer,"选择菜单项 #%d",id);
		AfxMessageBox(szBuffer);
	}
}

void CMenuSampleView::ControlMenu(CPoint point)
{
	CFlatPopupMenu menu,submenu;
	CPoint				 p;

// 颜色设置
	menu.SetColor(CFlatPopupMenu::colorBorder,m_crText);
	menu.SetColor(CFlatPopupMenu::colorText,m_crText);
	menu.SetColor(CFlatPopupMenu::colorBackground,m_crBack);

	submenu.SetColor(CFlatPopupMenu::colorBorder,m_crText);
	submenu.SetColor(CFlatPopupMenu::colorText,m_crText);
	submenu.SetColor(CFlatPopupMenu::colorBackground,m_crBack);

// 创建菜单
	menu.Create(AfxGetInstanceHandle(),IDB_CONTROL);
	submenu.Create(AfxGetInstanceHandle(),IDB_CONTROL);

// 增加菜单项
	menu.AppendItem(CFlatPopupMenu::itemBold | CFlatPopupMenu::itemNotSelectable,"标题",0);
	menu.AppendItem(CFlatPopupMenu::itemSeparator,NULL,0);
	menu.AppendItem(0,"选择菜单项 &1",1,m_bCheck1 ? 1 : 0);
	menu.AppendItem(0,"选择菜单项 &2",2,m_bCheck2 ? 1 : 0);
	menu.AppendItem(CFlatPopupMenu::itemSeparator,NULL,0);
	menu.AppendPopup(0,"颜色设置",submenu);

	submenu.AppendItem(0,"背景(B)",3);
	submenu.AppendItem(0,"文本(T)",4);

// 选择、跟踪菜单项
	ClientToScreen(&point);

	switch(menu.Track(point.x,point.y,NULL,true))
	{
		case 1:
			m_bCheck1^=true;
			break;

		case 2:
			m_bCheck2^=true;
			break;

		case 3:
			EditColor(m_crBack);
			break;

		case 4:
			EditColor(m_crText);
			break;
	}
}

//编辑颜色
void CMenuSampleView::EditColor(COLORREF& cr)
{
	CColorDialog dlg;

	dlg.m_cc.rgbResult=cr;
	if(dlg.DoModal()==IDOK)
	{
		cr=dlg.GetColor();
		delete m_pBrush;
		m_pBrush=NULL;
		Invalidate();
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?