📄 coolmenu.cpp
字号:
void CMenuWndHook::UnInstallHook()
{
POSITION pos = m_WndMenuMap.GetStartPosition();
while (pos != NULL)
{
HWND hwnd;
CMenuWndHook* pMenuWndHook;
m_WndMenuMap.GetNextAssoc(pos, hwnd, pMenuWndHook);
delete pMenuWndHook;
pMenuWndHook = NULL;
}
m_WndMenuMap.RemoveAll();
if (m_hMenuHook != NULL)
{
::UnhookWindowsHookEx(m_hMenuHook);
}
}
CMenuWndHook* CMenuWndHook::GetWndHook(HWND hwnd)
{
CMenuWndHook* pWnd = NULL;
if (m_WndMenuMap.Lookup(hwnd, pWnd))
{
return pWnd;
}
return NULL;
}
CMenuWndHook* CMenuWndHook::AddWndHook(HWND hwnd)
{
CMenuWndHook* pWnd = NULL;
if (m_WndMenuMap.Lookup(hwnd, pWnd))
{
return pWnd;
}
pWnd = new CMenuWndHook(hwnd);
if (pWnd != NULL)
{
m_WndMenuMap.SetAt(hwnd, pWnd);
}
return pWnd;
}
/*########################################################################
------------------------------------------------
消息过程
------------------------------------------------
########################################################################*/
LRESULT CALLBACK CMenuWndHook::WindowHook(int code, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT* pStruct = (CWPSTRUCT*)lParam;
while (code == HC_ACTION)
{
HWND hWnd = pStruct->hwnd;
if (pStruct->message != WM_CREATE && pStruct->message != 0x01E2)
{
break;
}
// 是否为菜单类 ----------------------------------------
TCHAR strClassName[10];
int Count = ::GetClassName (hWnd, strClassName, sizeof(strClassName) / sizeof(strClassName[0]));
if (Count != 6 || _tcscmp(strClassName, _T("#32768")) != 0 )
{
break;
}
// 是否已经被子类化 ------------------------------------
if (::GetProp(pStruct->hwnd, CoolMenu_oldProc) != NULL )
{
break;
}
VERIFY(AddWndHook(pStruct->hwnd) != NULL);
// 取得原来的窗口过程 ----------------------------------
WNDPROC oldWndProc = (WNDPROC)(long)::GetWindowLong(pStruct->hwnd, GWL_WNDPROC);
if (oldWndProc == NULL)
{
break;
}
ASSERT(oldWndProc != CoolMenuProc);
// 保存到窗口的属性中 ----------------------------------
if (!SetProp(pStruct->hwnd, CoolMenu_oldProc, oldWndProc) )
{
break;
}
// 子类化 ----------------------------------------------
if (!SetWindowLong(pStruct->hwnd, GWL_WNDPROC,(DWORD)(ULONG)CoolMenuProc) )
{
::RemoveProp(pStruct->hwnd, CoolMenu_oldProc);
break;
}
break;
}
return CallNextHookEx (m_hMenuHook, code, wParam, lParam);
}
LRESULT CALLBACK CMenuWndHook::CoolMenuProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
WNDPROC oldWndProc = (WNDPROC)::GetProp(hWnd, CoolMenu_oldProc);
CMenuWndHook* pWnd = NULL;
switch (uMsg)
{
case WM_NCCALCSIZE:
{
LRESULT lResult = CallWindowProc(oldWndProc, hWnd, uMsg, wParam, lParam);
if ((pWnd = GetWndHook(hWnd)) != NULL)
{
pWnd->OnNcCalcsize((NCCALCSIZE_PARAMS*)lParam);
}
return lResult;
}
break;
case WM_WINDOWPOSCHANGING:
{
if ((pWnd = GetWndHook(hWnd)) != NULL)
{
pWnd->OnWindowPosChanging((LPWINDOWPOS)lParam);
}
}
break;
case WM_PRINT:
{
LRESULT lResult = CallWindowProc(oldWndProc, hWnd, uMsg, wParam, lParam);
if ((pWnd = GetWndHook(hWnd)) != NULL)
{
pWnd->OnPrint(CDC::FromHandle((HDC)wParam));
}
return lResult;
}
break;
case WM_NCPAINT:
{
if ((pWnd = GetWndHook(hWnd)) != NULL)
{
pWnd->OnNcPaint();
return 0;
}
}
break;
case WM_SHOWWINDOW:
{
if ((pWnd = GetWndHook(hWnd)) != NULL)
{
pWnd->OnShowWindow(wParam != NULL);
}
}
break;
case WM_NCDESTROY:
{
if ((pWnd = GetWndHook(hWnd)) != NULL)
{
pWnd->OnNcDestroy();
}
}
break;
}
return CallWindowProc(oldWndProc, hWnd, uMsg, wParam, lParam);
}
/*########################################################################
------------------------------------------------
消息处理函数
------------------------------------------------
########################################################################*/
void CMenuWndHook::OnWindowPosChanging(WINDOWPOS *pWindowPos)
{
if (!IsShadowEnabled())
{
pWindowPos->cx += 4;
pWindowPos->cy += 4;
}
pWindowPos->cx -= 2;
pWindowPos->cy -= 2;
pWindowPos->y--;
m_ptMenu.x = pWindowPos->x;
m_ptMenu.y = pWindowPos->y;
if (!IsWindowVisible(m_hWnd))
{
CRect rc;
GetClientRect(m_hWnd, &rc);
if (m_bmpBack.m_hObject != NULL )
{
m_bmpBack.DeleteObject();
}
m_bmpBack.Attach(GetScreenBitmap(CRect(m_ptMenu.x, m_ptMenu.y, rc.right + m_ptMenu.x + 10,
rc.bottom + m_ptMenu.y + 10)));
}
}
void CMenuWndHook::OnNcPaint()
{
CWindowDC dc(CWnd::FromHandle(m_hWnd));
OnPrint(&dc);
}
void CMenuWndHook::OnPrint(CDC *pDC)
{
CRect rc;
GetWindowRect(m_hWnd, &rc);
rc.OffsetRect(-rc.TopLeft());
if (rc != m_rcMenu)
{
m_rcMenu = rc;
if (!IsShadowEnabled())
{
CDC cMemDC;
cMemDC.CreateCompatibleDC (pDC);
HGDIOBJ hOldBitmap = ::SelectObject (cMemDC.m_hDC, m_bmpBack);
pDC->BitBlt (0, rc.bottom - 4, rc.Width() - 4, 4, &cMemDC, 0, rc.bottom - 4, SRCCOPY);
pDC->BitBlt (rc.right - 4, 0, 4, rc.Height(), &cMemDC, rc.right - 4, 0, SRCCOPY);
DrawShadow(pDC, rc);
rc.right -= 4;
rc.bottom -= 4;
}
pDC->Draw3dRect(rc, m_crFrame[0], m_crFrame[1]);
rc.DeflateRect (1, 1);
pDC->Draw3dRect(rc, m_crFrame[2], m_crFrame[3]);
#if defined(_ANYOU_COOLMENU_H)
if (CCoolMenu::m_rcMenuItem.bottom == (m_ptMenu.y + 1) && CCoolMenu::m_rcMenuItem.Width() > 0)
{
CPen pen(0, 1, ::GetSysColor(COLOR_3DFACE));
CPen *oldpen = pDC->SelectObject(&pen);
pDC->MoveTo(m_rcMenu.left + 1, m_rcMenu.top);
pDC->LineTo(CCoolMenu::m_rcMenuItem.Width() - 5, m_rcMenu.top);
pDC->SelectObject(oldpen);
}
#endif
}
}
void CMenuWndHook::OnNcDestroy()
{
delete this;
}
void CMenuWndHook::OnShowWindow(BOOL bShow)
{
if (!bShow)
{
delete this;
}
}
void CMenuWndHook::OnNcCalcsize(NCCALCSIZE_PARAMS* lpncsp)
{
if (!IsShadowEnabled())
{
lpncsp->rgrc[0].right -= 4;
lpncsp->rgrc[0].bottom -= 4;
}
lpncsp->rgrc[0].top -= 1;
lpncsp->rgrc[0].left -= 1;
lpncsp->rgrc[0].right += 1;
lpncsp->rgrc[0].bottom += 1;
}
CCoolMenuTheme::CCoolMenuTheme()
{
}
CCoolMenuTheme::~CCoolMenuTheme()
{
}
/*========================================================================
功能: 设置菜单预置风格
----------------------------------------------------------
dwstyle: 风格名,只能是以下值之一:
-------------------------------------------
- MENU_STYLE_DEFAULT: 默认风格
- MENU_STYLE_XP: Office XP 风格
- MENU_STYLE_XP2: 另一种 Office XP 风格
- MENU_STYLE_SNOW: 白色风格
- MENU_STYLE_GREEN: 绿色风格
- MENU_STYLE_BLUE: 蓝色风格
- ... ...
----------------------------------------------------------
说明: 可以在这个函数里添加代码,添加更多的自定义
风格,以便在使用菜单时,可以很快地切换成想要的菜单
风格。
==========================================================================*/
void CCoolMenuTheme::SetTheme(DWORD dwstyle)
{
if (dwstyle == MENU_STYLE_DEFAULT)
{
CCoolMenu::SetStyle(CCoolMenu::GetStyle() & ~CMS_ICONBAR);
CCoolMenu::SetMenuColor(::GetSysColor(COLOR_MENU));
CCoolMenu::SetIconBarColor(::GetSysColor(COLOR_3DFACE));
CCoolMenu::SetLightBarColor(RGB(10, 36, 106));
CCoolMenu::SetLightBarStartColor(RGB(10, 36, 106));
CCoolMenu::SetLightBarEndColor(RGB(10, 36, 106));
CCoolMenu::SetTextColor(::GetSysColor(COLOR_MENUTEXT));
CCoolMenu::SetHighLightColor(RGB(255, 255, 255));
CMenuWndHook::m_crFrame[0] = RGB(148, 150, 148);
CMenuWndHook::m_crFrame[1] = RGB(48, 50, 48);
CMenuWndHook::m_crFrame[2] = RGB(255, 255, 255);
CMenuWndHook::m_crFrame[3] = RGB(180, 180, 180);
}
else if (dwstyle == MENU_STYLE_XP)
{
CCoolMenu::SetStyle(CCoolMenu::GetStyle() | CMS_ICONBAR);
CCoolMenu::SetMenuColor(RGB(255,255,255));
CCoolMenu::SetIconBarColor(::GetSysColor(COLOR_3DFACE));
CCoolMenu::SetLightBarColor(RGB(155,155,185));
CCoolMenu::SetLightBarStartColor(RGB(234, 240, 250));
CCoolMenu::SetLightBarEndColor(RGB(196, 212, 239));
CCoolMenu::SetTextColor(::GetSysColor(COLOR_MENUTEXT));
CCoolMenu::SetHighLightColor(RGB(20, 20, 50));
CMenuWndHook::m_crFrame[0] = RGB(48, 50, 48);
CMenuWndHook::m_crFrame[1] = RGB(48, 50, 48);
CMenuWndHook::m_crFrame[2] = RGB(255, 255, 255);
CMenuWndHook::m_crFrame[3] = RGB(255, 255, 255);
}
else if (dwstyle == MENU_STYLE_SNOW)
{
CCoolMenu::SetStyle(CCoolMenu::GetStyle() & ~CMS_ICONBAR);
CCoolMenu::SetMenuColor(RGB(255,255,255));
CCoolMenu::SetIconBarColor(::GetSysColor(COLOR_3DFACE));
CCoolMenu::SetLightBarColor(RGB(155,155,185));
CCoolMenu::SetLightBarStartColor(RGB(234, 240, 250));
CCoolMenu::SetLightBarEndColor(RGB(196, 212, 239));
CCoolMenu::SetTextColor(RGB(0, 0, 0));
CCoolMenu::SetHighLightColor(RGB(0, 0, 0));
CMenuWndHook::m_crFrame[0] = RGB(48, 50, 48);
CMenuWndHook::m_crFrame[1] = RGB(48, 50, 48);
CMenuWndHook::m_crFrame[2] = RGB(255, 255, 255);
CMenuWndHook::m_crFrame[3] = RGB(255, 255, 255);
}
else if (dwstyle == MENU_STYLE_GREEN)
{
CCoolMenu::SetStyle(CCoolMenu::GetStyle() & ~CMS_ICONBAR);
CCoolMenu::SetMenuColor(RGB(220,235,220));
CCoolMenu::SetIconBarColor(::GetSysColor(COLOR_3DFACE));
CCoolMenu::SetLightBarColor(RGB(155,185,155));
CCoolMenu::SetLightBarStartColor(RGB(240, 250, 234));
CCoolMenu::SetLightBarEndColor(RGB(212, 239, 196));
CCoolMenu::SetTextColor(RGB(10, 80, 10));
CCoolMenu::SetHighLightColor(RGB(20, 20, 50));
CMenuWndHook::m_crFrame[0] = RGB(128, 150, 128);
CMenuWndHook::m_crFrame[1] = RGB(48, 50, 48);
CMenuWndHook::m_crFrame[2] = RGB(255, 255, 255);
CMenuWndHook::m_crFrame[3] = RGB(168, 210, 168);
}
else if (dwstyle == MENU_STYLE_BLUE)
{
CCoolMenu::SetStyle(CCoolMenu::GetStyle() & ~CMS_ICONBAR);
CCoolMenu::SetMenuColor(RGB(225,225,235));
CCoolMenu::SetIconBarColor(::GetSysColor(COLOR_3DFACE));
CCoolMenu::SetLightBarColor(RGB(155,155,185));
CCoolMenu::SetLightBarStartColor(RGB(234, 240, 250));
CCoolMenu::SetLightBarEndColor(RGB(196, 212, 239));
CCoolMenu::SetTextColor(RGB(10, 10, 80));
CCoolMenu::SetHighLightColor(RGB(20, 20, 50));
CMenuWndHook::m_crFrame[0] = RGB(120, 120, 158);
CMenuWndHook::m_crFrame[1] = RGB(48, 50, 48);
CMenuWndHook::m_crFrame[2] = RGB(255, 255, 255);
CMenuWndHook::m_crFrame[3] = RGB(168, 168, 210);
}
else if (dwstyle == MENU_STYLE_XP2)
{
CCoolMenu::SetStyle(CCoolMenu::GetStyle() | CMS_ICONBAR);
CCoolMenu::SetMenuColor(::GetSysColor(COLOR_3DFACE));
CCoolMenu::SetIconBarColor(RGB(255,255,255));
CCoolMenu::SetLightBarColor(RGB(155,155,185));
CCoolMenu::SetLightBarStartColor(RGB(234, 240, 250));
CCoolMenu::SetLightBarEndColor(RGB(196, 212, 239));
CCoolMenu::SetTextColor(::GetSysColor(COLOR_MENUTEXT));
CCoolMenu::SetHighLightColor(RGB(20, 20, 50));
CMenuWndHook::m_crFrame[0] = RGB(48, 50, 48);
CMenuWndHook::m_crFrame[1] = RGB(48, 50, 48);
CMenuWndHook::m_crFrame[2] = RGB(255, 255, 255);
CMenuWndHook::m_crFrame[3] = RGB(255, 255, 255);
}
CCoolMenu::InitImageList();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -