// ColorButton.cpp : implementation file
//
#include "ColorButton.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CColorButton
CColorButton::CColorButton()
{
m_clrBack=RGB(161,192,245);
m_clrFlatBack=GetSysColor(COLOR_3DFACE);
m_blnMouseOn=FALSE;
m_BackBrush.CreateSolidBrush(m_clrFlatBack);
}
CColorButton::~CColorButton()
{
m_BackBrush.DeleteObject();
}
BEGIN_MESSAGE_MAP(CColorButton, CButton)
//{{AFX_MSG_MAP(CColorButton)
ON_WM_MOUSEMOVE()
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CColorButton message handlers
void CColorButton::PreSubclassWindow()
{
CButton::PreSubclassWindow();
ModifyStyle(0, BS_OWNERDRAW);
CRect rect;
GetClientRect(rect);
SetWindowRgn(NULL, FALSE);
ClientToScreen(rect);
CWnd* pParent = GetParent();
if (pParent) pParent->ScreenToClient(rect);
MoveWindow(rect.left, rect.top, rect.Width(), rect.Height(), TRUE);
}
void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
ASSERT(lpDrawItemStruct != NULL);
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rect = lpDrawItemStruct->rcItem;
UINT state = lpDrawItemStruct->itemState;
UINT nStyle = GetStyle();
CRgn rgn1,rgn2;
int r1,g1,b1;
pDC->SelectClipRgn(&rgn1);
int nSavedDC = pDC->SaveDC();
CBrush brush1,brush2;
if(!(nStyle&BS_NOTIFY))
{
if ((state & ODS_FOCUS)||(state & ODS_SELECTED))
{
if(intStyle!=2)
{
r1=GetRValue(m_clrBack);
g1=GetGValue(m_clrBack);
b1=GetBValue(m_clrBack);
for(int i=rect.Height()/2;i>0;i--)
{
r1=(r1+10)>255?255:(r1+10);
g1=(g1+10)>255?255:(g1+10);
b1=(b1+10)>255?255:(b1+10);
CPen pen(PS_SOLID, 1, RGB(r1, g1, b1));
CPen *old = pDC->SelectObject(&pen);
pDC->MoveTo(rect.left,rect.top+i);
pDC->LineTo(rect.right,rect.top+i);
pDC->MoveTo(rect.left,rect.bottom-i);
pDC->LineTo(rect.right,rect.bottom-i);
pDC->SelectObject(old);
}
}
else
{
pDC->FillSolidRect(rect,m_clrBack);
}
r1=(r1+30)>255?255:(r1+30);
g1=(g1+30)>255?255:(g1+30);
b1=(b1+30)>255?255:(b1+30);
brush1.CreateSolidBrush(RGB(r1,g1,b1));
pDC->FrameRgn(&rgn1,&brush1,1,1);
pDC->FrameRgn(&rgn2,&brush2,1,1);
}
else if(m_blnMouseOn)
{
if(intStyle!=2)
{
r1=GetRValue(m_clrBack);
g1=GetGValue(m_clrBack);
b1=GetBValue(m_clrBack);
for(int i=rect.Height()/2;i>0;i--)
{
r1=(r1+10)>255?255:(r1+10);
g1=(g1+10)>255?255:(g1+10);
b1=(b1+10)>255?255:(b1+10);
CPen pen(PS_SOLID, 1, RGB(r1, g1, b1));
CPen *old = pDC->SelectObject(&pen);
pDC->MoveTo(rect.left,rect.top+i);
pDC->LineTo(rect.right,rect.top+i);
pDC->MoveTo(rect.left,rect.bottom-i);
pDC->LineTo(rect.right,rect.bottom-i);
pDC->SelectObject(old);
}
}
else
{
pDC->FillSolidRect(rect,m_clrBack);
}
r1=(r1+30)>255?255:(r1+30);
g1=(g1+30)>255?255:(g1+30);
b1=(b1+30)>255?255:(b1+30);
brush1.CreateSolidBrush(RGB(r1,g1,b1));
pDC->FrameRgn(&rgn1,&brush1,1,1);
pDC->FrameRgn(&rgn2,&brush2,1,1);
}
else
{
if(nStyle&BS_FLAT)
{
CBrush bs;
bs.CreateSolidBrush(m_clrFlatBack);
CRect rcBack;
GetClientRect(rcBack);
pDC->FillRect(rcBack,&m_BackBrush);
}
else
{
if(intStyle!=2)
{
r1=GetRValue(m_clrBack);
g1=GetGValue(m_clrBack);
b1=GetBValue(m_clrBack);
for(int i=rect.Height()/2;i>0;i--)
{
r1=(r1+13)>255?255:(r1+13);
g1=(g1+13)>255?255:(g1+13);
b1=(b1+13)>255?255:(b1+13);
CPen pen(PS_SOLID, 1, RGB(r1, g1, b1));
CPen *old = pDC->SelectObject(&pen);
pDC->MoveTo(rect.left,rect.top+i);
pDC->LineTo(rect.right,rect.top+i);
pDC->MoveTo(rect.left,rect.bottom-i);
pDC->LineTo(rect.right,rect.bottom-i);
pDC->SelectObject(old);
}
}
else
{
pDC->FillSolidRect(rect,m_clrBack);
}
r1=GetRValue(m_clrBack);
g1=GetGValue(m_clrBack);
b1=GetBValue(m_clrBack);
r1=(r1+30)>255?255:(r1+30);
g1=(g1+30)>255?255:(g1+30);
b1=(b1+30)>255?255:(b1+30);
brush2.CreateSolidBrush(m_clrBack);
brush1.CreateSolidBrush(RGB(r1,g1,b1));
pDC->FrameRgn(&rgn1,&brush1,1,1);
pDC->FrameRgn(&rgn2,&brush2,1,1);
}
}
}
else
{
pDC->FillSolidRect(rect,m_clrBack);
}
}
void CColorButton::SetBackColor(COLORREF color)
{
m_clrBack=color;
this->Invalidate(TRUE);
}
void CColorButton::SetFlatBack(COLORREF colFlat)
{
m_clrFlatBack=colFlat;
m_BackBrush.DeleteObject();
m_BackBrush.CreateSolidBrush(colFlat);
this->Invalidate(TRUE);
}
void CColorButton::OnMouseMove(UINT nFlags, CPoint point)
{
CWnd *wndUnderMouse = NULL;
CWnd *wndActive = this;
TRACKMOUSEEVENT csTME;
CButton::OnMouseMove(nFlags, point);
ClientToScreen(&point);
wndUnderMouse = WindowFromPoint(point);
if (nFlags & MK_LBUTTON) return;
wndActive = GetActiveWindow();
if (wndUnderMouse && wndUnderMouse->m_hWnd == m_hWnd && wndActive)
{
if (!m_blnMouseOn)
{
m_blnMouseOn = TRUE;
Invalidate();
csTME.cbSize = sizeof(csTME);
csTME.dwFlags = TME_LEAVE;
csTME.hwndTrack = m_hWnd;
::_TrackMouseEvent(&csTME);
}
}
else
{
m_blnMouseOn=FALSE;
Invalidate();
}
}
LRESULT CColorButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_blnMouseOn=FALSE;
Invalidate();
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
VC颜色按钮类方便设置
共2个文件
cpp:1个
h:1个
5星 · 超过95%的资源 需积分: 10 93 下载量 198 浏览量
2008-12-27
11:17:39
上传
评论
收藏 2KB RAR 举报
温馨提示
颜色按钮类,从CButton类继承并颜色进行封装,可以方便地设置按钮的颜色及不同状态下的颜色变化。
资源推荐
资源详情
资源评论
收起资源包目录
ColorButton.rar (2个子文件)
ColorButton.h 1KB
ColorButton.cpp 6KB
共 2 条
- 1
Angelan
- 粉丝: 2
- 资源: 41
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页