themed.cpp

来自「管理项目进度工具的原代码」· C++ 代码 · 共 616 行 · 第 1/2 页

CPP
616
字号
	COLORREF color;
	
	if (GetThemeColor(nPart, nState, nProp, &color))
		return color;

	return 0; // black
}

BOOL CThemed::GetThemeBackgroundContentRect(CDC* pDC, int nPart, int nState, const CRect& rBounding, CRect& rContent)
{
	ASSERT (m_hTheme);
	ASSERT_VALID (pDC);

	return GetThemeBackgroundContentRect(pDC->GetSafeHdc(), nPart, nState, rBounding, rContent);
}

// -----------------------------------------------------------------------------------------------------------

BOOL CThemed::IsThemeActive()
{
	if (s_hUxTheme)
	{
		PFNISTHEMEACTIVE fnIsThemeActive = (PFNISTHEMEACTIVE)GetProcAddress(s_hUxTheme, "IsThemeActive");
		
		if (fnIsThemeActive)
			return fnIsThemeActive();
	}
	
	return FALSE;
}

DWORD CThemed::GetAppThemeProperties()
{
	if (s_hUxTheme)
	{
		PFNGETTHEMEAPPPROPERTIES fnGetThemeAppProperties = (PFNGETTHEMEAPPPROPERTIES)GetProcAddress(s_hUxTheme, "GetThemeAppProperties");
		
		if (fnGetThemeAppProperties)
			return fnGetThemeAppProperties();
	}
	
	return 0;
}

HTHEME CThemed::OpenThemeData(HWND hwnd, LPCWSTR pszClassList)
{
	if (s_hUxTheme)
	{
		PFNOPENTHEMEDATA fnOpenThemeData = (PFNOPENTHEMEDATA)GetProcAddress(s_hUxTheme, "OpenThemeData");
		
		if (fnOpenThemeData)
			return fnOpenThemeData(hwnd, pszClassList);
	}
	
	return NULL;
}

BOOL CThemed::CloseThemeData(HTHEME hTheme)
{
	if (s_hUxTheme && hTheme)
	{
		PFNCLOSETHEMEDATA fnCloseThemeData = (PFNCLOSETHEMEDATA)GetProcAddress(s_hUxTheme, "CloseThemeData");
		
		if (fnCloseThemeData)
			return SUCCEEDED(fnCloseThemeData(m_hTheme));
	}
	
	return FALSE;
}

BOOL CThemed::DrawThemeBackground(HDC hdc, int iPartId, int iStateId, const RECT *pRect,
								  const RECT *pClipRect)
{
	if (s_hUxTheme && m_hTheme)
	{
		PFNDRAWTHEMEBACKGROUND fnDrawThemeBackground = (PFNDRAWTHEMEBACKGROUND)GetProcAddress(s_hUxTheme, "DrawThemeBackground");
		
		if (fnDrawThemeBackground)
			return (SUCCEEDED(fnDrawThemeBackground(m_hTheme, hdc, iPartId, iStateId, pRect, pClipRect)));
	}
	
	return FALSE;
}

BOOL CThemed::DrawThemeParentBackground(HWND hWnd, HDC hdc, RECT *pRect)
{
	if (s_hUxTheme && m_hTheme)
	{
		PFNDRAWTHEMEPARENTBACKGROUND fnDrawThemeParentBackground = (PFNDRAWTHEMEPARENTBACKGROUND)GetProcAddress(s_hUxTheme, "DrawThemeParentBackground");
		
		if (fnDrawThemeParentBackground)
			return (SUCCEEDED(fnDrawThemeParentBackground(hWnd, hdc, pRect)));
	}
	
	return FALSE;
}

