* pFont = GetFont();
ASSERT(pFont);
LOGFONT lf;
pFont->GetLogFont(&lf);
lf.lfUnderline = TRUE;
fUnderline.CreateFontIndirect(&lf);
}
pOldFont = pDC->SelectObject(&fUnderline);
}
else pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT));
pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
if (pOldFont) pDC->SelectObject(pOldFont);
}
}
2.定制的消息处理函数
void OnMouseMove(UINT nFlags, CPoint point)
{
//设置一个定时器
SetTimer(1,10,NULL);
//
}
当鼠标光标移到按钮上时,执行此函数,定时器将发送一个 WM_TIMER消息到消息队列。
由OnTimer(UINT nIDEvent)函数处理这个消息。
void OnTimer(UINT nIDEvent)
{
//处理WM_TIMER消息
static bool pPainted = false;
POINT pt;
GetCursorPos(&pt);
CRect rect;
GetWindowRect (rect);
if (bLBtnDown)
{
KillTimer (1);
if (pPainted) InvalidateRect (NULL);
pPainted = FALSE;
return;
}
if (!rect.PtInRect (pt))
{
bHighlight = false;
KillTimer (1);
if (pPainted)
InvalidateRect(NULL);
pPainted = false;
return;
}
else
{
bHighlight = true;
if (!pPainted)
{
pPainted = true;
InvalidateRect(NULL);
}
}
//
CButton::OnTimer(nIDEvent);
}
BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
//当鼠标光标移到按钮上时,改变光标的形象
if (bHighlight)
{
::SetCursor(hHand);
return true;
}
//
}
int OnCreate(LPCREATESTRUCT lpCreateStruct)
{
CFont * pFont = GetFont();
ASSERT(pFont);
LOGFONT lf;
pFont->GetLogFont(&lf);
lf.lfUnderline = TRUE;
fUnderline.CreateFontIndirect(&lf);
}
这个函数由框架在显示出按钮之前自动调用,我在这里初始化在按钮上显示的字体。
void OnLButtonUp(UINT nFlags, CPoint point)
{
bLBtnDown = false;
if (bHighlight)
{
bHighlight = false;
InvalidateRect(NULL);
}
}
当按下按钮又放开时调用这个函数。
void OnLButtonDown(UINT nFlags, CPoint point)
{
bLBtnDown = true;
}
当按下按钮时调用这个函数。
BOOL OnEraseBkgnd(CDC* pDC)
{
COLORREF cr = GetSysColor(COLOR_3DFACE);
int r = GetRValue(cr);
int g = GetGValue(cr);
int b = GetBValue(cr);
if (r > 1) r -= 2;
if (g > 1) g -= 2;
if (r <3 && g < 3 && b < 253) b +=2;
COLORREF cr1 = RGB(r,g,b);
CRect rc;
GetClientRect(rc);
pDC->FillSolidRect(rc, cr1);
}
当按钮的背景需要重画时,应用
程序框架调用此函数。编译并运行PROJECT LinkBtn