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

📄 chameleonctl.cpp

📁 VC编写的变色龙按钮程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		m_ulText = TranslateColor( GetForeColor() );
		m_ulTextO = m_lForeOverColor;
		m_ulShadow = ShiftColor( m_ulFace, -0x40 );
		m_ulLight = ShiftColor( m_ulFace, 0x1F );
		m_ulHighLight = ShiftColor( m_ulFace, 0x2F );
		m_ulDarkShadow = ShiftColor( m_ulFace, -0xC0 );
		m_ulOfficeXPB = ShiftColor( m_ulFace, -0x80 );
		m_ulOfficeXPF = m_ulFace;
	}
	else if( m_lColorScheme == 3 )
	{
		//ForceStandard
		m_ulFace = 0xC0C0C0;
		m_ulFaceO = m_ulFace;
		m_ulText = 0;
		m_ulTextO = m_ulText;
		m_ulShadow = 0x808080;
		m_ulLight = 0xDFDFDF;
		m_ulHighLight = 0xFFFFFF;
		m_ulDarkShadow = 0;
		m_ulOfficeXPB = 0x800000;
		m_ulOfficeXPF = 0xD1ADAD;
	}
	else if( m_lColorScheme == 4 )
	{
		//UseContainer
		CWnd * pwndParent;
		CDC * pdcParent;

		pwndParent = GetParent();
		pdcParent = pwndParent->GetDC();

		m_ulFace = GetBkColor( pdcParent->m_hDC );
		m_ulFaceO = m_ulFace;
		m_ulText = GetTextColor( pdcParent->m_hDC );
		m_ulTextO = m_ulText;
		m_ulShadow = ShiftColor( m_ulFace, -0x40 );
		m_ulLight = ShiftColor( m_ulFace, 0x1F );
		m_ulHighLight = ShiftColor( m_ulFace, 0x2F );
		m_ulDarkShadow = ShiftColor( m_ulFace, -0xC0 );
		m_ulOfficeXPB = GetSysColor( COLOR_HIGHLIGHT );
		m_ulOfficeXPF = ShiftColorOXP( m_ulOfficeXPB );

		pwndParent->ReleaseDC( pdcParent );
	}
	else
	{
		//UseWindows
		m_ulFace = GetSysColor(COLOR_BTNFACE);
		m_ulFaceO = m_ulFace;
		m_ulText = GetSysColor(COLOR_BTNTEXT);
		m_ulTextO = m_ulText;
		m_ulShadow = GetSysColor(COLOR_BTNSHADOW);
		m_ulLight = GetSysColor(COLOR_3DLIGHT);//COLOR_BTNLIGHT
		m_ulHighLight = GetSysColor(COLOR_BTNHIGHLIGHT);
		m_ulDarkShadow = GetSysColor(COLOR_3DDKSHADOW);//COLOR_BTNDKSHADOW
		m_ulOfficeXPB = GetSysColor( COLOR_HIGHLIGHT );
		m_ulOfficeXPF = ShiftColorOXP( m_ulOfficeXPB );
	}

	if( m_lButtonType == 3 )
	{
		m_ulXPFace = ShiftColor( m_ulFace, 0x30, true );
	}
	else
	{
		m_ulXPFace = ShiftColor( m_ulFace, 0x30 );
	}

	return 0;
}

/////////////////////////////////////////////////////////////////////////////
//
// 增减RBG颜色值
// 参数:	ulColor		原色彩
//			nValue		增减数值,0-255
//			m_bXP		是否XP风格
// 返回值:				增减后的色彩
//
/////////////////////////////////////////////////////////////////////////////
DWORD CChameleonCtrl::ShiftColor( DWORD ulColor, int nValue, bool m_bXP )
{
	int nR = GetRValue( ulColor );
	int nG = GetGValue( ulColor );
	int nB = GetBValue( ulColor );

	nR += nValue;
	nG += nValue;
	if( m_bXP )
	{
		nB += nB * nValue / 0xC0;
	}
	else
	{
		nB += nValue;
	}

	if( nR < 0 )
	{
		nR = 0;
	}
	if( nR > 255 )
	{
		nR = 255;
	}
	if( nG < 0 )
	{
		nG = 0;
	}
	if( nG > 255 )
	{
		nG = 255;
	}
	if( nB < 0 )
	{
		nB = 0;
	}
	if( nB > 255 )
	{
		nB = 255;
	}

	return RGB( nR, nG, nB );
}

/////////////////////////////////////////////////////////////////////////////
//
// XP风格的增减RGB颜色值
// 参数:	ulColor		原色彩
//			nBase		增减基数
// 返回值:				增减后的色彩
//
/////////////////////////////////////////////////////////////////////////////
DWORD CChameleonCtrl::ShiftColorOXP( DWORD ulColor, int nBase )
{
	int nR = GetRValue( ulColor );
	int nG = GetGValue( ulColor );
	int nB = GetBValue( ulColor );

	int nDelta = 0xFF - nBase;

	nR = nBase + nR * nDelta / 0xFF;
	nG = nBase + nG * nDelta / 0xFF;
	nB = nBase + nB * nDelta / 0xFF;

	if( nR < 0 )
	{
		nR = 0;
	}
	if( nR > 255 )
	{
		nR = 255;
	}
	if( nG < 0 )
	{
		nG = 0;
	}
	if( nG > 255 )
	{
		nG = 255;
	}
	if( nB < 0 )
	{
		nB = 0;
	}
	if( nB > 255 )
	{
		nB = 255;
	}

	return RGB( nR, nG, nB );
}

/////////////////////////////////////////////////////////////////////////////
//
// 画文本
// 参数:	hdcCtrl		绘图设备场景
//			nDrawType	文本的绘制类型
// 返回值:	0			正确
//
/////////////////////////////////////////////////////////////////////////////
int CChameleonCtrl::DrawCaption( HDC hdcCtrl, int nDrawType )
{
	CRect recText( 0, 0, m_nWidth, m_nHeight );
	CRect recOffset;

	//获得输出文字区域的大小
	DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recText, 
		DT_LEFT | DT_CALCRECT | DT_WORDBREAK );
	recText.OffsetRect( ( m_nWidth - recText.Width() ) / 2, ( m_nHeight - recText.Height() ) / 2);
	m_recText.CopyRect( recText );

	recOffset.CopyRect( recText );
	recOffset.OffsetRect( 1, 1 );

	if( GetBkMode( hdcCtrl ) != TRANSPARENT )
	{
		SetBkMode( hdcCtrl, TRANSPARENT );
	}

	if( nDrawType == 0 )
	{
		//normal
		DrawEffect( hdcCtrl, recText );
		SetTextColor( hdcCtrl, m_ulText );
	}
	else if( nDrawType == 1 )
	{
		//hover
		DrawEffect( hdcCtrl, recText );
		SetTextColor( hdcCtrl, m_ulTextO );
	}
	else if( nDrawType == 2 )
	{
		//down
		DrawEffect( hdcCtrl, recOffset );
		if( m_lButtonType == 4 )
		{
			SetTextColor( hdcCtrl, m_ulLight );
		}
		else
		{
			SetTextColor( hdcCtrl, m_ulTextO );
		}
		DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recOffset, 
			DT_LEFT | DT_WORDBREAK );
	}
	else if( nDrawType == 3 )
	{
		//disabled embossed
		SetTextColor( hdcCtrl, m_ulHighLight );
		DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recOffset, 
			DT_LEFT | DT_WORDBREAK );
		SetTextColor( hdcCtrl, m_ulShadow );
	}
	else if( nDrawType == 4 )
	{
		//disabled grey
		SetTextColor( hdcCtrl, m_ulShadow );
	}
	else if( nDrawType == 5 )
	{
		//WinXP disabled
		SetTextColor( hdcCtrl, ShiftColor( m_ulXPFace, -0x68, true ) );
	}
	else if( nDrawType == 6 )
	{
		//KDE 2 disabled
		SetTextColor( hdcCtrl, m_ulHighLight );
		DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recOffset, 
			DT_LEFT | DT_WORDBREAK );
		SetTextColor( hdcCtrl, m_ulFace );
	}
	else if( nDrawType == 7 )
	{
		//KDE 2 down
		SetTextColor( hdcCtrl, ShiftColor( m_ulShadow, -0x32 ) );
		DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recOffset, 
			DT_LEFT | DT_WORDBREAK );
		SetTextColor( hdcCtrl, m_ulHighLight );
	}

	if( nDrawType != 2 )
	{
		DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recText, 
			DT_LEFT | DT_WORDBREAK );
	}

	return 0;
}

/////////////////////////////////////////////////////////////////////////////
//
// 画文本的特效
// 参数:	hdcCtrl		绘图设备场景
//			recDraw		绘制特效的区域
// 返回值:	0			正确
//
/////////////////////////////////////////////////////////////////////////////
int CChameleonCtrl::DrawEffect( HDC hdcCtrl, CRect recDraw )
{
	if( m_lTextEffect > 0 )
	{
		DWORD ulColor;
		CRect recOffset;

		recOffset.CopyRect( recDraw );
		recOffset.OffsetRect( 1, 1 );

		if( m_lButtonType == 3 || m_lButtonType == 4 
			|| m_lButtonType == 12 )
		{
			ulColor = m_ulXPFace;
		}
		else
		{
			if( m_nStatus == 0 && m_bMouseOver && 
				m_lColorScheme != 2 && 
				m_lButtonType == 9 )
			{
				ulColor = m_ulOfficeXPF;
			}
			else
			{
				ulColor = m_ulFace;
			}
		}

		if( m_lTextEffect == 2 )
		{
			SetTextColor( hdcCtrl, ShiftColor( ulColor, 0x28 ) );
		}
		else
		{
			SetTextColor( hdcCtrl, ShiftColor( ulColor, -0x28 ) );
		}

		DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recOffset, 
			DT_LEFT | DT_WORDBREAK );

		if( m_lTextEffect < 3 )
		{
			recOffset.OffsetRect( -2, -2 );
			if( m_lTextEffect == 2 )
			{
				SetTextColor( hdcCtrl, ShiftColor( ulColor, -0x28 ) );
			}
			else
			{
				SetTextColor( hdcCtrl, ShiftColor( ulColor, 0x28 ) );
			}
			DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recOffset, 
				DT_LEFT | DT_WORDBREAK );
		}
	}

	return 0;
}

/////////////////////////////////////////////////////////////////////////////
//
// 画长方形
// 参数:	hdcCtrl		绘图设备场景
//			nLeft		左边距
//			nTop		上边距
//			nWidth		宽度
//			nHeight		高度
//			ulColor		画刷颜色
//			bBoard		是否仅绘画边框
// 返回值:	0			正确
//
/////////////////////////////////////////////////////////////////////////////
int CChameleonCtrl::DrawRectangle( HDC hdcCtrl, int nLeft, int nTop, int nWidth, int nHeight, DWORD ulColor, bool bBoard )
{
	HBRUSH hBack = CreateSolidBrush( ulColor );
	if( hBack == NULL )
	{
		return 2;
	}

	CRect recPaint( nLeft, nTop, nLeft + nWidth, nTop + nHeight );
	if( bBoard )
	{
		FrameRect( hdcCtrl, recPaint, hBack );
	}
	else
	{
		FillRect( hdcCtrl, recPaint, hBack );
	}

	DeleteObject( hBack );

	return 0;
}

/////////////////////////////////////////////////////////////////////////////
//
// 画边框,nExtraOffset,true传入-1,false传入0
// 参数:	
// 返回值:	0			正确
//
/////////////////////////////////////////////////////////////////////////////
int CChameleonCtrl::DrawFrame( HDC hdcCtrl, DWORD ulHigh, DWORD ulDark, 
								DWORD ulLight, DWORD ulShadow, 
								int nExtraOffset, bool bFlat )
{
	CPoint pntPos;
	HPEN hpenOld;
	HPEN hpenNew;

	int nFrameWidth = m_nWidth - 1 + nExtraOffset;
	int nFrameHight = m_nHeight - 1 + nExtraOffset;
	int nFrameXtra = abs( nExtraOffset );

	hpenNew = CreatePen( PS_SOLID, 1, ulHigh );
	hpenOld = (HPEN)SelectObject( hdcCtrl, hpenNew );
	MoveToEx( hdcCtrl, nFrameXtra, nFrameHight, &pntPos );
	LineTo( hdcCtrl, nFrameXtra, nFrameXtra );
	LineTo( hdcCtrl, nFrameWidth, nFrameXtra );
	SelectObject( hdcCtrl, hpenOld );
	DeleteObject( hpenNew );

	hpenNew = CreatePen( PS_SOLID, 1, ulDark );
	hpenOld = (HPEN)SelectObject( hdcCtrl, hpenNew );
	LineTo( hdcCtrl, nFrameWidth, nFrameHight );
	LineTo( hdcCtrl, nFrameXtra -1,  nFrameHight );
	MoveToEx( hdcCtrl, nFrameXtra + 1, nFrameHight - 1, &pntPos );
	SelectObject( hdcCtrl, hpenOld );
	DeleteObject( hpenNew );

	if( bFlat )
	{
		return 0;
	}

	hpenNew = CreatePen( PS_SOLID, 1, ulLight );
	hpenOld = (HPEN)SelectObject( hdcCtrl, hpenNew );
	LineTo( hdcCtrl, nFrameXtra + 1, nFrameXtra + 1 );
	LineTo( hdcCtrl, nFrameWidth - 1, nFrameXtra + 1 );
	SelectObject( hdcCtrl, hpenOld );
	DeleteObject( hpenNew );

	hpenNew = CreatePen( PS_SOLID, 1, ulShadow );
	hpenOld = (HPEN)SelectObject( hdcCtrl, hpenNew );
	LineTo( hdcCtrl, nFrameWidth - 1, nFrameHight - 1 );
	LineTo( hdcCtrl, nFrameXtra, nFrameHight - 1 );
	SelectObject( hdcCtrl, hpenOld );
	DeleteObject( hpenNew );

	return 0;
}

/////////////////////////////////////////////////////////////////////////////
//
// 画焦点框
// 参数:	hdcCtrl		绘图设备场景
//			recFocus	焦点框的位置和大小
//			ulColor		焦点框的颜色
// 返回值:	0			正确
//
/////////////////////////////////////////////////////////////////////////////
int CChameleonCtrl::DrawFocusR( HDC hdcCtrl, CRect recFocus, DWORD ulColor )
{
	if( m_bShowFocusRect && m_bFocus )
	{
		SetTextColor( hdcCtrl, ulColor );
		DrawFocusRect( hdcCtrl, recFocus );
	}

	return 0;
}

/////////////////////////////////////////////////////////////////////////////
//
// 画线
// 参数:	hdcCtrl		绘图设备场景
//			nX1			起点X坐标
//			nY1			起点Y坐标
//			nX2			终点X坐标
//			nY2			终点Y坐标
//			ulColor		颜色
// 返回值:	0			正确
//
/////////////////////////////////////////////////////////////////////////////
int CChameleonCtrl::DrawLine( HDC hdcCtrl, int nX1, int nY1, int nX2, int nY2, DWORD ulColor )
{
	CPoint pntPos;
	HPEN hpenOld;
	HPEN hpenNew;

	hpenNew = CreatePen( PS_SOLID, 1, ulColor );
	hpenOld = (HPEN)SelectObject( hdcCtrl, hpenNew );

	MoveToEx( hdcCtrl, nX1, nY1, &pntPos );
	LineTo( hdcCtrl, nX2, nY2 );

	SelectObject( hdcCtrl, hpenOld );
	DeleteObject( hpenNew );

	return 0;
}

/////////////////////////////////////////////////////////////////////////////
//
// 向ToolTipCtrl发送消息
// 参数:	
// 返回值:	
//
/////////////////////////////////////////////////////////////////////////////
void CChameleonCtrl::RelayEvent(UINT message, WPARAM wParam, LPARAM lParam)
{
	if( m_ttpMes.m_hWnd != NULL )
	{
		MSG msg;
		msg.hwnd = m_hWnd;
		msg.message = message;
		ms

⌨️ 快捷键说明

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