我这样写,不过不起作用,鼠标放到某个item 上面是,还是没有出现我要的 FocusRect。
CDC dc;
CRect rect(&(lpDrawItemStruct->rcItem));
dc.Attach(lpDrawItemStruct->hDC);
CBrush bckBrush(m_backColor);
dc.FillRect(&rect,&bckBrush);
if(lpDrawItemStruct->itemState&ODS_SELECTED)
{
dc.DrawFocusRect(&rect);
}
CDC dc;
CRect rect(&(lpDrawItemStruct->rcItem));
dc.Attach(lpDrawItemStruct->hDC);
CBrush bckBrush(m_backColor);
dc.FillRect(&rect,&bckBrush);
if(lpDrawItemStruct->itemState&ODS_SELECTED)
{
dc.DrawFocusRect(&rect);
}
{
dc.DrawFocusRect(&rect);
}
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//
// 自绘按钮的实现
//
// 作者: 王景生
//
// 时间: 2003-9-17
//
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#if !defined(AFX_BUTTONEX_H__7356059F_1B24_4236_87CC_92AAEDD7689F__INCLUDED_)
#define AFX_BUTTONEX_H__7356059F_1B24_4236_87CC_92AAEDD7689F__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ButtonEx.h : header file
///////////////////////////////////////////////////////////////////////////////
// CButtonEx windowclass CButtonEx : public CButton
{
private:
UINT m_bmpID;
BOOL m_bHasBmp;
BOOL m_bHasText;
BOOL m_bTracking;
BOOL m_bHover;
BOOL m_bDrawBorder;
BOOL m_bFlat;
// Construction
public:
CButtonEx();// Attributes
public:// Operations
public:// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CButtonEx)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
protected:
virtual void PreSubclassWindow();
virtual void CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType = adjustBorder);
//}}AFX_VIRTUAL// Implementation
public:
void SetFlat(BOOL bDraw);
void DrawActiveBorder(BOOL bDraw);
void SetButtonExBitamp(UINT bmpID,BOOL bHasText = TRUE);
virtual ~CButtonEx(); // Generated message map functions
protected:
//{{AFX_MSG(CButtonEx)
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//}}AFX_MSG
afx_msg LRESULT OnMouseHover(WPARAM wParam,LPARAM lParam);
afx_msg LRESULT OnMouseLeave(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()
};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_BUTTONEX_H__7356059F_1B24_4236_87CC_92AAEDD7689F__INCLUDED_)// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// 自绘按钮的实现
//
// 作者: 王景生
//
// 时间: 2003-9-17
//----------------------------------------------------------------------
// 公共函数:
// DrawActiveBorder(BOOL bDraw) :鼠标在按钮上时,是否画边框
//
// SetButtonExBitamp(UINT bmpID, BOOL bHasText) :在按钮上放置图片
//
// SetFlat(BOOL bFlat) :按钮是否为Flat
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#include "stdafx.h"
#include "TestXDict.h"
#include "ButtonEx.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif//----------------------------------------------
//构造函数
//功能:变量的初始化
//----------------------------------------------
CButtonEx::CButtonEx()
{
m_bHasBmp = FALSE;
m_bHasText = TRUE;
m_bDrawBorder = TRUE;
m_bTracking = m_bHover = FALSE;
m_bmpID = NULL;
m_bFlat = TRUE;
}CButtonEx::~CButtonEx()
{
}
BEGIN_MESSAGE_MAP(CButtonEx, CButton)
//{{AFX_MSG_MAP(CButtonEx)
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CButtonEx message handlersvoid CButtonEx::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
ModifyStyle(0,BS_OWNERDRAW);
CButton::PreSubclassWindow();
}
//--------------------------------------------------------------
//函数:DrawItem
//功能:实现自绘
//--------------------------------------------------------------
void CButtonEx::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
//prepare
CDC *pDC = CDC::FromHandle(lpDIS->hDC);
CRect rc = lpDIS->rcItem;
UINT state = lpDIS->itemState; CString strText;
GetWindowText(strText);
CSize szText = pDC->GetTextExtent(strText);
//draw bitmap
if(m_bHasBmp)
{
//load bitmap
CBitmap bmp;
bmp.LoadBitmap(m_bmpID);
BITMAP bm;
bmp.GetObject(sizeof(bm),&bm);
rc.bottom = rc.top + 4 + bm.bmHeight + 4; //draw
CRect rcBmp;
rcBmp.left = 4;
rcBmp.top = 4;
rcBmp.right = rcBmp.left + bm.bmWidth;
rcBmp.bottom = rcBmp.top + bm.bmHeight;
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap *pOldBmp = memDC.SelectObject(&bmp);
pDC->StretchBlt(rcBmp.left,rcBmp.top,rcBmp.Width(),rcBmp.Height(),
&memDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
memDC.SelectObject(pOldBmp); if(m_bHasText)
{
CRect rcText(rc);
rcText.left = rcBmp.right + 2;
rcText.right = rcText.left + szText.cx + 2;
pDC->DrawText(strText,rcText, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
rc.right = rcText.right + 4;
}
else
rc.right = rcBmp.right + 4;
}
else
{
CRect rcText(rc);
rcText.right = szText.cy;
pDC->DrawText(strText,rcText,DT_VCENTER | DT_SINGLELINE);
rc.right = rcText.right + 4;
}
//draw ButtonEx border
if(m_bFlat)
{
if(m_bDrawBorder)
{
if(m_bHover)
pDC->Draw3dRect(0,0,rc.Width(),rc.Height(),GetSysColor(COLOR_BTNHILIGHT),GetSysColor(COLOR_BTNSHADOW));
if(state & ODS_SELECTED)
pDC->Draw3dRect(0,0,rc.Width(),rc.Height(),GetSysColor(COLOR_BTNSHADOW),GetSysColor(COLOR_BTNHILIGHT));
}
}
else
pDC->Draw3dRect(0,0,rc.Width(),rc.Height(),GetSysColor(COLOR_BTNHILIGHT),GetSysColor(COLOR_BTNSHADOW));
}void CButtonEx::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)
{
// TODO: Add your specialized code here and/or call the base class
CButton::CalcWindowRect(lpClientRect, nAdjustType);
}
//-----------------------------------------------------------
//函数:SetButtonExBitmap
//-----------------------------------------------------------
void CButtonEx::SetButtonExBitamp(UINT bmpID, BOOL bHasText)
{
m_bmpID = bmpID;
m_bHasBmp = TRUE;
m_bHasText = bHasText;
InvalidateRect(NULL);
}
//-----------------------------------------------------------------
//函数:OnMouseMove
//-----------------------------------------------------------------
void CButtonEx::OnMouseMove(UINT nFlags, CPoint point)
{
if(!m_bTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.dwHoverTime = 1;
tme.hwndTrack = this->m_hWnd;
m_bTracking = _TrackMouseEvent(&tme);
}
CButton::OnMouseMove(nFlags, point);
}
//------------------------------------------------------------------
//函数:OnMouseHover
//------------------------------------------------------------------
LRESULT CButtonEx::OnMouseHover(WPARAM wParam,LPARAM lParam)
{
m_bHover = TRUE;
InvalidateRect(NULL);
return 1;
}
//------------------------------------------------------------------
//函数:OnMouseMove
//-----------------------------------------------------------------
LRESULT CButtonEx::OnMouseLeave(WPARAM wParam,LPARAM lParam)
{
m_bHover = FALSE;
m_bTracking = FALSE;
InvalidateRect(NULL);
return 1;
}
//--------------------------------------------------------------
//函数:DrawButtonExBorder
//功能:当鼠标经过按钮时,是否要为按钮画边框
//--------------------------------------------------------------
void CButtonEx::DrawActiveBorder(BOOL bDraw)
{
m_bDrawBorder = bDraw;
InvalidateRect(NULL);
}
//-------------------------------------------------------------
//函数:SetFlat()
//功能:设置Flat样试的按钮
//-------------------------------------------------------------
void CButtonEx::SetFlat(BOOL bFlat)
{
m_bFlat = FALSE;
InvalidateRect(NULL);
}