📄 custombutton.cpp
字号:
pDC->MoveTo(pRect->left+2, pRect->bottom-2);
pDC->LineTo(pRect->right-2, pRect->bottom-2);
pDC->MoveTo(pRect->right-2, pRect->bottom-3);
pDC->LineTo(pRect->right-2, pRect->top+1);
//
pDC->SelectObject(pOldPen);
}//if not pressed
}//if hgradient
else
{
//draw pressed non-gradient button
if(m_bPressed == true)
{
CPen penLighter(PS_SOLID, 0, OffsetColor(m_crBkgPressed, -0.3));
CPen penLight(PS_SOLID, 0, OffsetColor(m_crBkgPressed, -0.2));
CPen penDark(PS_SOLID, 0, OffsetColor(m_crBkgPressed, 0.2));
CPen penDarker(PS_SOLID, 0, OffsetColor(m_crBkgPressed, 0.3));
//top-left border
//darker line
CPen* pOldPen = pDC->SelectObject(&penDarker);
pDC->MoveTo(pRect->left, pRect->bottom-1);
pDC->LineTo(pRect->left, pRect->top);
pDC->LineTo(pRect->right, pRect->top);
//dark
pDC->SelectObject(penDark);
pDC->MoveTo(pRect->left+1, pRect->bottom-1);
pDC->LineTo(pRect->left+1, pRect->top+1);
pDC->LineTo(pRect->right, pRect->top+1);
//bottom-right border
//lighter line
pDC->SelectObject(penLighter);
pDC->MoveTo(pRect->left, pRect->bottom-1);
pDC->LineTo(pRect->right-1, pRect->bottom-1);
pDC->LineTo(pRect->right-1, pRect->top-1);
//light line
pDC->SelectObject(penLight);
pDC->MoveTo(pRect->left+1, pRect->bottom-2);
pDC->LineTo(pRect->right-2, pRect->bottom-2);
pDC->LineTo(pRect->right-2, pRect->top);
//
pDC->SelectObject(pOldPen);
}
else
//draw not pressed button
{
CPen penLighter(PS_SOLID, 0, OffsetColor(m_crBkgIdle, -0.3));
CPen penLight(PS_SOLID, 0, OffsetColor(m_crBkgIdle, -0.2));
CPen penDark(PS_SOLID, 0, OffsetColor(m_crBkgIdle, 0.2));
CPen penDarker(PS_SOLID, 0, OffsetColor(m_crBkgIdle, 0.3));
//top-left border
//lighter line
CPen* pOldPen = pDC->SelectObject(&penLighter);
pDC->MoveTo(pRect->left, pRect->bottom-1);
pDC->LineTo(pRect->left, pRect->top);
pDC->LineTo(pRect->right, pRect->top);
//light
pDC->SelectObject(penLight);
pDC->MoveTo(pRect->left+1, pRect->bottom-1);
pDC->LineTo(pRect->left+1, pRect->top+1);
pDC->LineTo(pRect->right, pRect->top+1);
//bottom-right border
//darker line
pDC->SelectObject(penDarker);
pDC->MoveTo(pRect->left, pRect->bottom-1);
pDC->LineTo(pRect->right-1, pRect->bottom-1);
pDC->LineTo(pRect->right-1, pRect->top-1);
//dark line
pDC->SelectObject(penDark);
pDC->MoveTo(pRect->left+1, pRect->bottom-2);
pDC->LineTo(pRect->right-2, pRect->bottom-2);
pDC->LineTo(pRect->right-2, pRect->top);
//
pDC->SelectObject(pOldPen);
}//if not pressed
}//if not gradient
}
//////////////////////////////////////////////////////////////////////////
//initialization
/*
LRESULT CCustomButton::OnSetControlData(WPARAM wParam, LPARAM lParam)
{
CustomControlData *pccdControlData;
LONG lStyle;
DWProp dwp;
StrProp strp;
CRect rc;
DWORD dwTemp;
if(lParam == NULL)
{
return 0;
}
GetClientRect(&rc);
pccdControlData=(CustomControlData *)lParam;
//store type
m_ctType=pccdControlData->ctType;
m_cfFlags=pccdControlData->cfFlags;
//init font, if specified
dwTemp=pccdControlData->dwFontID;
if(dwTemp != 0)
{
m_hCustomFont=g_SkinManager.GetFontHandle(dwTemp);
}
if(pccdControlData->ctType == CustomControlData::ctCustomGroup)
{
m_bIsGroup=true;
//groupbox specific params
if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpFrameColor, dwp))
{
m_crFrame=dwp.dwValue;
}
}
else
{
m_bIsGroup=false;
}
//is flat button?
lStyle=GetWindowLong(GetSafeHwnd(), GWL_STYLE);
if(lStyle & BS_FLAT)
{
m_bFlat=true;
}
else
{
m_bFlat=false;
}
//gradient colors?
if(m_cfFlags & bfHGradient)
{
m_bHGradient=true;
}
//init captions
if(TRUE == pccdControlData->spmStrProps.Lookup(cspCaption, strp))
{
m_strCaption=m_strActiveCaption=strp.strValue;
if(TRUE == pccdControlData->spmStrProps.Lookup(cspActiveCaption, strp))
{
m_strActiveCaption=strp.strValue;
}
}
//init text colors
if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpBkgIdleColor, dwp))
{
m_crBkgIdle=dwp.dwValue;
}
if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpBkgActiveColor, dwp))
{
m_crBkgPressed=dwp.dwValue;
}
if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpTxtIdleColor, dwp))
{
m_crTxtIdle=dwp.dwValue;
}
if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpTxtActiveColor, dwp))
{
m_crTxtPressed=dwp.dwValue;
}
//init gradient colors
if(m_bHGradient == true)
{
if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpHGradientStart, dwp))
{
m_crHGStart=dwp.dwValue;
}
if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpHGradientEnd, dwp))
{
m_crHGEnd=dwp.dwValue;
}
}
//icon dimensions, if specified
if(lStyle & BS_ICON)
{
if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpImgW, dwp))
{
m_dwBmpW=dwp.dwValue;
}
if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpImgH, dwp))
{
m_dwBmpH=dwp.dwValue;
}
}
//load bitmaps/icons from file or resource
//if has BS_ICON style, load icon from resource
if(lStyle & BS_ICON)
{
if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpBkgResource, dwp))
{
m_hBmpInactive=g_SkinManager.LoadIconResource(dwp.dwValue, m_dwBmpW, m_dwBmpH);
//load same resource for "active"
m_hBmpActive=g_SkinManager.LoadIconResource(dwp.dwValue, m_dwBmpW, m_dwBmpH);
if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpBkgActiveResource, dwp))
{
//free previously loaded "active"
g_SkinManager.FreeResource(m_hBmpActive);
//and reload
m_hBmpActive=g_SkinManager.LoadIconResource(dwp.dwValue, m_dwBmpW, m_dwBmpH);
}
}
}//icon
else
//if has BS_BITMAP style, load bitmap from resource, or if resource zero, load from file
if(lStyle & BS_BITMAP)
{
//is the bitmap a resource?
if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpBkgResource, dwp))
{
//load from resource
m_hBmpInactive=g_SkinManager.LoadBMPResource(dwp.dwValue);
//load same for "active"
m_hBmpActive=g_SkinManager.LoadBMPResource(dwp.dwValue);
if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpBkgActiveResource, dwp))
{
//free previously loaded "active"
g_SkinManager.FreeResource(m_hBmpActive);
//and reload
m_hBmpActive=g_SkinManager.LoadBMPResource(dwp.dwValue);
}
}
else
{
//no, its a file!
//load from file
if(TRUE == pccdControlData->spmStrProps.Lookup(cspBkgFile, strp))
{
m_hBmpInactive=g_SkinManager.LoadBitmapFile(g_SkinManager.GetSkinPath() + strp.strValue);
//load same for "active"
m_hBmpActive=g_SkinManager.LoadBitmapFile(g_SkinManager.GetSkinPath() + strp.strValue);
if(TRUE == pccdControlData->spmStrProps.Lookup(cspBkgActiveFile, strp))
{
//free previously loaded "active"
g_SkinManager.FreeResource(m_hBmpActive);
//and reload
m_hBmpActive=g_SkinManager.LoadBitmapFile(g_SkinManager.GetSkinPath() + strp.strValue);
}
}
}
//get BMP dimensions
g_SkinManager.GetBitmapDimensions(m_hBmpActive, &m_dwBmpW, &m_dwBmpH);
}//bitmap
//at this stage we do have a HWND and a DC
CDC *pDC;
pDC=GetDC();
if(pDC != NULL)
{
m_DrawDC.CreateCompatibleDC(pDC);
m_DrawBitmap.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
m_hOldDCBmp=m_DrawDC.SelectObject(m_DrawBitmap.GetSafeHandle());
ReleaseDC(pDC);
}
#ifdef _DEBUG
else
{
OutputDebugString(_T("Custom_button failed to get DC."));
}
#endif
return 0;
}
*/
//////////////////////////////////////////////////////////////////////////
//Get DrawText flags parameter from button BS_XXX styles
DWORD CCustomButton::GetDTFlag(DWORD dwStyle)
{
DWORD dtStyle;
dtStyle=0;
if(!(dwStyle & BS_MULTILINE))
{
dtStyle |= DT_SINGLELINE;
}
else
{
dtStyle |= DT_WORDBREAK;
}
switch(dwStyle & BS_CENTER)
{
case BS_LEFT:
{
/* DT_LEFT is 0 */
break;
}
case BS_RIGHT:
{
dtStyle |= DT_RIGHT;
break;
}
case BS_CENTER:
{
dtStyle |= DT_CENTER;
break;
}
default:
dtStyle |= DT_CENTER;
}
switch(dwStyle & BS_VCENTER)
{
case BS_TOP:
{
/* DT_TOP is 0 */
break;
}
case BS_BOTTOM:
{
dtStyle |= DT_BOTTOM;
break;
}
/*
case BS_VCENTER:
//fall through:
default:
dtStyle |= DT_VCENTER;
*/
}
return dtStyle;
}
//////////////////////////////////////////////////////////////////////////
//modify a color (lighten or darken)
//if dOffs is positive, it will darken the color, if negative, will lighten it
COLORREF CCustomButton::OffsetColor(COLORREF crColorIn, double dOffs)
{
COLORREF crColor;
BYTE bR, bG, bB, bR2, bG2, bB2;
crColor=crColorIn;
if(dOffs > 0.0 && dOffs <= 1.0)
{
bR = GetRValue(crColor);
bG = GetGValue(crColor);
bB = GetBValue(crColor);
//red would underflow?
if( bR < (BYTE)(dOffs * bR) )
{
bR2=0;
}
else
{
bR2 = (BYTE)(bR-(dOffs * bR));
}
//green would underflow?
if( bG < (BYTE)(dOffs * bG) )
{
bG2=0;
}
else
{
bG2 = (BYTE)(bG-(dOffs * bG));
}
//blue would underflow?
if( bB < (BYTE)(dOffs * bB) )
{
bB2=0;
}
else
{
bB2 = (BYTE)(bB-(dOffs * bB));
}
crColor = RGB(bR2, bG2, bB2);
}
else
if(dOffs < 0.0 && dOffs >= -1.0)
{
bR = GetRValue(crColor);
bG = GetGValue(crColor);
bB = GetBValue(crColor);
//red would overflow?
if( (WORD)((1 - dOffs) * bR) < 0xff )
{
//no
bR2 = (BYTE)(bR+(-dOffs * bR));
}
else
{
bR2=0xff;
}
//green would overflow?
if( (WORD)((1 - dOffs) * bG) < 0xff )
{
//no
bG2 = (BYTE)(bG+(-dOffs * bG));
}
else
{
bG2=0xff;
}
//blue would overflow?
if( (WORD)((1 - dOffs) * bB) < 0xff )
{
//no
bB2 = (BYTE)(bB+(-dOffs * bB));
}
else
{
bB2=0xff;
}
crColor = RGB(bR2, bG2, bB2);
}
return crColor;
}
//////////////////////////////////////////////////////////////////////////
void CCustomButton::DisplayTransparentBMP(CDC *pDestDC, HBITMAP hBmp, DWORD dwW, DWORD dwH, int nX, int nY)
{
CDC dcMem;
HBITMAP hBmpOld;
if(TRUE == dcMem.CreateCompatibleDC(pDestDC))
{
hBmpOld=(HBITMAP)dcMem.SelectObject(hBmp);
if(hBmpOld != NULL)
{
::TransparentBlt(pDestDC->GetSafeHdc(), nX, nY, dwW, dwH, dcMem.GetSafeHdc(), 0, 0, dwW, dwH, (UINT)RGB(0, 0, 0) );
dcMem.SelectObject(hBmpOld);
}
}//compatible DC ok
}
//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetCaption(CString strCaption, CString strActiveCaption)
{
m_strCaption=strCaption;
if(strActiveCaption != _T(""))
{
m_strActiveCaption=strActiveCaption;
}
else
{
m_strActiveCaption=m_strCaption;
}
if(m_bPressed == true)
{
SetWindowText(m_strActiveCaption);
}
else
{
SetWindowText(m_strCaption);
}
Invalidate();
}
//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetFlags(DWORD dwFlags)
{
m_cfFlags=dwFlags;
if(m_cfFlags & bfHGradient)
{
m_bHGradient=true;
}
else
{
m_bHGradient=false;
}
Invalidate();
}
//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetBitmaps(HBITMAP hBmpInactive, HBITMAP hBmpActive /* = NULL */)
{
BITMAP bmpData;
//old present and new specified
if(m_hBmpInactive != NULL && hBmpInactive != NULL)
{
//dump old
DeleteObject(m_hBmpInactive);
m_hBmpInactive=NULL;
m_dwBmpH=m_dwBmpW=0;
}
if(hBmpInactive != NULL)
{
m_hBmpInactive=hBmpInactive;
//get dimensions
if(::GetObject(hBmpInactive, sizeof(bmpData), &bmpData) != 0)
{
m_dwBmpW=(DWORD)bmpData.bmWidth;
m_dwBmpH=(DWORD)bmpData.bmHeight;
}
}
//old present and new specified
if(m_hBmpActive != NULL && hBmpActive != NULL)
{
//dump old
DeleteObject(m_hBmpActive);
m_hBmpActive=NULL;
}
//if specified, use other bitmap for active state
if(hBmpActive != NULL)
{
m_hBmpActive=hBmpActive;
}
else
{
//otherwise use inactive bitmap for active state
m_hBmpActive=m_hBmpInactive;
}
Invalidate();
}
//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetBkgIdleColor(COLORREF crBkgIdle)
{
m_crBkgIdle=crBkgIdle;
Invalidate();
}
//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetBkgActiveColor(COLORREF crBkgActive)
{
m_crBkgPressed=crBkgActive;
Invalidate();
}
//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetFrgIdleColor(COLORREF crFrgIdle)
{
m_crTxtIdle=crFrgIdle;
Invalidate();
}
//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetFrgActiveColor(COLORREF crFrgActive)
{
m_crTxtPressed=crFrgActive;
Invalidate();
}
//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetGradientColors(COLORREF crStart, COLORREF crEnd)
{
m_crHGStart=crStart;
m_crHGEnd=crEnd;
Invalidate();
}
//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetFrameColor(COLORREF crFrame)
{
m_crFrame=crFrame;
Invalidate();
}
//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetFont(HFONT hFont)
{
//purge old font
if(m_hCustomFont != NULL)
{
DeleteObject(m_hCustomFont);
}
m_hCustomFont=hFont;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -