/*********************************************************************************
* Author : orbit *
* Description : 这个文件定义CWzButtonImpl类,这是一个支持OwnerDraw的按钮类, *
* Date : Sep 15, 2003 *
* Last-modified : Nov 21, 2003 *
* Contact us : inte2000@163.com,support@winmsg.com *
* Web Page : http://www.winmsg.com/cn/orbit.htm *
* http://blog.csdn.net/orbit/ (关于代码的更新) *
*********************************************************************************/
#include "stdafx.h"
#include "WzButton.h"
//##ModelId=43538E3F03AB
CWzButtonImpl::CWzButtonImpl()
{
m_MouseOnButton = 0;
m_bIsFlat = 1;
m_bDrawBorder = 1;
m_bDrawFlatFocus = 1;
m_bAlwaysTrack = 1;
m_hBtnCursor = NULL;
InitDefaultColor();
}
//##ModelId=43538E3F03AC
CWzButtonImpl::~CWzButtonImpl()
{
}
//##ModelId=43538E3F03B9
BOOL CWzButtonImpl::SubclassWindow(HWND hWnd)
{
ATLASSERT(m_hWnd == NULL);
ATLASSERT(::IsWindow(hWnd));
BOOL bRet = CWindowImpl<CWzButtonImpl, CButton>::SubclassWindow(hWnd);
if(bRet)
{
Init();
}
return bRet;
}
//##ModelId=43538E3F03BB
void CWzButtonImpl::Init()
{
UINT nBS = GetButtonStyle();
if(nBS & BS_DEFPUSHBUTTON)
m_bDefaultBtn = 1;
else
m_bDefaultBtn = 0;
SetButtonStyle(nBS | BS_OWNERDRAW);
}
//##ModelId=43538E3F03C8
void CWzButtonImpl::InitDefaultColor()
{
// m_crInactiveBg = RGB(222,222,222);
m_crInactiveBg = RGB(215,241,215);
m_crActiveBg = RGB(43,200,213);
m_crText = RGB(0,0,255);
m_crTextHilight = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
m_crBorder = RGB(254,128,62);
}
//##ModelId=43538E3F03C9
void CWzButtonImpl::SetFlat(BOOL bState, BOOL bRepaint)
{
m_bIsFlat = bState;
if(bRepaint)
Invalidate();
}
//##ModelId=43538E3F03D9
void CWzButtonImpl::SetFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint)
{
m_bDrawFlatFocus = bDrawFlatFocus;
// Repaint the button
if(bRepaint)
Invalidate();
} // End of SetFlatFocus
//##ModelId=43538E400011
void CWzButtonImpl::SetInactiveBgColor(COLORREF crNew, BOOL bRepaint)
{
m_crInactiveBg = crNew;
if(bRepaint)
Invalidate();
}
//##ModelId=43538E400003
void CWzButtonImpl::SetActiveBgColor(COLORREF crNew, BOOL bRepaint)
{
m_crActiveBg = crNew;
if (bRepaint)
Invalidate();
}
//##ModelId=43538E40001F
void CWzButtonImpl::SetTextInactiveColor(COLORREF crNew, BOOL bRepaint)
{
m_crText = crNew;
if (bRepaint)
Invalidate();
}
//##ModelId=43538E400022
void CWzButtonImpl::SetTextActiveColor(COLORREF crNew, BOOL bRepaint)
{
m_crTextHilight = crNew;
if (bRepaint)
Invalidate();
}
//##ModelId=43538E40002F
void CWzButtonImpl::SetBorderColor(COLORREF crNew, BOOL bRepaint)
{
m_crBorder = crNew;
if (bRepaint)
Invalidate();
}
//##ModelId=43538E40003F
LRESULT CWzButtonImpl::OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
if(m_MouseOnButton == 1)
{
ReleaseCapture();
Invalidate();
}
return 0;
}
//##ModelId=43538E400053
LRESULT CWzButtonImpl::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
LRESULT lr = CWindowImpl<CWzButtonImpl, CButton>::DefWindowProc(uMsg,wParam,lParam);
bHandled = TRUE;
POINT point = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
UINT nFlags = wParam;
// HWND hWnd; // Finestra attiva
HWND hParent; // Finestra che contiene il bottone
// If the mouse enter the button with the left button pressed then do nothing
if (nFlags & MK_LBUTTON && m_MouseOnButton == 0)
return lr;
// If our button is not flat then do nothing
if (m_bIsFlat == 0)
return lr;
//hWnd = ::GetActiveWindow();
hParent = ::GetParent(m_hWnd);
if ((::GetCapture() != m_hWnd) && (hParent != NULL))
{
m_MouseOnButton = 1;
//SetFocus(); // Thanks Ralph!
SetCapture();
Invalidate();
}
else
{
RECT rc;
GetClientRect(&rc);
if (!PtInRect(&rc,point))
{
// Redraw only if mouse goes out
if (m_MouseOnButton == 1)
{
m_MouseOnButton = 0;
Invalidate();
}
// If user is NOT pressing left button then release capture!
if (!(nFlags & MK_LBUTTON))
ReleaseCapture();
}
}
return lr;
}
//##ModelId=43538E400061
LRESULT CWzButtonImpl::OnSetCursor(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// If a cursor was specified then use it!
if (m_hBtnCursor != NULL)
{
::SetCursor(m_hBtnCursor);
bHandled = TRUE;
return TRUE;
}
return 0;
}
//##ModelId=43538E400070
LRESULT CWzButtonImpl::OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// If our button is not flat then do nothing
if (m_bIsFlat == 0)
return 0;
// if (m_MouseOnButton == 1)
// {
m_MouseOnButton = 0;
Invalidate();
// }
return 0;
}
//##ModelId=43538E40007F
void CWzButtonImpl::DrawItem (LPDRAWITEMSTRUCT lpdis)
{
HPEN hOldPen;
BOOL bIsPressed = (lpdis->itemState & ODS_SELECTED);
BOOL bIsFocused = ::GetFocus() == m_hWnd;//(lpdis->itemState & ODS_FOCUS) == ODS_FOCUS;
BOOL bIsDisabled = (lpdis->itemState & ODS_DISABLED);
// BOOL bIsDefault = (lpDIS->itemState & ODS_DEFAULT);
HDC hDC = lpdis->hDC;
RECT itemRect = lpdis->rcItem;
SetBkMode(hDC,TRANSPARENT);
if (m_bIsFlat == 0)
{
if (bIsFocused || m_bDefaultBtn == 1)
{
HBRUSH hbr = CreateSolidBrush(RGB(0,0,0));
FrameRect(hDC,&itemRect, hbr);//draw a black color thin line around button
DeleteObject(hbr);
InflateRect(&itemRect,-1,-1);
}
}
// Prepare draw... paint button's area with background color
COLORREF crBkgnd,crText,crFrame;
if(bIsDisabled)
{
crFrame = GetSysColor(COLOR_INACTIVEBORDER);
crText = GetSysColor(COLOR_GRAYTEXT);
crBkgnd = m_crInactiveBg;
}
else
{
if ((m_MouseOnButton == 1) || (bIsPressed))
{
crBkgnd = m_crActiveBg;
crText = m_crTextHilight;
}
else
{
crBkgnd = m_crInactiveBg;
crText = m_crText;
}
crFrame = m_crBorder;
}
//draw background
SetBkColor(hDC, crBkgnd);
ExtTextOut(hDC, 0, 0, ETO_OPAQUE, &itemRect, NULL, 0, NULL);
// Draw pressed button
if (bIsPressed)
{
HPEN penBtnHiLight = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT));//COLOR_3DLIGHT)); // Bianco
HPEN penBtnShadow = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW)); // Grigio scuro
// draw darkline of left-top conner
hOldPen = (HPEN)SelectObject(hDC,penBtnShadow);
MoveToEx(hDC,itemRect.left, itemRect.bottom-1,NULL);
LineTo(hDC,itemRect.left, itemRect.top);
LineTo(hDC,itemRect.right, itemRect.top);
// draw hilight line of right-bottom conner
SelectObject(hDC,penBtnHiLight);
MoveToEx(hDC,itemRect.left, itemRect.bottom-1,NULL);
LineTo(hDC,itemRect.right-1, itemRect.bottom-1);
LineTo(hDC,itemRect.right-1, itemRect.top-1);
//release resource
SelectObject(hDC,hOldPen);
DeleteObject(penBtnShadow);
DeleteObject(penBtnHiLight);
}
else // ...else draw non pressed button
{
if((m_bIsFlat == 0) || (m_bIsFlat == 1 && m_MouseOnButton == 1))
{
HPEN pen3DLight = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT));//COLOR_3DLIGHT)); // Light gray
HPEN penBtnShadow = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW)); // Dark gray
// White line
hOldPen = (HPEN)SelectObject(hDC,pen3DLight);
MoveToEx(hDC,itemRect.left, itemRect.bottom-1,NULL);
LineTo(hDC,itemRect.left, itemRect.top);
LineTo(hDC,itemRect.right, itemRect.top);
// Dark gray line
SelectObject(hDC,penBtnShadow);
MoveToEx(hDC,itemRect.left, itemRect.bottom-1,NULL);
LineT
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Demo.zip (39个子文件)
Demo
Demo.rc 10KB
demo.log 10KB
maindlg.h 3KB
resource.h 1KB
aboutdlg.h 1KB
maindlg.cpp 3KB
dh_window_bg_brush_helper.cpp 1KB
Demo.vcxproj.filters 4KB
Demo.h 11B
Demo.dsp 5KB
Demo.sln 874B
bmpdlg.h 2KB
stdafx.h 953B
Demo.mak 6KB
Common
PaintBkgnd.h 2KB
CtrlColor.h 2KB
ButtonHelp.h 3KB
BitmapBkgnd.h 2KB
CtrlHollowColor.h 2KB
WzButton.h 4KB
WzButton.cpp 10KB
dh_checkbox.cpp 888B
dh_checkbox.h 584B
Demo.dsw 531B
aboutdlg.cpp 655B
dh_window_bg_brush_helper.h 359B
res
ssm1.bmp 70KB
qrj13.bmp 352KB
ssm8.bmp 70KB
studio18c.BMP 12KB
Demo.ico 1KB
Demo.exe.manifest 582B
Demo.suo 47KB
Demo.vcxproj.user 143B
stdafx.cpp 281B
Demo.cpp 2KB
Demo.dep 2KB
Demo.vcxproj 9KB
bmpdlg.cpp 8KB
共 39 条
- 1
资源评论
- yangming_h2014-12-20这个checkbox无法和改变鼠标形状的代码兼容
- poopooptt2019-05-28垃圾,编译不通过!
- 竹a艟2015-08-08不好用。。。。
- ask_loft2018-03-22只是一种思路,没有从根本上解决问题
Peter(阿斯拉达)
- 粉丝: 747
- 资源: 60
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功