BOOL CThemed::DrawThemeText(HDC hdc, int iPartId, int iStateId, LPCWSTR pszText, int iCharCount, 
							DWORD dwTextFlags, DWORD dwTextFlags2, const RECT *pRect)
{
	if (s_hUxTheme && m_hTheme)
	{
		PFNDRAWTHEMETEXT fnDrawThemeText = (PFNDRAWTHEMETEXT)GetProcAddress(s_hUxTheme, "DrawThemeText");
		
		if (fnDrawThemeText)
			return (SUCCEEDED(fnDrawThemeText(m_hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect)));
	}
	
	return FALSE;
}

BOOL CThemed::DrawThemeEdge(HDC hdc, int iPartId, int iStateId, const RECT *pDestRect, UINT uEdge, 
							UINT uFlags, RECT *pContentRect)
{
	if (s_hUxTheme && m_hTheme)
	{
		PFNDRAWTHEMEEDGE fnDrawThemeEdge = (PFNDRAWTHEMEEDGE)GetProcAddress(s_hUxTheme, "DrawThemeEdge");
		
		if (fnDrawThemeEdge)
			return (SUCCEEDED(fnDrawThemeEdge(m_hTheme, hdc, iPartId, iStateId, pDestRect, uEdge, uFlags, pContentRect)));
	}
	
	return FALSE;
}

BOOL CThemed::DrawThemeIcon(HDC hdc, int iPartId, int iStateId, const RECT *pRect, HIMAGELIST himl, 
							int iImageIndex)
{
	if (s_hUxTheme && m_hTheme)
	{
		PFNDRAWTHEMEICON fnDrawThemeIcon = (PFNDRAWTHEMEICON)GetProcAddress(s_hUxTheme, "DrawThemeIcon");
		
		if (fnDrawThemeIcon)
			return (SUCCEEDED(fnDrawThemeIcon(m_hTheme, hdc, iPartId, iStateId, pRect, himl, iImageIndex)));
	}
	
	return FALSE;
}

BOOL CThemed::DrawThemeBorder(HDC hdc, int iStateId, const RECT *pRect)
{
	if (s_hUxTheme && m_hTheme)
	{
		PFNDRAWTHEMEBORDER fnDrawThemeBorder = (PFNDRAWTHEMEBORDER)GetProcAddress(s_hUxTheme, "DrawThemeBorder");
		
		if (fnDrawThemeBorder)
			return (SUCCEEDED(fnDrawThemeBorder(m_hTheme, hdc, iStateId, pRect)));
	}
	
	return FALSE;
}

BOOL CThemed::GetThemePartSize(int iPartId, int iStateId, THEMESIZE eSize, SIZE *psz)
{
	if (s_hUxTheme && m_hTheme)
	{
		PFNGETTHEMEPARTSIZE fnGetThemePartSize = (PFNGETTHEMEPARTSIZE)GetProcAddress(s_hUxTheme, "GetThemePartSize");
		
		if (fnGetThemePartSize)
			return (SUCCEEDED(fnGetThemePartSize(m_hTheme, NULL, iPartId, iStateId, NULL, eSize, psz)));
	}
	
	return FALSE;
}

BOOL CThemed::GetThemeTextExtent(HDC hdc, int iPartId, int iStateId, LPCWSTR pszText, int iCharCount, 
								DWORD dwTextFlags, const RECT *pBoundingRect, RECT *pExtentRect)
{
	if (s_hUxTheme && m_hTheme)
	{
		PFNGETTHEMETEXTEXTENT fnGetThemeTextExtent = (PFNGETTHEMETEXTEXTENT)GetProcAddress(s_hUxTheme, "GetThemeTextExtent");
		
		if (fnGetThemeTextExtent)
			return (SUCCEEDED(fnGetThemeTextExtent(m_hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, pBoundingRect, pExtentRect)));
	}
	
	return FALSE;
}

BOOL CThemed::GetThemeColor(int iPartId, int iStateId, int iPropId, COLORREF *pColor)
{
	if (s_hUxTheme && m_hTheme)
	{
		PFNGETTHEMECOLOR fnGetThemeColor = (PFNGETTHEMECOLOR)GetProcAddress(s_hUxTheme, "GetThemeColor");
		
		if (fnGetThemeColor)
			return (SUCCEEDED(fnGetThemeColor(m_hTheme, iPartId, iStateId, iPropId, pColor)));
	}
	
	return FALSE;
}

