📄 linemenu.cpp
字号:
// LineMenu.cpp : implementation file
//
#include "stdafx.h"
#include "LineMenu.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLineMenu
CLineMenu::CLineMenu()
{
VERIFY(CreateMenu());
MenuReplaced=FALSE;
}
CLineMenu::~CLineMenu()
{
HMENU hm=Detach();
VERIFY(hm==NULL);
}
/*
BEGIN_MESSAGE_MAP(CLineMenu, CWnd)
//{{AFX_MSG_MAP(CLineMenu)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
*/
/////////////////////////////////////////////////////////////////////////////
// CLineMenu message handlers
void CLineMenu::AppendLineMenu(UINT ID, UINT LineStyle)
{
VERIFY(AppendMenu(
MF_ENABLED | MF_OWNERDRAW,
ID,
(LPCTSTR)LineStyle)
);
}
void CLineMenu::AddLineMenu(UINT ID,UINT mn,HWND hwnd)
{
int i;
if(MenuReplaced==TRUE)
{
return;
}
//添加菜单:
for(i=0;i<mn;i++)
{
AppendLineMenu(ID+i,i);
}
HMENU hmenu;
//得到菜单句柄:
hmenu=::GetMenu(hwnd);
TCHAR szString[256]; // don't change the string
//将菜单标题拷贝到一个缓冲区中:
::GetMenuString(hmenu,ID,szString, sizeof(szString),MF_BYCOMMAND);
//改变当前弹出式菜单:
VERIFY(::ModifyMenu(hmenu,ID,MF_BYCOMMAND|MF_POPUP,(UINT)m_hMenu,szString));
//防止菜单被多次改变的标志:
MenuReplaced=TRUE;
}
//设置菜单项尺寸:
void CLineMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
lpMIS->itemHeight=16;//菜单项宽度
lpMIS->itemWidth =80;//菜单项高度
}
//画绘制单项:
void CLineMenu::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
UINT Ls =lpDIS->itemData; //由AppendMenu()函数
//传送过来的线型参数;
UINT xs,ys,xe,w,h;
if(Ls>3) Ls=3;
//菜单项的高度:
w=lpDIS->rcItem.right-lpDIS->rcItem.left-6;
h=lpDIS->rcItem.bottom-lpDIS->rcItem.top;
//画线的起始坐标:
xs=lpDIS->rcItem.left+3;
ys=lpDIS->rcItem.top+h/2;
//画线的终止坐标:
xe=lpDIS->rcItem.right-3;
CPen pen;
CPen * op;
CBrush br,*ob;
//正常状态下,在菜单上画线:
if (lpDIS->itemAction & ODA_DRAWENTIRE)
{
pen.CreatePen(Ls,1,RGB(100,100,255));
op=pDC->SelectObject(&pen);
//画线:
pDC->MoveTo(xs,ys);
pDC->LineTo(xe,ys);
pDC->SelectObject(op);
pen.DeleteObject();
}
//当光标处于菜单项上时,在菜单上绘制椭圆,并画线:
if ((lpDIS->itemState & ODS_SELECTED) &&
(lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
{
//绘制选中后的椭圆:
pen.CreatePen(PS_DOT,1,RGB(100,100,255));
br.CreateSolidBrush(RGB(100,100,255));
op=pDC->SelectObject(&pen);
ob=pDC->SelectObject(&br);
int or=pDC->SetROP2(R2_XORPEN);
pDC->Ellipse(&lpDIS->rcItem);
pDC->SetROP2(or);
pDC->SelectObject(op);
pDC->SelectObject(ob);
pen.DeleteObject();
br .DeleteObject();
//画线:
pen.CreatePen(Ls,1,RGB(100,100,255));
op=pDC->SelectObject(&pen);
pDC->MoveTo(xs,ys);
pDC->LineTo(xe,ys);
pDC->SelectObject(op);
pen.DeleteObject();
}
//当光标离开菜单项时,在菜单上清除椭圆,并画线:
if (!(lpDIS->itemState & ODS_SELECTED) &&
(lpDIS->itemAction & ODA_SELECT))
{
// Item has been de-selected -- remove frame
//清除选中后的椭圆:
pen.CreatePen(PS_DOT,1,RGB(100,100,255));
br.CreateSolidBrush(RGB(100,100,255));
op=pDC->SelectObject(&pen);
ob=pDC->SelectObject(&br);
int or=pDC->SetROP2(R2_XORPEN);
pDC->Ellipse(&lpDIS->rcItem);
pDC->SetROP2(or);
pDC->SelectObject(op);
pDC->SelectObject(ob);
pen.DeleteObject();
br .DeleteObject();
//重新画线:
pen.CreatePen(Ls,1,RGB(100,100,255));
op=pDC->SelectObject(&pen);
pDC->MoveTo(xs,ys);
pDC->LineTo(xe,ys);
pDC->SelectObject(op);
pen.DeleteObject();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -