📄 menuxp.cpp
字号:
VERIFY (::GetMenuItemInfo (hMenu, uItem, fByPosition, &m_miInfo));
if ( !(m_miInfo.fType & MFT_SEPARATOR) )
{
CMenuXP::m_sCaptions.Lookup (m_miInfo.wID, m_sCaption);
CMenuXP::m_Images.Lookup (m_miInfo.wID, m_ImgDesc);
}
}
///////////////////////////////////////////////////////////////////////////////
CMenuItem::~CMenuItem ()
{
}
///////////////////////////////////////////////////////////////////////////////
int CMenuItem::GetCaption (CString& sCaption) const
{
ASSERT(m_miInfo.fMask & MIIM_TYPE);
sCaption = m_sCaption;
int nShortCutPos = sCaption.Find ('\t');
if ( nShortCutPos == -1 )
{
return sCaption.GetLength();
}
sCaption = sCaption.Left (nShortCutPos);
return nShortCutPos-1;
}
///////////////////////////////////////////////////////////////////////////////
int CMenuItem::GetShortCut (CString& sShortCut) const
{
ASSERT(m_miInfo.fMask & MIIM_TYPE);
CString sCaption = m_sCaption;
int nShortCutPos = sCaption.Find ('\t');
if ( nShortCutPos == -1 )
{
sShortCut = "";
return 0;
}
int nLength = sCaption.GetLength()-nShortCutPos-1;
sShortCut = sCaption.Right (nLength);
return nLength;
}
///////////////////////////////////////////////////////////////////////////////
bool CMenuItem::GetSeparator () const
{
ASSERT(m_miInfo.fMask & MIIM_TYPE);
return (m_miInfo.fType & MFT_SEPARATOR) == MFT_SEPARATOR;
}
///////////////////////////////////////////////////////////////////////////////
bool CMenuItem::GetChecked () const
{
ASSERT(m_miInfo.fMask & MIIM_STATE);
return (m_miInfo.fState & MFS_CHECKED) == MFS_CHECKED;
}
///////////////////////////////////////////////////////////////////////////////
bool CMenuItem::GetDisabled () const
{
ASSERT(m_miInfo.fMask & MIIM_STATE);
return (m_miInfo.fState & MFS_GRAYED) == MFS_GRAYED;
}
///////////////////////////////////////////////////////////////////////////////
bool CMenuItem::GetDefault () const
{
ASSERT(m_miInfo.fMask & MIIM_STATE);
return (m_miInfo.fState & MFS_DEFAULT) == MFS_DEFAULT;
}
///////////////////////////////////////////////////////////////////////////////
HMENU CMenuItem::GetPopup () const
{
ASSERT(m_miInfo.fMask & MIIM_SUBMENU);
return m_miInfo.hSubMenu;
}
///////////////////////////////////////////////////////////////////////////////
UINT CMenuItem::GetID () const
{
ASSERT(m_miInfo.fMask & MIIM_ID);
return m_miInfo.wID;
}
///////////////////////////////////////////////////////////////////////////////
int CMenuItem::GetCaptionWidth (CDC* pDC) const
{
if ( GetSeparator() )
{
return 0;
}
CString sCaption;
int nLength = 0;
if ( GetCaption (sCaption) > 0 )
{
int nPos = sCaption.Find ('&');
CBoldDC bold (*pDC, GetDefault());
if ( nPos >= 0 )
{
sCaption = sCaption.Left (nPos) + sCaption.Right (sCaption.GetLength()-nPos-1);
}
nLength = pDC->GetTextExtent (sCaption).cx;
}
return nLength;
}
///////////////////////////////////////////////////////////////////////////////
int CMenuItem::GetShortCutWidth (CDC* pDC) const
{
if ( GetSeparator() )
{
return 0;
}
CString sShortCut;
int nLength = 0;
if ( GetShortCut (sShortCut) > 0 )
{
CBoldDC bold (*pDC, GetDefault());
nLength = pDC->GetTextExtent (sShortCut).cx;
}
return nLength;
}
///////////////////////////////////////////////////////////////////////////////
int CMenuItem::GetHeight (CDC* pDC) const
{
TEXTMETRIC tm;
pDC->GetTextMetrics (&tm);
return GetSeparator() ? tm.tmHeight/2+2 : tm.tmHeight+4;
}
// From <winuser.h>
#define OBM_CHECK 32760
///////////////////////////////////////////////////////////////////////////////
void CMenuItem::Draw (CDC* pDC, LPCRECT pRect, bool bSelected) const
{
COLORREF crBackImg = CLR_NONE;
if ( bSelected )
{
COLORREF crHighLight = ::GetSysColor (COLOR_HIGHLIGHT);
CPenDC pen (*pDC, crHighLight);
CBrushDC brush (*pDC, crBackImg = GetDisabled() ? HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), +73, 0) : HLS_TRANSFORM (crHighLight, +70, -57));
pDC->Rectangle (pRect);
}
else
{
CRect rc (pRect);
rc.right = IMGWIDTH+IMGPADDING;
pDC->FillSolidRect (rc, crBackImg = HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), +20, 0));
rc.left = rc.right;
rc.right = pRect->right;
pDC->FillSolidRect (rc, HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), +75, 0));
}
if ( GetSeparator() )
{
CPenDC pen (*pDC, HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -18, 0));
pDC->MoveTo (pRect->left+IMGWIDTH+IMGPADDING+TEXTPADDING, (pRect->top+pRect->bottom)/2);
pDC->LineTo (pRect->right-1, (pRect->top+pRect->bottom)/2);
}
else
{
CRect rc (pRect);
CString sCaption;
if ( GetCaption (sCaption) > 0 )
{
pDC->SetTextColor (GetDisabled() ? HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -18, 0) : ::GetSysColor (COLOR_MENUTEXT));
pDC->SetBkMode (TRANSPARENT);
CBoldDC bold (*pDC, GetDefault());
rc.left = IMGWIDTH+IMGPADDING+TEXTPADDING;
pDC->DrawText (sCaption, rc, DT_SINGLELINE|DT_VCENTER|DT_LEFT);
CString sShortCut;
if ( GetShortCut (sShortCut) > 0 )
{
rc.right -= TEXTPADDING+4;
pDC->DrawText (sShortCut, rc, DT_SINGLELINE|DT_VCENTER|DT_RIGHT);
}
if ( GetChecked() )
{
COLORREF crHighLight = ::GetSysColor (COLOR_HIGHLIGHT);
CPenDC pen (*pDC, crHighLight);
CBrushDC brush (*pDC, crBackImg = GetDisabled() ? HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), +73, 0) :
(bSelected ? HLS_TRANSFORM (crHighLight, +50, -50) : HLS_TRANSFORM (crHighLight, +70, -57)));
pDC->Rectangle (CRect (pRect->left+1, pRect->top+1, pRect->left+20, pRect->bottom-1));
}
if ( m_ImgDesc.m_hImgList != NULL && m_ImgDesc.m_nIndex != -1 )
{
bool bOver = !GetDisabled() && bSelected;
if ( GetDisabled() || (bSelected && !GetChecked()) )
{
HICON hIcon = ImageList_ExtractIcon (NULL, m_ImgDesc.m_hImgList, m_ImgDesc.m_nIndex);
pDC->DrawState (CPoint (pRect->left + ( bOver ? 4 : 3 ), rc.top + ( bOver ? 4 : 3 )),
CSize (IMGWIDTH, IMGHEIGHT), hIcon, DSS_MONO,
CBrush (bOver ? HLS_TRANSFORM (::GetSysColor (COLOR_HIGHLIGHT), +50, -66) : HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -27, 0)));
DestroyIcon (hIcon);
}
if ( !GetDisabled() )
{
::ImageList_Draw (m_ImgDesc.m_hImgList, m_ImgDesc.m_nIndex, pDC->m_hDC,
pRect->left+( (bSelected && !GetChecked()) ? 2 : 3 ), rc.top+( (bSelected && !GetChecked()) ? 2 : 3 ), ILD_TRANSPARENT);
}
}
else if ( GetChecked() )
{
// Draw the check mark
rc.left = pRect->left+5;
rc.right = rc.left + IMGWIDTH+IMGPADDING;
pDC->SetBkColor (crBackImg);
HBITMAP hBmp = LoadBitmap (NULL, MAKEINTRESOURCE(OBM_CHECK));
pDC->DrawState (CPoint (rc.left,rc.top+3), CSize(rc.Size()), hBmp, DSS_NORMAL, (HBRUSH)NULL);
DeleteObject (hBmp);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -