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

📄 skinmenu.cpp

📁 WMI接口测试Demo程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		mapColors[crSrc] = 1;
	}

	// 2. replace other mapped colors 
	int nColor = sizeof(colors) / sizeof(colorMapping);
	
	while (nColor--)
	{
		int nTemp;
		int nSrcColor = colors[nColor].nSrcColor;
		crSrc = GetSysColor(nSrcColor);
		
		if (mapColors.Lookup(crSrc, nTemp))
		{
//			TRACE("CSkinMenu::ReplaceSystemColors - %d already replaced\n", crSrc);
			continue;
		}

		int nDestColor = colors[nColor].nDestColor;
		crDest = GetColor(nDestColor);

		// if the dest color is COLORMENU let the user have first go
		if (crDest == COLORMENU && s_pRenderer && s_pRenderer->DrawMenuClientBkgnd(pDCDest, pRect, pClip))
		{
			// transparent blt
			CSkinBase::BitBlt(pDCDest, pRect->left, pRect->top, 
						pRect->right - pRect->left, 
						pRect->bottom - pRect->top, pDCSrc, 0, 0, SRCCOPY, crSrc);

			// swap dest and src
			SwapDCs(pDCSrc, pDCDest);
		}
		// else simple color replacement
		else if (ReplaceColor(pDCSrc, crSrc, pDCDest, crDest, pRect, pClip))
		{		
			// swap dest and src
			SwapDCs(pDCSrc, pDCDest);
		}
//		else
//			TRACE("CSkinMenu::ReplaceSystemColors - GetSysColor(%d) == CSkinBase::GetColor(%d)\n", nSrcColor, nDestColor);
		
		mapColors[crSrc] = 1;
	}

	return pDCSrc;
}

BOOL CSkinMenu::ReplaceColor(CDC* pDCSrc, COLORREF crSrc, CDC* pDCDest, COLORREF crDest, LPRECT pRect, LPRECT pClip)
{
	if (crSrc == crDest)
		return FALSE;
	
	// else
	if (pClip)
	{
		pDCDest->FillSolidRect(pClip, crDest);
		CSkinBase::BitBlt(pDCDest, pClip->left, pClip->top, pClip->right - pClip->left, 
						pClip->bottom - pClip->top, pDCSrc, pClip->left, pClip->top, SRCCOPY, crSrc);
	}
	else
	{
		pDCDest->FillSolidRect(pRect, crDest);
		CSkinBase::BitBlt(pDCDest, pRect->left, pRect->top, pRect->right - pRect->left, 
						pRect->bottom - pRect->top, pDCSrc, pRect->left, pRect->top, SRCCOPY, crSrc);
	}

	return TRUE;
}

void CSkinMenu::OnPrintClient(CDC* pDC, DWORD dwFlags)
{
	CRect rClient;
	GetClientRect(rClient);

	CRect rClip(rClient);
//	pDC->GetClipBox(rClip);

	// create standard back buffer and another dc on which 
	// to layer the background and foreground
	CDC dcMem, dcMem2;
	dcMem.CreateCompatibleDC(NULL);
	dcMem2.CreateCompatibleDC(NULL);
	
	// use screen dc for creating bitmaps because
	// menu dc's seem not to be standard.
	CDC* pDCScrn = CWnd::GetDesktopWindow()->GetDC();
	
	CBitmap bmMem, bmMem2;
	bmMem.CreateCompatibleBitmap(pDCScrn, rClient.right, rClient.bottom);
	bmMem2.CreateCompatibleBitmap(pDCScrn, rClient.right, rClient.bottom);

	// release screen dc asap
	CWnd::GetDesktopWindow()->ReleaseDC(pDCScrn);
	
	// prepare dc's
	dcMem.SetBkMode(TRANSPARENT);
	dcMem.SetBkColor(GetSysColor(COLOR_MENU));

	CBitmap* pOldBM = dcMem.SelectObject(&bmMem);
	CFont* pOldFont = dcMem.SelectObject(GetFont(SBFONT_MENU));
	CBitmap* pOldBM2 = dcMem2.SelectObject(&bmMem2);

	// trim clip rgn
	if (rClip.top)
		dcMem.ExcludeClipRect(0, 0, rClient.right, rClip.top);

	if (rClip.bottom < rClient.bottom)
		dcMem.ExcludeClipRect(0, rClip.bottom, rClient.right, rClient.bottom);

	// draw background
//	dcMem.FillSolidRect(rClient, GetSysColor(COLOR_MENU));
	dcMem.FillSolidRect(rClip, GetSysColor(COLOR_MENU));

	// default draw
	CSubclassWnd::WindowProc(*this, WM_PRINTCLIENT, (WPARAM)(HDC)dcMem, (LPARAM)dwFlags);
	
	// replace the system colors with skin colors
	CDC* pDCSrc = ReplaceSystemColors(&dcMem, &dcMem2, rClient, rClip);
	
	// blt the lot to pDC
//	pDC->BitBlt(0, 0, rClient.right, rClient.bottom, pDCSrc, 0, 0, SRCCOPY);
	pDC->BitBlt(rClip.left, rClip.top, rClip.Width(), rClip.Height(), 
				pDCSrc, rClip.left, rClip.top, SRCCOPY);
	
	// cleanup
	dcMem.SelectObject(pOldBM);
	dcMem.SelectObject(pOldFont);
	dcMem.DeleteDC();
	bmMem.DeleteObject();
	
	dcMem2.SelectObject(pOldBM2);
	dcMem2.DeleteDC();
	bmMem2.DeleteObject();
}

