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 + -
显示快捷键?