📄 coolmenu.cpp
字号:
}
}
//绘制图标-------------------------------------
if (bIsGrayed)
{
m_iDisabledImageList.Draw(pDC, nIndex, CPoint(rc.left, rc.top), ILD_TRANSPARENT);
}
else if(bIsSelected)
{
m_iHotImageList.Draw(pDC, nIndex, CPoint(rc.left, rc.top), ILD_TRANSPARENT);
}
else
{
m_iImageList.Draw(pDC, nIndex, CPoint(rc.left, rc.top), ILD_TRANSPARENT);
}
}
//如果没有图标---------------------------------------
else
{
// 绘制Check标志-------------------------
if(bIsChecked)
{
rc.InflateRect(-1, 0, 0, -1);
if(bIsSelected)
{
pDC->FillSolidRect(rc,RGB(255,255,255));
pDC->Draw3dRect(rc, RGB(160,170,210), RGB(160,170,210));
}
else
{
pDC->FillSolidRect(rc,RGB(235,235,235));
pDC->Draw3dRect(rc, RGB(160,170,210), RGB(160,170,210));
}
//画勾号----------------------------
pDC->MoveTo(rc.left + 4, rc.top + 6);
pDC->LineTo(rc.left + 6, rc.top + 8);
pDC->LineTo(rc.left + 11, rc.top + 3);
pDC->MoveTo(rc.left + 4, rc.top + 7);
pDC->LineTo(rc.left + 6, rc.top + 9);
pDC->LineTo(rc.left + 11, rc.top + 4);
}
}
//---------结束绘制图标或Check标志>>>
}
//扫尾工作-------------------------------------------
pdc->BitBlt(rect.left + nMenuLogoBarcx, rect.top, rect.Width() - nMenuLogoBarcx, rect.Height(),
pDC, rect.left + nMenuLogoBarcx, rect.top, SRCCOPY);
pDC->SelectObject(&oldfont);
pDC->SelectObject(oldbitmap);
if (pDC != NULL) delete pDC;
if (bitmap != NULL) delete bitmap;
}
void CCoolMenu::DrawMenuBar(CDC *pDC, CRect rect)
{
rect.right -= 4;
// pDC->FillSolidRect(rect, m_crIconBarColor);
pDC->Draw3dRect(rect, ::GetSysColor(COLOR_3DDKSHADOW), ::GetSysColor(COLOR_3DDKSHADOW));
//Draw shadow----------------------------------------->>
COLORREF oldcolor = ::GetSysColor(COLOR_3DFACE);
BYTE AlphaArray[] ={90,210, 222, 240};
for (int i = 0; i < 4; i++)
{
BYTE newR = GetRValue(oldcolor) * AlphaArray[i] / 255;
BYTE newG = GetGValue(oldcolor) * AlphaArray[i] / 255;
BYTE newB = GetBValue(oldcolor) * AlphaArray[i] / 255;
CPen pen(0, 1, RGB(newR, newG, newB));
CPen *oldpen = pDC->SelectObject(&pen);
pDC->MoveTo(rect.right + i, rect.top + i + 3);
pDC->LineTo(rect.right + i, rect.bottom );
pDC->SelectObject(oldpen);
}
}
/*========================================================================
功能: 绘制光标条
-----------------------------------------
rect: 绘制范围
==========================================================================*/
void CCoolMenu::DrawLightBar(CDC *pDC, CRect rect, BOOL bfill)
{
if (bfill)
{
//绘制渐变色----------------------------------------
FillGradient(pDC, rect, m_crLightBarStartColor, m_crLightBarEndColor);
// DrawGradsRect(pDC,rect,m_crLightBarStartColor,m_crLightBarEndColor);
}
pDC->Draw3dRect(rect, m_crLightBarColor, m_crLightBarColor);
}
/*========================================================================
功能: 绘制LOGO栏
--------------------------------------------
pDC: 设备上下文
rect: 绘制范围
==========================================================================*/
void CCoolMenu::DrawLogoBar(CDC *pDC, CRect rect)
{
if (m_szMenuLogo.cx > 0)
{
//如果设置了LOGO图片------------------------------------
if(m_uLogoBmpID != NULL)
{
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap bitmap, *oldbitmap;
bitmap.LoadBitmap(m_uLogoBmpID);
if (bitmap.GetSafeHandle() != NULL)
{
oldbitmap = memDC.SelectObject(&bitmap);
pDC->BitBlt(rect.left, rect.bottom-m_szMenuLogo.cy, m_szMenuLogo.cx, m_szMenuLogo.cy,
&memDC, 0, 0, SRCCOPY);
memDC.SelectObject(oldbitmap);
bitmap.DeleteObject();
memDC.DeleteDC();
//如果图片比要填充的矩形小,则继续用此图片填充剩下的矩形,直到填满为止----------
if(rect.Height() > m_szMenuLogo.cy) DrawLogoBar(pDC, CRect(0, 0, rect.right, (rect.Height() - m_szMenuLogo.cy)));
}
}
//如果没有设置LOGO图片,则以渐变色和LOGO字串绘制LOGO栏--
else
{
//绘制渐变色--------------------------------
FillGradient(pDC, rect, RGB(90, 90, 90), m_crLogoColor);
//绘制LOGO字串---------------------------------
CFont vertFont;
vertFont.CreateFont(14, 0, 900, 900, FW_BOLD,
0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH, "Arial");
CFont *pOldFont = pDC->SelectObject(&vertFont);
pDC->SetTextColor(RGB(255, 255, 255));
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(rect.left+3, rect.bottom-4, m_sLogoText);
pDC->SelectObject(pOldFont);
vertFont.DeleteObject();
}
}
}
/*########################################################################
-----------------------
设置菜单LOGO栏
-----------------------
########################################################################*/
/*========================================================================
功能: 设置LOGO字串及背景渐变色
==========================================================================*/
void CCoolMenu::SetLogoText(CString strText, COLORREF color)
{
m_sLogoText = strText;
m_crLogoColor = color;
m_szMenuLogo.cx = 20;
}
/*========================================================================
功能: 设置LOGO图片
--------------------------------------------
uID: LOGO图片ID
width: LOGO栏宽度,如果为0,则把图片的宽度作为LGOG栏宽度
==========================================================================*/
BOOL CCoolMenu::SetLogoImage(UINT uBitmapID, int nwidth)
{
if (uBitmapID == NULL)
{
m_uLogoBmpID = 0;
return FALSE;
}
CBitmap bitmap;
bitmap.LoadBitmap(uBitmapID);
if(bitmap.GetSafeHandle() != NULL)
{
BITMAP bm;
bitmap.GetBitmap(&bm);
if (nwidth == 0) m_szMenuLogo.cx = bm.bmWidth;
else m_szMenuLogo.cx = nwidth;
m_szMenuLogo.cy = bm.bmHeight;
m_uLogoBmpID = uBitmapID;
bitmap.DeleteObject();
}
else
{
m_uLogoBmpID = 0;
m_szMenuLogo = CSize(0, 0);
}
return TRUE;
}
/*########################################################################
-----------------------
设置菜单图像列表
-----------------------
########################################################################*/
/*========================================================================
功能: 设置菜单图像列表.
------------------------------------------------------------
uToolBarID: 对应用来提取命令ID工具栏资源的ID.
uBitmapID: 图像资源ID.
bAlpha: 是否有alpha通道.
==========================================================================*/
int CCoolMenu::SetImageList(UINT uToolBarID, UINT uBitmapID, BOOL bAlpha)
{
if (uToolBarID != NULL)
{
if (uBitmapID == NULL)
{
m_uBitmapID = uToolBarID;
m_crMarkColor = RGB(192, 192, 192);
}
else
{
m_uBitmapID = uBitmapID;
m_crMarkColor = RGB(255, 0, 255);
}
if (bAlpha)
{
m_dwStyle |= CMS_32IMAGELIST;
}
else
{
m_dwStyle &= ~CMS_32IMAGELIST;
}
InitImageList();
m_uIDArray.RemoveAll();
return GetIDFromToolBar(uToolBarID, &m_uIDArray);
}
return -1;
}
/*========================================================================
功能: 初始化图像列表
==========================================================================*/
BOOL CCoolMenu::InitImageList()
{
CBitmap bitmap, tempbitmap;
CSize szIcon(16, 16);
bitmap.LoadBitmap(m_uBitmapID);
if (bitmap.GetSafeHandle() == NULL)
{
return FALSE;
}
m_iImageList.DeleteImageList();
m_iHotImageList.DeleteImageList();
m_iDisabledImageList.DeleteImageList();
m_iImageList.Create(szIcon.cx, szIcon.cy, ILC_COLOR24 | ILC_MASK, 16, 16);
m_iHotImageList.Create(szIcon.cx, szIcon.cy, ILC_COLOR24 | ILC_MASK, 16, 16);
m_iDisabledImageList.Create(szIcon.cx, szIcon.cy, ILC_COLOR24 |ILC_MASK, 16, 16);
BOOL bAlpha = ((GetStyle() & CMS_32IMAGELIST) == CMS_32IMAGELIST);
//创建正常图像列表----------------------------------------
HBITMAP bm = NULL;
if ((GetStyle() & CMS_ICONBAR) == 0)
{
bm =CCoolMenu::CreateImage(HBITMAP(bitmap), 1, bAlpha, m_crMenuColor, m_crMarkColor);
}
else
{
bm = CCoolMenu::CreateImage(HBITMAP(bitmap), 1, bAlpha, m_crIconBarColor, m_crMarkColor);
}
tempbitmap.Attach(bm);
m_iImageList.Add(&tempbitmap, RGB(255, 0, 255));
//创建禁止图像列表----------------------------------------
tempbitmap.DeleteObject();
if (GetStyle() & CMS_ICONBAR == 0)
{
bm = CCoolMenu::CreateImage(HBITMAP(bitmap), 0, bAlpha, m_crMenuColor, m_crMarkColor);
}
else
{
bm = CCoolMenu::CreateImage(HBITMAP(bitmap), 0, bAlpha, m_crIconBarColor, m_crMarkColor);
}
tempbitmap.Attach(bm);
m_iDisabledImageList.Add(&tempbitmap, RGB(255, 0, 255));
//创建热图像列表----------------------------------------
tempbitmap.DeleteObject();
bm = CCoolMenu::CreateImage(HBITMAP(bitmap), 2, bAlpha, m_crLightBarStartColor, m_crMarkColor);
tempbitmap.Attach(bm);
m_iHotImageList.Add(&tempbitmap, RGB(255, 0, 255));
bitmap.DeleteObject();
return TRUE;
}
/*========================================================================
功能: 从工具栏资源中提取命令ID
---------------------------------------------
uToolBarID: 工具栏资源ID
uIDArray: 用于存贮ID列表的数组指针
==========================================================================*/
int CCoolMenu::GetIDFromToolBar(UINT uToolBarID, CUIntArray *uIDArray)
{
if (uToolBarID <= 0 || uIDArray == NULL) return -1;
struct CToolBarData
{
WORD wVersion;
WORD wWidth;
WORD wHeight;
WORD wItemCount;
WORD* items()
{
return (WORD*)(this + 1);
}
};
ASSERT(MAKEINTRESOURCE(uToolBarID) != NULL);
HINSTANCE hInst = AfxFindResourceHandle(MAKEINTRESOURCE(uToolBarID), RT_TOOLBAR);
HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(uToolBarID), RT_TOOLBAR);
if (hRsrc == NULL)
{
return -1;
}
HGLOBAL hGlobal = LoadResource(hInst, hRsrc);
if (hGlobal == NULL)
{
return -1;
}
CToolBarData* pData = (CToolBarData*)LockResource(hGlobal);
if (pData == NULL)
{
return -1;
}
ASSERT(pData->wVersion == 1);
UINT uID;
for (int i = 0; i < pData->wItemCount; i++)
{
uID = pData->items()[i];
if (uID != ID_SEPARATOR)
{
uIDArray->Add(uID);
}
}
UnlockResource(hGlobal);
FreeResource(hGlobal);
return uIDArray->GetSize();
}
/*########################################################################
------------------------------------------------
class CMenuWndHook
------------------------------------------------
########################################################################*/
CMap <HWND, HWND, CMenuWndHook*, CMenuWndHook*> CMenuWndHook::m_WndMenuMap;
HHOOK CMenuWndHook::m_hMenuHook = NULL;
COLORREF CMenuWndHook::m_crFrame[4] = {::GetSysColor(COLOR_3DDKSHADOW), ::GetSysColor(COLOR_3DDKSHADOW), ::GetSysColor(COLOR_WINDOW), ::GetSysColor(COLOR_WINDOW)};
CMenuWndHook::CMenuWndHook (HWND hWnd)
: m_hWnd(hWnd), m_rcMenu(0, 0, 0, 0), m_ptMenu(-0xFFFF, -0xFFFF)
{
}
CMenuWndHook::~CMenuWndHook ()
{
WNDPROC oldWndProc = (WNDPROC)::GetProp(m_hWnd, CoolMenu_oldProc);
if (oldWndProc != NULL)
{
::SetWindowLong(m_hWnd, GWL_WNDPROC, (DWORD)(ULONG)oldWndProc);
::RemoveProp(m_hWnd, CoolMenu_oldProc);
}
m_WndMenuMap.RemoveKey(m_hWnd);
}
void CMenuWndHook::InstallHook()
{
if (m_hMenuHook == NULL )
{
m_hMenuHook = ::SetWindowsHookEx(WH_CALLWNDPROC, WindowHook,
AfxGetApp()->m_hInstance, ::GetCurrentThreadId());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -