📄 chameleonctl.cpp
字号:
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 + -