📄 menuxp.cpp
字号:
///////////////////////////////////////////////////////////////////////////////
//
// MenuXP.cpp : implementation file
//
///////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MenuXP.h"
#include "Tools.h"
#include "Draw.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define IMGWIDTH 16
#define IMGHEIGHT 16
#define IMGPADDING 6
#define TEXTPADDING 8
///////////////////////////////////////////////////////////////////////////////
class CMenuItem
{
protected:
MENUITEMINFO m_miInfo;
CString m_sCaption;
CImgDesc m_ImgDesc;
HIMAGELIST m_hImgList;
int m_nIndex;
public:
CMenuItem ();
CMenuItem (HMENU hMenu, UINT uItem, bool fByPosition = true);
~CMenuItem ();
// Properties
public:
int GetCaption (CString& sCaption) const;
int GetShortCut (CString& sShortCut) const;
bool GetSeparator () const;
bool GetChecked () const;
bool GetDisabled () const;
bool GetDefault () const;
HMENU GetPopup () const;
UINT GetID () const;
// Methods
public:
int GetCaptionWidth (CDC* pDC) const;
int GetShortCutWidth (CDC* pDC) const;
int GetHeight (CDC* pDC) const;
void Draw (CDC* pDC, LPCRECT pRect, bool bSelected) const;
};
CMap <int, int, CString, CString&> CMenuXP::m_sCaptions;
CMap <int, int, CImgDesc, CImgDesc&> CMenuXP::m_Images;
///////////////////////////////////////////////////////////////////////////////
bool CMenuXP::IsOwnerDrawn (HMENU hMenu)
{
MENUITEMINFO mii = { sizeof MENUITEMINFO, MIIM_TYPE };
::GetMenuItemInfo (hMenu, 0, true, &mii);
return (mii.fType & MFT_OWNERDRAW) != 0;
}
///////////////////////////////////////////////////////////////////////////////
void CMenuXP::OnMeasureItem (MEASUREITEMSTRUCT* pMeasureItemStruct)
{
if ( pMeasureItemStruct->CtlType == ODT_MENU )
{
pMeasureItemStruct->itemHeight = LOBYTE(LOWORD(pMeasureItemStruct->itemData));
pMeasureItemStruct->itemWidth = IMGWIDTH + IMGPADDING + HIWORD(pMeasureItemStruct->itemData) + TEXTPADDING + HIBYTE(LOWORD(pMeasureItemStruct->itemData)) + TEXTPADDING + 4;
}
}
///////////////////////////////////////////////////////////////////////////////
void CMenuXP::OnDrawItem (DRAWITEMSTRUCT* pDrawItemStruct)
{
ASSERT (pDrawItemStruct->CtlType == ODT_MENU);
CBufferDC cDC (pDrawItemStruct->hDC, pDrawItemStruct->rcItem);
CMenuItem item ((HMENU)pDrawItemStruct->hwndItem, pDrawItemStruct->itemID, false);
cDC.SelectObject (CFont::FromHandle ((HFONT)GetStockObject (DEFAULT_GUI_FONT)));
item.Draw (&cDC, &pDrawItemStruct->rcItem, (pDrawItemStruct->itemState & ODS_SELECTED)!=0);
}
///////////////////////////////////////////////////////////////////////////////
LRESULT CMenuXP::OnMenuChar (HMENU hMenu, UINT nChar, UINT nFlags)
{
if ( (nFlags & (MF_POPUP|MF_SYSMENU)) == MF_POPUP )
{
int nItemCount = ::GetMenuItemCount (hMenu);
nChar = toupper (nChar);
for ( int i = 0; i < nItemCount; i++ )
{
CMenuItem mnuItem (hMenu, i);
CString sCaption;
mnuItem.GetCaption (sCaption);
sCaption.MakeUpper();
for ( int nPos = sCaption.GetLength()-2; nPos >= 0; nPos-- )
{
if ( sCaption[nPos] == '&' && (UINT)toupper (sCaption[nPos+1]) == nChar &&
(nPos == 0 || sCaption[nPos-1] != '&') )
{
return MAKELRESULT(i,2);
}
}
}
}
return 0;
}
///////////////////////////////////////////////////////////////////////////////
void CMenuXP::SetWinXPStyle (HMENU hMenu, CWnd* pWnd)
{
ASSERT(hMenu != NULL);
int nItemCount = ::GetMenuItemCount (hMenu);
MENUITEMINFO mii = { sizeof MENUITEMINFO, MIIM_ID|MIIM_TYPE };
CClientDC cDC (AfxGetMainWnd());
TEXTMETRIC tm;
cDC.SelectObject ((HFONT)GetStockObject (DEFAULT_GUI_FONT));
cDC.GetTextMetrics (&tm);
int nHeight = max(tm.tmHeight+2,IMGHEIGHT)+4;
int nSepHeight = tm.tmHeight/2+2;
int nCaptionLength = 0;
int nShortCutLength = 0;
CPtrList* pListControlBars = NULL;
if ( pWnd != NULL )
{
if ( pWnd->IsKindOf (RUNTIME_CLASS(CFrameWnd)) && !((CFrameWnd*)pWnd)->m_listControlBars.IsEmpty() )
{
pListControlBars = &((CFrameWnd*)pWnd)->m_listControlBars;
}
else
{
CFrameWnd* pFrame = pWnd->GetParentFrame();
if ( pFrame != NULL )
{
pListControlBars = &pFrame->m_listControlBars;
}
}
}
for ( int i = 0; i < nItemCount; i++ )
{
TCHAR sCaption[256] = _T("");
mii.dwTypeData = sCaption;
mii.cch = 255;
::GetMenuItemInfo (hMenu, i, true, &mii);
if ( (mii.fType & MFT_OWNERDRAW) == 0 )
{
mii.fType |= MFT_OWNERDRAW;
::SetMenuItemInfo (hMenu, i, true, &mii);
if ( (mii.fType & MFT_SEPARATOR) == 0 )
{
CString sBuff(sCaption);
CMenuXP::m_sCaptions.SetAt (mii.wID, sBuff);
if ( pListControlBars != NULL )
{
POSITION pos = pListControlBars->GetHeadPosition();
while ( pos != NULL )
{
CControlBar* pBar = (CControlBar*)pListControlBars->GetNext (pos);
ASSERT(pBar != NULL);
if ( pBar->IsKindOf (RUNTIME_CLASS(CToolBar)) )
{
TBBUTTONINFO tbbi = { sizeof(TBBUTTONINFO), TBIF_COMMAND|TBIF_IMAGE };
if ( pBar->SendMessage (TB_GETBUTTONINFO, mii.wID, (LPARAM)&tbbi) != -1 &&
(UINT)tbbi.idCommand == mii.wID && tbbi.iImage != -1 )
{
CImgDesc imgDesc ((HIMAGELIST)pBar->SendMessage (TB_GETIMAGELIST, 0, 0), tbbi.iImage);
m_Images.SetAt (mii.wID, imgDesc);
break;
}
}
}
}
}
}
CMenuItem mnuItem (hMenu, i);
int nWidth = mnuItem.GetCaptionWidth (&cDC);
if ( nWidth > nCaptionLength )
{
nCaptionLength = nWidth;
}
nWidth = mnuItem.GetShortCutWidth (&cDC);
if ( nWidth > nShortCutLength )
{
nShortCutLength = nWidth;
}
}
for ( int j = 0; j < nItemCount; j++ )
{
mii.fMask = MIIM_TYPE;
::GetMenuItemInfo (hMenu, j, true, &mii);
if ( (mii.fType & MFT_SEPARATOR) == 0 )
{
mii.dwItemData = MAKELONG(MAKEWORD(nHeight, nShortCutLength), nCaptionLength);
}
else
{
mii.dwItemData = nSepHeight;
}
mii.fMask = MIIM_DATA;
::SetMenuItemInfo (hMenu, j, true, &mii);
}
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
CMenuItem::CMenuItem ()
{
memset (&m_miInfo, 0, sizeof(MENUITEMINFO));
}
///////////////////////////////////////////////////////////////////////////////
CMenuItem::CMenuItem (HMENU hMenu, UINT uItem, bool fByPosition)
{
memset (&m_miInfo, 0, sizeof(MENUITEMINFO));
m_miInfo.cbSize = sizeof(MENUITEMINFO);
m_miInfo.fMask = MIIM_STATE|MIIM_SUBMENU|MIIM_TYPE|MIIM_DATA|MIIM_ID;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -