?? atlctrlw.h
字號(hào):
bAction = true;
}
HWND hWndMenu = m_stackMenuWnd.GetCurrent();
ATLASSERT(hWndMenu != NULL);
// Close the popup menu
if(bAction)
{
::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);
if(wParam == wpNext)
{
int cItem = m_stackMenuWnd.GetSize() - 1;
while(cItem >= 0)
{
hWndMenu = m_stackMenuWnd[cItem];
if(hWndMenu != NULL)
::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);
cItem--;
}
}
#if (_WIN32_IE >= 0x0500)
if(m_nNextPopBtn == -2)
{
m_nNextPopBtn = -1;
pT->DisplayChevronMenu();
}
#endif //(_WIN32_IE >= 0x0500)
bHandled = TRUE;
}
}
}
return 0;
}
LRESULT OnHookNextMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, "CmdBar - Hook WM_NEXTMENU\n");
#endif
bHandled = FALSE;
return 1;
}
LRESULT OnHookChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, "CmdBar - Hook WM_CHAR (0x%2.2X)\n", wParam);
#endif
bHandled = (wParam == VK_ESCAPE);
return 0;
}
// Implementation - ownerdraw overrideables and helpers
void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
T* pT = static_cast<T*>(this);
if(m_bFlatMenus)
pT->DrawItemFlat(lpDrawItemStruct);
else
pT->DrawItem3D(lpDrawItemStruct);
}
void DrawItem3D(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
_MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData;
CDCHandle dc = lpDrawItemStruct->hDC;
const RECT& rcItem = lpDrawItemStruct->rcItem;
T* pT = static_cast<T*>(this);
if(pmd->fType & MFT_SEPARATOR)
{
// draw separator
RECT rc = rcItem;
rc.top += (rc.bottom - rc.top) / 2; // vertical center
dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP); // draw separator line
}
else // not a separator
{
BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED;
BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED;
BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED;
BOOL bHasImage = FALSE;
if(LOWORD(lpDrawItemStruct->itemID) == (WORD)-1)
bSelected = FALSE;
RECT rcButn = { rcItem.left, rcItem.top, rcItem.left + m_szButton.cx, rcItem.top + m_szButton.cy }; // button rect
::OffsetRect(&rcButn, 0, ((rcItem.bottom - rcItem.top) - (rcButn.bottom - rcButn.top)) / 2); // center vertically
int iButton = pmd->iButton;
if(iButton >= 0)
{
bHasImage = TRUE;
// calc drawing point
SIZE sz = { rcButn.right - rcButn.left - m_szBitmap.cx, rcButn.bottom - rcButn.top - m_szBitmap.cy };
sz.cx /= 2;
sz.cy /= 2;
POINT point = { rcButn.left + sz.cx, rcButn.top + sz.cy };
// draw disabled or normal
if(!bDisabled)
{
// normal - fill background depending on state
if(!bChecked || bSelected)
{
dc.FillRect(&rcButn, (bChecked && !bSelected) ? COLOR_3DLIGHT : COLOR_MENU);
}
else
{
COLORREF crTxt = dc.SetTextColor(::GetSysColor(COLOR_BTNFACE));
COLORREF crBk = dc.SetBkColor(::GetSysColor(COLOR_BTNHILIGHT));
CBrush hbr(CDCHandle::GetHalftoneBrush());
dc.SetBrushOrg(rcButn.left, rcButn.top);
dc.FillRect(&rcButn, hbr);
dc.SetTextColor(crTxt);
dc.SetBkColor(crBk);
}
// draw pushed-in or popped-out edge
if(bSelected || bChecked)
{
RECT rc2 = rcButn;
dc.DrawEdge(&rc2, bChecked ? BDR_SUNKENOUTER : BDR_RAISEDINNER, BF_RECT);
}
// draw the image
::ImageList_Draw(m_hImageList, iButton, dc, point.x, point.y, ILD_TRANSPARENT);
}
else
{
HBRUSH hBrushBackground = ::GetSysColorBrush(COLOR_MENU);
pT->DrawBitmapDisabled(dc, iButton, point, hBrushBackground);
}
}
else
{
// no image - look for custom checked/unchecked bitmaps
CMenuItemInfo info;
info.fMask = MIIM_CHECKMARKS | MIIM_TYPE;
::GetMenuItemInfo((HMENU)lpDrawItemStruct->hwndItem, lpDrawItemStruct->itemID, MF_BYCOMMAND, &info);
if(bChecked || info.hbmpUnchecked != NULL)
{
BOOL bRadio = ((info.fType & MFT_RADIOCHECK) != 0);
bHasImage = pT->DrawCheckmark(dc, rcButn, bSelected, bDisabled, bRadio, bChecked ? info.hbmpChecked : info.hbmpUnchecked);
}
}
// draw item text
int cxButn = m_szButton.cx;
COLORREF colorBG = ::GetSysColor(bSelected ? COLOR_HIGHLIGHT : COLOR_MENU);
if(bSelected || lpDrawItemStruct->itemAction == ODA_SELECT)
{
RECT rcBG = rcItem;
if(bHasImage)
rcBG.left += cxButn + s_kcxGap;
dc.FillRect(&rcBG, bSelected ? COLOR_HIGHLIGHT : COLOR_MENU);
}
// calc text rectangle and colors
RECT rcText = rcItem;
rcText.left += cxButn + s_kcxGap + s_kcxTextMargin;
rcText.right -= cxButn;
dc.SetBkMode(TRANSPARENT);
COLORREF colorText = ::GetSysColor(bDisabled ? (bSelected ? COLOR_GRAYTEXT : COLOR_3DSHADOW) : (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT));
// font already selected by Windows
if(bDisabled && (!bSelected || colorText == colorBG))
{
// disabled - draw shadow text shifted down and right 1 pixel (unles selected)
RECT rcDisabled = rcText;
::OffsetRect(&rcDisabled, 1, 1);
pT->DrawMenuText(dc, rcDisabled, pmd->lpstrText, ::GetSysColor(COLOR_3DHILIGHT));
}
pT->DrawMenuText(dc, rcText, pmd->lpstrText, colorText); // finally!
}
}
void DrawItemFlat(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
_MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData;
CDCHandle dc = lpDrawItemStruct->hDC;
const RECT& rcItem = lpDrawItemStruct->rcItem;
T* pT = static_cast<T*>(this);
#ifndef COLOR_MENUHILIGHT
const int COLOR_MENUHILIGHT = 29;
#endif //!COLOR_MENUHILIGHT
BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED;
BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED;
BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED;
// paint background
if(bSelected || lpDrawItemStruct->itemAction == ODA_SELECT)
{
if(bSelected)
{
dc.FillRect(&rcItem, ::GetSysColorBrush(COLOR_MENUHILIGHT));
dc.FrameRect(&rcItem, ::GetSysColorBrush(COLOR_HIGHLIGHT));
}
else
{
dc.FillRect(&rcItem, ::GetSysColorBrush(COLOR_MENU));
}
}
if(pmd->fType & MFT_SEPARATOR)
{
// draw separator
RECT rc = rcItem;
rc.top += (rc.bottom - rc.top) / 2; // vertical center
dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP); // draw separator line
}
else // not a separator
{
if(LOWORD(lpDrawItemStruct->itemID) == (WORD)-1)
bSelected = FALSE;
RECT rcButn = { rcItem.left, rcItem.top, rcItem.left + m_szButton.cx, rcItem.top + m_szButton.cy }; // button rect
::OffsetRect(&rcButn, 0, ((rcItem.bottom - rcItem.top) - (rcButn.bottom - rcButn.top)) / 2); // center vertically
// draw background and border for checked items
if(m_bFlatMenus && bChecked)
{
RECT rcCheck = rcButn;
::InflateRect(&rcCheck, -1, -1);
if(bSelected)
dc.FillRect(&rcCheck, ::GetSysColorBrush(COLOR_MENU));
dc.FrameRect(&rcCheck, ::GetSysColorBrush(COLOR_HIGHLIGHT));
}
int iButton = pmd->iButton;
if(iButton >= 0)
{
// calc drawing point
SIZE sz = { rcButn.right - rcButn.left - m_szBitmap.cx, rcButn.bottom - rcButn.top - m_szBitmap.cy };
sz.cx /= 2;
sz.cy /= 2;
POINT point = { rcButn.left + sz.cx, rcButn.top + sz.cy };
// draw disabled or normal
if(!bDisabled)
{
::ImageList_Draw(m_hImageList, iButton, dc, point.x, point.y, ILD_TRANSPARENT);
}
else
{
HBRUSH hBrushBackground = ::GetSysColorBrush(bSelected ? COLOR_MENUHILIGHT : COLOR_MENU);
HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW);
pT->DrawBitmapDisabled(dc, iButton, point, hBrushBackground, hBrushBackground, hBrushDisabledImage);
}
}
else
{
// no image - look for custom checked/unchecked bitmaps
CMenuItemInfo info;
info.fMask = MIIM_CHECKMARKS | MIIM_TYPE;
::GetMenuItemInfo((HMENU)lpDrawItemStruct->hwndItem, lpDrawItemStruct->itemID, MF_BYCOMMAND, &info);
if(bChecked || info.hbmpUnchecked != NULL)
{
BOOL bRadio = ((info.fType & MFT_RADIOCHECK) != 0);
pT->DrawCheckmark(dc, rcButn, bSelected, bDisabled, bRadio, bChecked ? info.hbmpChecked : info.hbmpUnchecked);
}
}
// draw item text
int cxButn = m_szButton.cx;
// calc text rectangle and colors
RECT rcText = rcItem;
rcText.left += cxButn + s_kcxGap + s_kcxTextMargin;
rcText.right -= cxButn;
dc.SetBkMode(TRANSPARENT);
COLORREF colorText = ::GetSysColor(bDisabled ? (bSelected ? COLOR_GRAYTEXT : COLOR_3DSHADOW) : (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT));
pT->DrawMenuText(dc, rcText, pmd->lpstrText, colorText); // finally!
}
}
void DrawMenuText(CDCHandle& dc, RECT& rc, LPCTSTR lpstrText, COLORREF color)
{
int nTab = -1;
for(int i = 0; i < lstrlen(lpstrText); i++)
{
if(lpstrText[i] == '\t')
{
nTab = i;
break;
}
}
dc.SetTextColor(color);
dc.DrawText(lpstrText, nTab, &rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX));
if(nTab != -1)
dc.DrawText(&lpstrText[nTab + 1], -1, &rc, DT_SINGLELINE | DT_RIGHT | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX));
}
void DrawBitmapDisabled(CDCHandle& dc, int nImage, POINT point,
HBRUSH hBrushBackground = ::GetSysColorBrush(COLOR_3DFACE),
HBRUSH hBrush3DEffect = ::GetSysColorBrush(COLOR_3DHILIGHT),
HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW))
{
#if (_WIN32_WINNT >= 0x0501)
if(m_bAlphaImages)
{
IMAGELISTDRAWPARAMS ildp;
memset(&ildp, 0, sizeof(ildp));
ildp.cbSize = sizeof(IMAGELISTDRAWPARAMS);
ildp.himl = m_hImageList;
ildp.i = nImage;
ildp.hdcDst = dc;
ildp.x = point.x;
ildp.y = point.y;
ildp.cx = 0;
ildp.cy = 0;
ildp.xBitmap = 0;
ildp.yBitmap = 0;
ildp.fStyle = ILD_TRANSPARENT;
ildp.fState = ILS_SATURATE;
ildp.Frame = (DWORD)-100;
::ImageList_DrawIndirect(&ildp);
}
else
#endif //(_WIN32_WINNT >= 0x0501)
{
// create memory DC
CDC dcMem;
dcMem.CreateCompatibleDC(dc);
// create mono or color bitmap
CBitmap bmp;
bmp.CreateCompatibleBitmap(dc, m_szBitmap.cx, m_szBitmap.cy);
ATLASSERT(bmp.m_hBitmap != NULL);
// draw image into memory DC--fill BG white first
HBITMAP hBmpOld = dcMem.SelectBitmap(bmp);
dcMem.PatBlt(0, 0, m_szBitmap.cx, m_szBitmap.cy, WHITENESS);
// If white is the text color, we can't use the normal painting since
// it would blend with the WHITENESS, but the mask is OK
UINT uDrawStyle = (::GetSysColor(COLOR_BTNTEXT) == RGB(255, 255, 255)) ? ILD_MASK : ILD_NORMAL;
::ImageList_Draw(m_hImageList, nImage, dcMem, 0, 0, uDrawStyle);
dc.DitherBlt(point.x, point.y, m_szBitmap.cx, m_szBitmap.cy, dcMem, NULL, 0, 0, hBrushBackground, hBrush3DEffect, hBrushDisabledImage);
dcMem.SelectBitmap(hBmpOld); // restore
}
}
// old name
BOOL Draw3DCheckmark(CDCHandle& dc, const RECT& rc, BOOL bSelected, BOOL bDisabled, BOOL bRadio, HBITMAP hBmpCheck)
{
return DrawCheckmark(dc, rc, bSelected, bDisabled, bRadio, hBmpCheck);
}
BOOL DrawCheckmark(CDCHandle& dc, const RECT& rc, BOOL bSelected, BOOL bDisabled, BOOL bRadio, HBITMAP hBmpCheck)
{
// get checkmark bitmap, if none, use Windows standard
SIZE size = { 0, 0 };
CBitmapHandle bmp = hBmpCheck;
if(hBmpCheck != NULL)
{
bmp.GetSize(size);
}
else
{
size.cx = ::GetSystemMetrics(SM_CXMENUCHECK);
size.cy = ::GetSystemMetrics(SM_CYMENUCHECK);
bmp.CreateCompatibleBitmap(dc, size.cx, size.cy);
ATLASSERT(bmp.m_hBitmap != NULL);
}
// center bitmap in caller's rectangle
RECT rcDest = rc;
if((rc.right - rc.left) > size.cx)
{
rcDest.left = rc.left + (rc.right - rc.left - size.cx) / 2;
rcDest.right = rcDest.left + size.cx;
}
if((rc.bottom - rc.top) > size.cy)
{
rcDest.top = rc.top + (rc.bottom - rc.top - size.cy) / 2;
rcDest.bottom = rcDest.top + size.cy;
}
// paint background
if(!m_bFlatMenus && !bDisabled)
{
if(bSelected)
{
dc.FillRect(&rcDest, COLOR_MENU);
}
else
{
COLORREF clrTextOld = dc.SetTextColor(::GetSysColor(COLOR_BTNFACE));
COLORREF clrBkOld = dc.SetBkColor(::GetSysColor(COLOR_BTNHILIGHT));
CBrush hbr(CDCHandle::GetHalftoneBrush());
dc.SetBrushOrg(rcDest.left, rcDest.top);
dc.FillRect(&rcDest, hbr);
dc.SetTextColor(clrTextOld);
dc.SetBkColor(clrBkOld);
}
}
// create source image
CDC dcSource;
dcSource.CreateCompatibleDC(dc);
HBITMAP hBmpOld = dcSource.SelectBitmap(bmp);
// set colors
const COLORREF clrBlack = RGB(0, 0, 0);
const COLORREF clrWhite = RGB(255, 255, 255);
COLORREF clrTextOld = dc.SetTextColor(clrBlack);
COLORREF clrBkOld = dc.SetBkColor(clrWhite);
// create mask
CDC dcMask;
dcMask.CreateCompatibleDC(dc);
CBitmap bmpMask;
bmpMask.CreateBitmap(size.cx, size.cy, 1, 1, NULL);
HBITMAP hBmpOld1 = dcMask.SelectBitmap(bmpMask);
// draw the checkmark transparently
int cx = rcDest.right - rcDest.left;
int cy = rcDest.bottom - rcDest.top;
if(hBmpCheck != NULL)
{
// build mask based on transparent color
dcSource.SetBkColor(m_clrMask);
dcMask.SetBkColor(clrBlack);
dcMask.SetTextColor(clrWhite);
dcMask.BitBlt(0, 0, size.cx, size.cy, dcSource, 0, 0, SRCCOPY);
// draw bitmap using the mask
dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, SRCINVERT);
dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, SRCAND);
dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, SRCINVERT);
}
else
{
const DWORD ROP_DSno = 0x00BB0226L;
const DWORD ROP_DSa = 0x008800C6L;
const DWORD ROP_DSo = 0x00EE0086L;
const DWORD ROP_DSna = 0x00220326L;
// draw mask
RECT rcSource = { 0, 0, min(size.cx, rc.right - rc.left), min(size.cy, rc.bottom - rc.top) };
dcMask.DrawFrameControl(&rcSource, DFC_MENU, bRadio ? DFCS_MENUBULLET : DFCS_MENUCHECK);
// draw shadow if disabled
if(!m_bFlatMenus && bDisabled)
{
// offset by one pixel
int x = rcDest.left + 1;
int y = rcDest.top + 1;
// paint source bitmap
const int nColor = COLOR_3DHILIGHT;
dcSource.FillRect(&rcSource, nColor);
// draw checkmark - special case black and white colors
COLORREF clrCheck = ::GetSysColor(nColor);
if(clrCheck == clrWhite)
{
dc.BitBlt(x, y, cx, cy, dcMask, 0, 0, ROP_DSno);
dc.BitBlt(x, y, cx, cy, dcSource, 0, 0, ROP_DSa);
}
else
{
if(clrCheck != clrBlack)
{
ATLASSERT(dcSource.GetTextColor() == clrBlack);
ATLASSERT(dcSource.GetBkColor() == clrWhite);
dcSource.BitBlt(0, 0, size.cx, size.cy, dcMask, 0, 0, ROP_DSna);
}
dc.BitBlt(x, y, cx, cy, dcMask, 0, 0, ROP_DSa);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -