⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coolmenu.cpp

📁 (VC)又一个酒店管理系统, (VC)又一个酒店管理系统,(VC)又一个酒店管理系统
💻 CPP
📖 第 1 页 / 共 4 页
字号:
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 + -