BOOL CThemed::GetThemeBackgroundContentRect(HDC hdc, int iPartId, int iStateId, LPCRECT pBoundingRect, LPRECT pContentRect)
{
	if (s_hUxTheme && m_hTheme)
	{
		PFNGETTHEMEBACKGROUNDCONTENTRECT fnGetContentRect = (PFNGETTHEMEBACKGROUNDCONTENTRECT)
															GetProcAddress(s_hUxTheme, "GetThemeBackgroundContentRect");
		
		if (fnGetContentRect)
			return (SUCCEEDED(fnGetContentRect(m_hTheme, hdc, iPartId, iStateId, pBoundingRect, pContentRect)));
	}
	
	return FALSE;
}

// -----------------------------------------------------------------------------------------------------------

BOOL CThemed::GetThemeClassPartState(int nType, int nState, CString& sThClass, int& nThPart, int& nThState)
{
	sThClass.Empty();
	nThPart = 0;
	nThState = 0;
	
	switch (nType)
	{
	case DFC_BUTTON:
		{
			sThClass = "BUTTON";
			nThState = PBS_NORMAL;
			
			if (nState & DFCS_BUTTONPUSH) 
			{
				nThPart = BP_PUSHBUTTON;
				
				if (nState & (DFCS_CHECKED | DFCS_PUSHED))
					nThState = PBS_PRESSED;
				
				else if (nState & DFCS_INACTIVE)
					nThState = PBS_DISABLED;
				
				else if (nState & DFCS_HOT)
					nThState = PBS_HOT;
			}
			/*			else if (nState & DFCS_BUTTONRADIO) 
			{
			nThPart = BP_RADIOBUTTON;
			}*/
			else if ((nState & DFCS_BUTTONCHECK) == DFCS_BUTTONCHECK) 
			{
				nThPart = BP_CHECKBOX;
				
				if (nState & (DFCS_CHECKED | DFCS_PUSHED))
				{
					if (nState & DFCS_INACTIVE)
						nThState = CBS_CHECKEDDISABLED;

					else if (nState & DFCS_HOT)
						nThState = CBS_CHECKEDHOT;
					else
						nThState = CBS_CHECKEDNORMAL;
				}
				else
				{
					if (nState & DFCS_INACTIVE)
						nThState = CBS_UNCHECKEDDISABLED;

					else if (nState & DFCS_HOT)
						nThState = CBS_UNCHECKEDHOT;
					else
						nThState = CBS_UNCHECKEDNORMAL;
				}
			}
			else 
				return FALSE;
		}
		break;
		
	case DFC_CAPTION:
		break;
		
	case DFC_MENU:
		break;
		
	case DFC_POPUPMENU:
		break;
		
	case DFC_SCROLL:
		{
			if (nState & DFCS_SCROLLCOMBOBOX) 
			{
				sThClass = "COMBOBOX";
				nThPart = CP_DROPDOWNBUTTON;
				nThState = CBXS_NORMAL;
				
				if (nState & (DFCS_CHECKED | DFCS_PUSHED))
					nThState = CBXS_PRESSED;
				
				else if (nState & DFCS_INACTIVE)
					nThState = CBXS_DISABLED;
				
				else if (nState & DFCS_HOT)
					nThState = CBXS_HOT;
			}
			else if (nState & DFCS_SCROLLSIZEGRIP)
			{
				sThClass = "SCROLLBAR";
				nThPart = SBP_SIZEBOX;
				nThState = (nState & DFCS_SCROLLLEFT) ? SZB_LEFTALIGN : SZB_RIGHTALIGN;
			}
			// else
		}
		break;
	}
	
	return (!sThClass.IsEmpty() && (nThPart && nThState));
}

⌨️ 快捷键说明

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