void CSkinMenu::OnPaint(CDC* pDC)
{
	// construct a back buffer for the default draw
	CRect rClient;
	GetClientRect(rClient);
	
	CBitmap bmMem;
	bmMem.CreateCompatibleBitmap(pDC, rClient.right, rClient.bottom);
	
	CDC dcMem;
	dcMem.CreateCompatibleDC(NULL);
	
	dcMem.SetBkMode(TRANSPARENT);
	dcMem.SetBkColor(GetSysColor(COLOR_MENU));
	CBitmap* pOldBM = dcMem.SelectObject(&bmMem);
	CFont* pOldFont = dcMem.SelectObject(GetFont(SBFONT_MENU));
	
	// draw background
	dcMem.FillSolidRect(rClient, GetSysColor(COLOR_MENU));
	
	// default draw
	CWnd* pWnd = *this;
	CSubclassWnd::WindowProc(pWnd, WM_PAINT, (WPARAM)(HDC)dcMem, 0);
	
	// create another dc on which to layer the background and foreground
	CDC dcMem2;
	dcMem2.CreateCompatibleDC(NULL);
	
	CBitmap bmMem2;
	bmMem2.CreateCompatibleBitmap(pDC, rClient.right, rClient.bottom);
	CBitmap* pOldBM2 = dcMem2.SelectObject(&bmMem2);
	
	// replace the system colors with skin colors
	CDC* pDCSrc = ReplaceSystemColors(&dcMem, &dcMem2, rClient, NULL);
	
	// blt the lot to pDC
	pDC->BitBlt(0, 0, rClient.right, rClient.bottom, pDCSrc, 0, 0, SRCCOPY);
	
	// cleanup
	dcMem.SelectObject(pOldBM);
	dcMem.SelectObject(pOldFont);
	dcMem.DeleteDC();
	bmMem.DeleteObject();
	
	dcMem2.SelectObject(pOldBM2);
	dcMem2.DeleteDC();
	bmMem2.DeleteObject();
}

