📄 menuspawn.cpp
字号:
if (bSelect && bEnab)
{
rcText.top ++;
rcText.left += 2;
}
pDC->FillSolidRect(rcText, crMenu);
pDC->DrawText(cs, rcText, DT_VCENTER|DT_CENTER|DT_SINGLELINE);
if (bSelect && bEnab) pDC->Draw3dRect(rcBdr,cr3dShadow,cr3dHilight);
}
else
{
rcText.left += rcImage.right + 1;
int obk = pDC->SetBkMode(TRANSPARENT);
COLORREF ocr;
if (bSelect)
{
if (pItem->iImageIdx >= 0 || (state & ODS_CHECKED))
pDC->FillSolidRect(rcText, crHighlight);
else
pDC->FillSolidRect(rc, crHighlight);
ocr = pDC->SetTextColor(crMenuTextSel);
}
else
{
if (!bBackBitmap)
{
if (pItem->iImageIdx >= 0 || (state & ODS_CHECKED))
pDC->FillSolidRect(rcText, crMenu);
else
pDC->FillSolidRect(rc/*rcText*/, crMenu);
}
ocr = pDC->SetTextColor(crMenuText);
}
if (pItem->iImageIdx >= 0)
{
int ay = (rcImage.Height() - szImage.cy) / 2;
int ax = (rcImage.Width() - szImage.cx) / 2;
if (bSelect && bEnab)
pDC->Draw3dRect(rcImage,cr3dHilight,cr3dShadow);
else
{
if (!bBackBitmap) pDC->Draw3dRect(rcImage,crMenu,crMenu);
}
if (bEnab)
{
ilList.Draw(pDC, pItem->iImageIdx, CPoint(rcImage.left + ax, rcImage.top +ay), ILD_NORMAL);
}
else
{
HICON hIcon = ilList.ExtractIcon( pItem->iImageIdx );
pDC->DrawState( CPoint(rcImage.left + ax, rcImage.top + ay ), szImage, (HICON)hIcon, DST_ICON | DSS_DISABLED, (CBrush *)NULL );
}
}
else
{
if (bChecked)
{
int ay = (rcImage.Height() - szImage.cy) / 2;
int ax = (rcImage.Width() - szImage.cx) / 2;
ilOther.Draw(pDC, 0, CPoint(rcImage.left + ax, rcImage.top + ay - 2), ILD_NORMAL);
}
}
CString cs(pItem->cText), cs1;
CSize sz;
sz = pDC->GetTextExtent(cs);
int ay1 = (rcText.Height() - sz.cy) / 2;
rcText.top += ay1;
rcText.left += 2;
rcText.right -= 15;
int tf = cs.Find('\t');
if (tf >= 0)
{
cs1 = cs.Right(cs.GetLength() - tf - 1);
cs = cs.Left(tf);
if (!bEnab)
{
if (!bSelect)
{
CRect rcText1(rcText);
rcText1.InflateRect(-1,-1);
pDC->SetTextColor(cr3dHilight);
pDC->DrawText(cs, rcText1, DT_VCENTER|DT_LEFT);
pDC->DrawText(cs1, rcText1, DT_VCENTER|DT_RIGHT);
pDC->SetTextColor(crGrayText);
pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT);
pDC->DrawText(cs1, rcText, DT_VCENTER|DT_RIGHT);
}
else
{
pDC->SetTextColor(crMenu);
pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT);
pDC->DrawText(cs1, rcText, DT_VCENTER|DT_RIGHT);
}
}
else
{
pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT);
pDC->DrawText(cs1, rcText, DT_VCENTER|DT_RIGHT);
}
}
else
{
if (!bEnab)
{
if (!bSelect)
{
CRect rcText1(rcText);
rcText1.InflateRect(-1,-1);
pDC->SetTextColor(cr3dHilight);
pDC->DrawText(cs, rcText1, DT_VCENTER|DT_LEFT|DT_EXPANDTABS);
pDC->SetTextColor(crGrayText);
pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT|DT_EXPANDTABS);
}
else
{
pDC->SetTextColor(crMenu);
pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT|DT_EXPANDTABS);
}
}
else
pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT|DT_EXPANDTABS);
}
pDC->SetTextColor(ocr);
pDC->SetBkMode(obk);
}
pDC->SelectObject(of);
}
res = true;
}
return res;
}
bool CMenuSpawn::MeasureItem(LPMEASUREITEMSTRUCT lpm)
{
bool res = false;
if (lpm->CtlType == ODT_MENU)
{
UINT id = lpm->itemID;
SpawnItem * pItem = (SpawnItem *) lpm->itemData;
if (pItem)
{
if (pItem->iCmd == -3) // is a separator
{
lpm->itemWidth = 10;
lpm->itemHeight = 6;
}
else
{
CString cs(pItem->cText);
if (cs != "")
{
CClientDC dc(AfxGetMainWnd());
CFont * pft = CFont::FromHandle(hMenuFont ? hMenuFont : hGuiFont);
CFont * of = dc.SelectObject(pft);
CSize osz = dc.GetOutputTabbedTextExtent(cs,0,NULL);
if (pItem->iCmd == -4)
{
CRect rci(0,0,0,0);
dc.DrawText(cs, rci, DT_CALCRECT|DT_TOP|DT_VCENTER|DT_SINGLELINE);
lpm->itemHeight = rci.Height();
lpm->itemWidth = rci.Width();
}
else
{
lpm->itemHeight = szImage.cy + 5;
if (osz.cy > (int) lpm->itemHeight) lpm->itemHeight = (int) osz.cy;
lpm->itemWidth = osz.cx + 2 + 15;
lpm->itemWidth += lpm->itemHeight > (UINT) szImage.cx ? (UINT) lpm->itemHeight : (UINT) szImage.cx;
}
dc.SelectObject(of);
}
else
{
lpm->itemHeight = szImage.cy + 5;
lpm->itemWidth = 100;
}
}
}
res = true;
}
return res;
}
void CMenuSpawn::EnableMenuItems(CMenu * pMenu, CWnd * pParent)
{
ASSERT(pMenu);
ASSERT(pParent);
int nItem = pMenu->GetMenuItemCount();
CCmdUI state;
state.m_pMenu = pMenu;
state.m_nIndex = nItem-1;
state.m_nIndexMax = nItem;
while ((--nItem)>=0)
{
UINT itemId = pMenu->GetMenuItemID(nItem);
if (itemId == (UINT) -1)
{
CMenu *pops = pMenu->GetSubMenu(nItem);
if (pops) EnableMenuItems(pops, pParent);
}
else
{
if (itemId != 0)
{
state.m_nID = itemId;
pParent->OnCmdMsg(itemId, CN_UPDATE_COMMAND_UI, &state, NULL);
state.DoUpdate(pParent, true);
}
}
state.m_nIndex = nItem-1;
}
}
bool CMenuSpawn::SetFont(LOGFONT * lf)
{
ASSERT(lf);
if (hMenuFont) ::DeleteObject((HGDIOBJ)hMenuFont);
hMenuFont = CreateFontIndirect(lf);
return hMenuFont != NULL ? true : false;
}
bool CMenuSpawn::FindKeyboardShortcut(UINT nChar, UINT nFlags, CMenu * pMenu, LRESULT & lRes)
{
ASSERT(pMenu);
int nItem = pMenu->GetMenuItemCount();
CString csChar((CHAR) nChar);
csChar.MakeLower();
while ((--nItem)>=0)
{
UINT itemId = pMenu->GetMenuItemID(nItem);
if (itemId != 0)
{
MENUITEMINFO lpmi;
ZeroMemory(&lpmi, sizeof(MENUITEMINFO));
lpmi.cbSize = sizeof(MENUITEMINFO);
lpmi.fMask = MIIM_DATA|MIIM_TYPE;
ASSERT(pMenu->GetSafeHmenu());
if (GetMenuItemInfo(pMenu->GetSafeHmenu(), nItem, TRUE, &lpmi))
{
if (lpmi.fType&MFT_OWNERDRAW)
{
SpawnItem * si = (SpawnItem *) lpmi.dwItemData;
if (si)
{
CString csItem(si->cText);
csItem.MakeLower();
int iAmperIdx = csItem.Find('&');
if (iAmperIdx >= 0)
{
csItem = csItem.Mid(iAmperIdx + 1, 1);
if (csItem == csChar)
{
lRes = MAKELONG((WORD)nItem, 2);
return true;
}
}
}
}
}
}
}
return false;
}
void CMenuSpawn::SetTextColor(const COLORREF crNormal, const COLORREF crSelected)
{
crMenuText = crNormal;
crMenuTextSel = crSelected;
}
void CMenuSpawn::SetBackBitmap(const int iRes)
{
if (bmpBack.GetSafeHandle()) bmpBack.DeleteObject();
bmpBack.LoadBitmap(iRes);
bBackBitmap = true;
}
void CMenuSpawn::SetBackBitmap(const int iRes, COLORREF crBackColor)
{
if (bmpBack.GetSafeHandle()) bmpBack.DeleteObject();
COLORMAP cMap1 = { crBackColor, cr3dFace };
bmpBack.LoadMappedBitmap(iRes, 0, &cMap1, 1);
bBackBitmap = true;
}
bool CMenuSpawn::GetMenuItemText(CString &csText, CMenu * pMenu, const int cmd, bool bByPos)
{
ASSERT(pMenu);
UINT itemId = bByPos ? pMenu->GetMenuItemID(cmd) : cmd;
if (itemId != 0)
{
MENUITEMINFO lpmi;
ZeroMemory(&lpmi, sizeof(MENUITEMINFO));
lpmi.cbSize = sizeof(MENUITEMINFO);
lpmi.fMask = MIIM_DATA|MIIM_TYPE;
ASSERT(pMenu->GetSafeHmenu());
if (GetMenuItemInfo(pMenu->GetSafeHmenu(), cmd, bByPos, &lpmi))
{
if (lpmi.fType&MFT_OWNERDRAW)
{
SpawnItem * si = (SpawnItem *) lpmi.dwItemData;
if (si)
{
csText = si->cText;
return true;
}
}
else
{
return pMenu->GetMenuString(cmd, csText, bByPos ? MF_BYPOSITION : MF_BYCOMMAND) > 0;
}
}
}
return false;
}
bool CMenuSpawn::IsSpawnMenu(CMenu * pMenu, const int iItem, const bool bByPos)
{
ASSERT(pMenu);
UINT itemId = bByPos ? pMenu->GetMenuItemID(iItem) : iItem;
if (itemId != 0)
{
MENUITEMINFO lpmi;
ZeroMemory(&lpmi, sizeof(MENUITEMINFO));
lpmi.cbSize = sizeof(MENUITEMINFO);
lpmi.fMask = MIIM_DATA|MIIM_TYPE;
ASSERT(pMenu->GetSafeHmenu());
if (GetMenuItemInfo(pMenu->GetSafeHmenu(), iItem, bByPos, &lpmi))
{
if (lpmi.fType&MFT_OWNERDRAW)
{
SpawnItem * si = (SpawnItem *) lpmi.dwItemData;
if (si) return true;
}
}
}
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -