15,978
社区成员
发帖
与我相关
我的任务
分享
if(m_bInButton)
{
dc->RoundRect(rect.left,rect.top,rect.right,rect.bottom,5,5);
}
else
{
dc->RoundRect(rect.left+20,rect.top+20,rect.right-20,rect.bottom-20,5,5);
}
LRESULT CMyButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_bInButton = FALSE;
m_bButtonDown = FALSE;
Invalidate();
return 0;
}
LRESULT CMyButton::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
m_bInButton = TRUE;
Invalidate();
return 0;
}
// MyButton.cpp : 实现文件
//
#include "stdafx.h"
#include "MFCProSafe.h"
#include "MyButton.h"
// CMyButton
IMPLEMENT_DYNAMIC(CMyButton, CButton)
CMyButton::CMyButton()
{
m_iBitmap = 0;
m_bInButton = FALSE;
m_bButtonDown = FALSE;
}
CMyButton::~CMyButton()
{
}
BEGIN_MESSAGE_MAP(CMyButton, CButton)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_ERASEBKGND()
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
END_MESSAGE_MAP()
// CMyButton 消息处理程序
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 添加您的代码以绘制指定项
CRect rect;
GetClientRect(rect);
CDC* dc;
dc = CDC::FromHandle(lpDrawItemStruct->hDC);
int nSavedDC = dc->SaveDC();
UINT state = lpDrawItemStruct->itemState;
m_Rgn = CreateRoundRectRgn(rect.left,rect.top,rect.right,rect.bottom,5,5);
SetWindowRgn(m_Rgn,TRUE);
DrawNormalButton(dc,state);
dc->RestoreDC(nSavedDC);
}
void CMyButton::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CButton::OnLButtonDown(nFlags, point);
}
void CMyButton::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CButton::OnLButtonUp(nFlags, point);
}
LRESULT CMyButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_bInButton = FALSE;
m_bButtonDown = FALSE;
CRect rect;
GetClientRect(&rect);
ClientToScreen(&rect);
GetParent()->ScreenToClient(&rect);
GetParent()->InvalidateRect(rect,TRUE);
return 0;
}
LRESULT CMyButton::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
m_bInButton = TRUE;
InvalidateRect(NULL);
return 0;
}
void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (!m_bButtonDown)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
m_bButtonDown = _TrackMouseEvent(&tme);
}
CButton::OnMouseMove(nFlags, point);
}
BOOL CMyButton::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return TRUE;
// return CButton::OnEraseBkgnd(pDC);
}
void CMyButton::DrawCirButton(CDC* dc,UINT state)
{
}
void CMyButton::DrawNormalButton(CDC* dc,UINT state)
{
CRect rect;
GetClientRect(&rect);
CPen NewPen;
CPen NewNextPen;
CPen* OldPen;
CBrush NewBrush;
CBrush* OldBrush;
NewBrush.CreateStockObject(NULL_BRUSH);
OldBrush = dc->SelectObject(&NewBrush);
/* if((state&ODS_SELECTED)||(state&ODS_FOCUS))
{
dc->RoundRect(rect.left,rect.top,rect.right,rect.bottom,5,5);
}
*/
if(m_bInButton)
{
dc->RoundRect(rect.left,rect.top,rect.right,rect.bottom,5,5);
}
HICON hLogo = AfxGetApp()->LoadIcon(m_iIcon);
DrawIconEx(dc->m_hDC,rect.left+((rect.Width()-32)/2),rect.top+10,hLogo,32,32,0,0,DI_NORMAL);
dc->SetBkMode(TRANSPARENT);
CString str;
NewPen.CreateStockObject(BLACK_PEN);
OldPen = dc->SelectObject(&NewPen);
GetWindowText(str);
// dc->SetTextColor(m_textcolor);
dc->DrawText(str,CRect(rect.left+8,rect.top+50,rect.right-10,rect.bottom-10),DT_CENTER|DT_VCENTER|DT_SINGLELINE);
dc->SelectObject(OldBrush);
dc->SelectObject(OldPen);
}
void CMyButton::SetButtonBitmap(UINT uiBitmap)
{
m_iBitmap = uiBitmap;
}
void CMyButton::SetButtonIcon(UINT iIcon)
{
m_iIcon = iIcon;
Invalidate();
}
void CMyButton::DrawButtonBorder(CDC* dc)
{
CRect rect;
GetClientRect(&rect);
TRIVERTEX vert[2] ;
GRADIENT_RECT gRect;
vert [0] .x = rect.left;
vert [0] .y = rect.top;
vert [0] .Red = 0xff00;
vert [0] .Green = 0xff00;
vert [0] .Blue = 0x3700;
vert [0] .Alpha = 0x0000;
vert [1] .x = rect.left+rect.Width();
vert [1] .y = rect.top+10;
vert [1] .Red = 0xff00;
vert [1] .Green = 0xff00;
vert [1] .Blue = 0xff00;
vert [1] .Alpha = 0x0000;
gRect.UpperLeft = 0;
gRect.LowerRight = 1;
dc->GradientFill(vert,2,&gRect,1,GRADIENT_FILL_RECT_V);
}
...
LRESULT CMyButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_bInButton = FALSE;
m_bButtonDown = FALSE;
CRect rect;
GetClientRect(&rect);
ClientToScreen(&rect);
GetParent()->ScreenToClient(&rect);
GetParent()->InvalidateRect(rect,TRUE);
return 0;
}