void CSkinMenu::OnNcPaint(CDC* pDC)
{
	int nOS = CSkinBase::GetOS();

	BOOL bIRender = !(nOS == SBOS_95 || nOS == SBOS_NT4);

	CRect rWindow, rClient;
	GetDrawRect(rWindow, rClient);

	CRect rClip;
	pDC->GetClipBox(rClip);

//	TRACE ("CSkinMenu::OnNcPaint(clip box = {%d x %d})\n", rClip.Width(), rClip.Height());

	// back buffer
	CBitmap bmMem;
	bmMem.CreateCompatibleBitmap(pDC, rWindow.right, rWindow.bottom);
	
	CDC dcMem;
	dcMem.CreateCompatibleDC(NULL);
	
	CBitmap* pOldBM = dcMem.SelectObject(&bmMem);
	
	COLORREF crColorMenu = GetColor(COLOR_MENU);

	// draw sidebar
	CRect rSidebar(rWindow);
	rSidebar.DeflateRect(3, 3);
	rSidebar.right = rSidebar.left + m_nSidebarWidth;
		
	if (Sidebar() && (!s_pRenderer || !s_pRenderer->DrawMenuSidebar(&dcMem, rSidebar)))
	{
		dcMem.FillSolidRect(rSidebar, CSkinBase::VaryColor(GetColor(COLOR_3DSHADOW), 0.9f));
	}

	// then clip sidebar out
	dcMem.ExcludeClipRect(rSidebar);

	// draw nc bkgnd
	// note: do this ourselves under win95 to ensure continuity with client bkgnd
	if (!bIRender || !s_pRenderer || !s_pRenderer->DrawMenuNonClientBkgnd(&dcMem, rWindow))
	{
		dcMem.FillSolidRect(rWindow, crColorMenu);
	}

	// draw nc border
	if (!bIRender || !s_pRenderer || !s_pRenderer->DrawMenuBorder(&dcMem, rWindow))
	{
		COLORREF crShadow = GetColor(COLOR_3DSHADOW);

		if (Flat())
			dcMem.Draw3dRect(rWindow, crShadow, crShadow);
		else
			dcMem.Draw3dRect(rWindow, GetColor(COLOR_3DHIGHLIGHT), crShadow);
	}

	// blt to screen
	int nSaveDC = pDC->SaveDC(); // must restore dc to original state

	pDC->ExcludeClipRect(rClient);
	pDC->BitBlt(0, 0, rWindow.right, rWindow.bottom, &dcMem, 0, 0, SRCCOPY);

	pDC->RestoreDC(nSaveDC);

	// cleanup
	dcMem.SelectObject(pOldBM);
}

void CSkinMenu::GetDrawRect(LPRECT pWindow, LPRECT pClient)
{
	CRect rWindow;
	GetWindowRect(rWindow);
	
	if (pClient)
	{
		GetClientRect(pClient);
		GetHookedWnd()->ClientToScreen(pClient);
		::OffsetRect(pClient, -rWindow.left, -rWindow.top);
	}
	
	if (pWindow)
	{
		rWindow.OffsetRect(-rWindow.TopLeft());
		*pWindow = rWindow;
	}
}

COLORREF CSkinMenu::GetColor(int nColor)
{
	return m_pGlobals ? m_pGlobals->GetColor(nColor) : CSkinGlobals::GetColorSt(nColor);
}

CFont* CSkinMenu::GetFont(int nFont)
{
	return m_pGlobals ? m_pGlobals->GetFont(nFont) : CSkinGlobals::GetFontSt(nFont);
}

void CSkinMenu::SetContextWnd(HWND hWnd) 
{ 
	if (hWnd && ::IsWindow(hWnd))
		m_hContextWnd = hWnd;
	else
		m_hContextWnd = NULL; 
}

void CSkinMenu::SetMenu(HMENU hMenu, CSkinMenu* pParentMenu) 
{ 
	if (m_hMenu && hMenu) // already set
		return;
	
	// else
	if (hMenu && ::IsMenu(hMenu)) 
		m_hMenu = hMenu;
	else
		m_hMenu = NULL; 

	TRACE("CSkinMenu::SetMenu(hwnd = %08x, hmenu = %08x)\n", m_hWndHooked, hMenu);

	m_pParentMenu = pParentMenu;
}

void CSkinMenu::GetInvalidRect(int nCurSel, int nPrevSel, LPRECT lpRect)
{
	ASSERT (lpRect);

	if (!m_hMenu || nCurSel == REDRAWALL || nPrevSel == REDRAWALL)
		GetClientRect(lpRect);

	else if (m_hMenu)
	{
		::SetRectEmpty(lpRect);

		if (nCurSel >= 0 || nPrevSel >= 0)
		{
			if (nCurSel >= 0)
			{
				GetMenuItemRect(NULL, m_hMenu, nCurSel, lpRect);
			}
					
			if (nPrevSel >= 0)
			{
				CRect rTemp;
			
				GetMenuItemRect(NULL, m_hMenu, nPrevSel, rTemp);
				::UnionRect(lpRect, lpRect, rTemp);
			}

			// convert to client coords
			GetHookedWnd()->ScreenToClient(lpRect);
		}
	}
}

int CSkinMenu::GetCurSel()
{
	ASSERT (m_hMenu);
	int nItem = GetMenuItemCount(m_hMenu);
	
	while (nItem--)
	{
		if (GetMenuState(m_hMenu, nItem, MF_BYPOSITION) & MF_HILITE)
			return nItem;
	}

	return -1; // nothing selected
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -