我这样写,不过不起作用,鼠标放到某个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);
}

解决方案 »

  1.   

    if (lpDrawItemStruct->itemState&ODS_FOCUS)
    {
    dc.DrawFocusRect(&rect);
    }
      

  2.   

    还是一样啊,鼠标在comboBox中上下滑动时还是没有出那个蓝色的 FocusRect我想要这个comboBox 和CComboBox 一样在鼠标上下滑动时有个蓝色的 FocusRect 出现在焦点位置
      

  3.   

    看看这个
    // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    //
    // 自绘按钮的实现
    // 
    // 作者: 王景生
    //
    // 时间: 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);
    }