⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linemenu.cpp

📁 《VC++ 编程技巧与示例 .rar》各个示例代码绝对可用
💻 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 + -