📄 wzdmenu.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 + -