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

📄 wzdmenu.cpp

📁 《vc++扩展编程实例》源码。运用Visual C++ 5.0或6.0的高级编程技巧
💻 CPP
字号:
// WzdMenu.cpp : implementation file
//

#include "stdafx.h"
#include "wzd.h"
#include "WzdMenu.h"
#include "WzdPrjct.h"

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


/////////////////////////////////////////////////////////////////////////////
// CWzdMenu

CWzdMenu::CWzdMenu()
{
}

CWzdMenu::~CWzdMenu()
{
	while (!m_FullMenuList.IsEmpty())
	{
		delete m_FullMenuList.RemoveHead();
	}
}

void CWzdMenu::InitMenu(CWnd *pWnd, CMenu *pMenu, UINT idb, CToolBar *pToolBar)
{
	CDC *pDC=pWnd->GetDC();

	// for all submenus
	CMenu *pSubMenu = NULL;
	for (int i=0; i<(int)pMenu->GetMenuItemCount(); i++)
	{
		pSubMenu = pMenu->GetSubMenu(i);
		if (pSubMenu)
		{
			for (int j=0;j<(int)pSubMenu->GetMenuItemCount(); j++)
			{
				// if not a separator...
				UINT id=pSubMenu->GetMenuItemID(j);
				if (id)
				{
					// if already ownerdrawn, escape
					if (pSubMenu->GetMenuState(j,MF_BYPOSITION)&MF_OWNERDRAW)
					{
						pWnd->ReleaseDC(pDC);
						return;
					}

					// fill in MENUITEM
					MENUENTRY *pEntry=new MENUENTRY;
					pEntry->id=id;
					pSubMenu->GetMenuString(j,pEntry->str,MF_BYPOSITION);
					int k=pEntry->str.Find('&');
					pEntry->chr=0;
					if (k>=0)
						pEntry->chr=pEntry->str[k+1];
					pEntry->chr&=~0x20; //make upper case
					pEntry->size = pDC->GetTextExtent(pEntry->str,pEntry->str.GetLength());
					pEntry->size.cx+=BUTTON_WIDTH+2;
					pEntry->size.cy=BUTTON_HEIGHT+6;
					pEntry->inx=-1;
					for (int m=0;m<pToolBar->GetToolBarCtrl().GetButtonCount();m++)
					{
						int inx;
						UINT idx,x;
						pToolBar->GetButtonInfo(m,idx,x,inx);
						if (id==idx)
						{
							pEntry->inx=inx;
							break;
						}
					}
							

					// add MENUITEM to full list
					m_FullMenuList.AddTail(pEntry);
	
					// modify menu item to be owner drawn
					pSubMenu->ModifyMenu(id, MF_BYCOMMAND | MF_ENABLED | MF_OWNERDRAW,
										id, (LPCTSTR)pEntry);
				}
			}
		}
	}
	m_bitmap.LoadBitmap(idb);
	pWnd->ReleaseDC(pDC);
}

void CWzdMenu::InitMenuPopup()
{
	// empty current menu list
	m_CurrentMenuList.RemoveAll();
}

// size of our menu item
void CWzdMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
	MENUENTRY *pEntry=(MENUENTRY *)lpMIS->itemData;
	lpMIS->itemWidth = pEntry->size.cx;
	lpMIS->itemHeight = pEntry->size.cy;
}

// draw our menu item
void CWzdMenu::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
	// get our device context and rectangle to draw to
	CDC dc;
	dc.Attach(lpDIS->hDC);
	CDC memDC;
	memDC.CreateCompatibleDC(&dc);
	memDC.SelectObject(&m_bitmap);
	CRect rect(lpDIS->rcItem);

	// if our item is selected, then set colors accordingly
	COLORREF bk= dc.GetBkColor();
	COLORREF fg= dc.GetTextColor();
	if (lpDIS->itemState & ODS_SELECTED) 
	{
		bk=::GetSysColor(COLOR_HIGHLIGHT);
		fg=::GetSysColor(COLOR_HIGHLIGHTTEXT);
	}
	dc.SetTextColor(fg);
	
	// fill in background
	CBrush brush(bk);
	dc.FillRect(&rect, &brush);

	// draw bitmap, if any
	MENUENTRY *pEntry=(MENUENTRY *)lpDIS->itemData;
	if (pEntry->inx!=-1)
	{
		dc.BitBlt(rect.left, rect.top, BUTTON_WIDTH,BUTTON_HEIGHT, &memDC, pEntry->inx*BUTTON_WIDTH, 0, SRCCOPY);
	}

	// check it, if required
	HICON hIcon;
	if (lpDIS->itemState & ODS_CHECKED && (hIcon=AfxGetApp()->LoadIcon(IDI_CHECK_ICON)) )
	{
		dc.DrawIcon(rect.left, rect.top, hIcon);
	}

	// draw text
	rect.left+=BUTTON_WIDTH+2;
	int nBkMode = dc.SetBkMode(TRANSPARENT);
	dc.DrawText(pEntry->str, &rect, DT_LEFT|DT_EXPANDTABS|DT_VCENTER);

	// add to current menu list
	m_CurrentMenuList.AddTail(pEntry);

	// cleanup
	dc.SetTextColor(fg);
	dc.SetBkMode(nBkMode);
	memDC.DeleteDC();
	dc.Detach();
}


// draw our menu item
LRESULT CWzdMenu::MenuChar(UINT nChar)
{
	nChar&=~0x20; //make uppercase
	// try to find char in current menu list
	for (POSITION pos=m_CurrentMenuList.GetHeadPosition();pos; )
	{
		MENUENTRY *pEntry=(MENUENTRY *)m_CurrentMenuList.GetNext(pos);
		if (pEntry->chr == nChar)
		{
			AfxGetMainWnd()->SendMessage(WM_COMMAND,pEntry->id);
			return(MAKELONG(0,1));
		}
	}
	return(0);
}



// create a popup menu
void CWzdMenu::CreatePopupEx(int nCmds,UINT *pMenuCmds)
{
	// create popup menu
	CreatePopupMenu();
	for (int i=0; i<=nCmds; i++)
	{
		if (pMenuCmds[i]==-1)
		{
			AppendMenu(MF_SEPARATOR, 0, "");
		}
		else
		{
			AppendMenu(MF_OWNERDRAW, pMenuCmds[i], (LPCTSTR)pMenuCmds[i]);
		}
	}
}

⌨️ 快捷键说明

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