ComboBox自绘

 ComboBox,即组合框,由Edit、Button、ListBox组成。

下面程序实现自绘ComboBox,效果如图所示

 

 

 

#if !defined(AFX_CBEX_H__DB51125A_4B4E_45A0_A855_854D850EBE1A__INCLUDED_)
#define AFX_CBEX_H__DB51125A_4B4E_45A0_A855_854D850EBE1A__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// CBEx.h : header file
//

/
// CCBEx window
#include "EditEx.h"
#include "listBoxEx.h"
class CCBEx : public CComboBox
{
// Construction
public:
 CCBEx();
    int m_nWidthDropBt;
 int m_nWidthDropList;
 CEditEx m_editEx;
 CComboBox m_lbEx;
    void Init(CListBox *pLB);
// Attributes
public:

// Operations
public:

// Overrides
 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CCBEx)
 public:
 virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
 virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
 protected:
 virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
 //}}AFX_VIRTUAL

// Implementation
public:
 virtual ~CCBEx();

 // Generated message map functions
protected:
 //{{AFX_MSG(CCBEx)
 afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
 afx_msg void OnPaint();
 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
 afx_msg void OnDestroy();
 afx_msg void OnDropdown();
 afx_msg void OnCloseup();
 afx_msg void OnMouseMove(UINT nFlags, CPoint point);
 //}}AFX_MSG

 DECLARE_MESSAGE_MAP()
};

/

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_CBEX_H__DB51125A_4B4E_45A0_A855_854D850EBE1A__INCLUDED_)

// CBEx.cpp : implementation file
//

#include "stdafx.h"
#include "ComboTest.h"
#include "CBEx.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// CCBEx

CCBEx *g_cbEx = NULL;
BOOL g_bInit = FALSE;
int g_nIndexIn = -1;
int g_nIndexInLast = -1;

CCBEx::CCBEx()
{
 m_nWidthDropBt = 100;
 m_nWidthDropList = 100;
 
}

CCBEx::~CCBEx()
{
}

 

BEGIN_MESSAGE_MAP(CCBEx, CComboBox)
 //{{AFX_MSG_MAP(CCBEx)
 ON_WM_CTLCOLOR()
 ON_WM_PAINT()
 ON_WM_LBUTTONDOWN()
 ON_WM_DESTROY()
 ON_CONTROL_REFLECT(CBN_DROPDOWN, OnDropdown)
 ON_CONTROL_REFLECT(CBN_CLOSEUP, OnCloseup)
 ON_WM_MOUSEMOVE()
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CCBEx message handlers
CBrush g_brushItem1(RGB(255, 0, 0));
CBrush g_brushItem2(RGB(255, 255, 0));
CBrush g_brushItem3(RGB(255, 0, 255));
CBrush g_brushItemSelected(RGB(0, 122, 122));
void CCBEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 // TODO: Add your code to draw the specified item

 HWND hWndParent = ::GetParent(lpDrawItemStruct->hwndItem);
    HDC hDC = ::GetDC(hWndParent);

 ::DeleteDC(hDC);


 CRgn rgn;
 rgn.CreateEllipticRgn(lpDrawItemStruct->rcItem.left,
           lpDrawItemStruct->rcItem.top,
        lpDrawItemStruct->rcItem.right,
        lpDrawItemStruct->rcItem.bottom);


 
 CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
 CString sItem;
 GetLBText(lpDrawItemStruct->itemID, sItem);
    CRect rcItem = lpDrawItemStruct->rcItem;
 if(g_nIndexIn != -1 && (int)lpDrawItemStruct->itemID == g_nIndexIn)
 {
      pDC->FillRgn(&rgn, &g_brushItemSelected);

 }
 else
 {
  switch(lpDrawItemStruct->itemID % 3)
  {
  case 0:
      pDC->FillRgn(&rgn, &g_brushItem1);
   break;
  case 1:
      pDC->FillRgn(&rgn, &g_brushItem2);
   break;
  case 2:
      pDC->FillRgn(&rgn, &g_brushItem3);
   break;
  }

 }


 
 pDC->SetBkMode(TRANSPARENT);

 pDC->SetTextColor(RGB(0, 0, 0));
 if((g_nIndexIn != -1) && (g_nIndexIn == (int)lpDrawItemStruct->itemID))
 {
        pDC->SetTextColor(RGB(255, 255, 255));
 }
 pDC->TextOut(rcItem.left + rcItem.Width() / 2 - 3,
           rcItem.top + rcItem.Height() / 2 - 7,
           sItem);
    rgn.DeleteObject();
}
LONG wndproc = NULL;
LONG wndprocOld = NULL;

CBrush g_brushDropList(RGB(0, 255, 0));
LRESULT CALLBACK epassProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{


    if (uMsg == WM_CREATE)
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
 
 }

    if(uMsg == WM_DESTROY) //0x0002
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
   }

    if(uMsg == WM_MOVE) //0x0003
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
    }

    if(uMsg == WM_SIZE) //0x0005
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

    if(uMsg == WM_ACTIVATE) //0x0006
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

    if(uMsg == WM_SETFOCUS) //0x0007
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }
    if(uMsg == WM_KILLFOCUS) //0x0008
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

 if(uMsg == WM_PAINT)
 {
//  TRACE("WM_PAINT/n");
//  return TRUE;
  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
 }
 if(uMsg == WM_NCPAINT)
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
 }

 

    if(uMsg == WM_ERASEBKGND) //绘制背景,
 {
  CListBox *pLB = (CListBox*)CListBox::FromHandle(hwnd);
  CDC *pDC = CDC::FromHandle((HDC)wParam); 
  CRect rcLB;
        pLB->GetClientRect(rcLB);
        pDC->FillRect(rcLB, &g_brushDropList);
  return TRUE;
  }

    if(uMsg == WM_SHOWWINDOW) //0x0018
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

    if(uMsg == WM_ACTIVATEAPP) //0x001c
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
 }

    if(uMsg == WM_DRAWITEM)
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);

 }
 
    if(uMsg == WM_WINDOWPOSCHANGING) //0x0046
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

    if(uMsg == WM_WINDOWPOSCHANGED) //0x0047
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
 }

    if(uMsg == WM_STYLECHANGING) //0x007c
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
   }
    if(uMsg == WM_STYLECHANGED) //0x007d
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }
    if(uMsg == WM_NOTIFY) //0x007e
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }


    if(uMsg == WM_GETICON) //0x007f
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }


    if(uMsg == WM_NCDESTROY )//0x0082
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }


    if(uMsg == WM_NCCALCSIZE) //0x0083
 {

//      LPNCCALCSIZE_PARAMS pNcCalcSizeParam = (LPNCCALCSIZE_PARAMS)lParam;
//  pNcCalcSizeParam->rgrc[0].left -= 17;

//  DWORD dwStyle = ::GetWindowLong(hwnd, GWL_STYLE);  
//  if(dwStyle & WM_VSCROLL)
//  {
//
//  }
//  else
//  {
//
//   }

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

    if(uMsg == WM_NCACTIVATE) //0x0086
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
   }
    if(uMsg == WM_GETDLGCODE) //0x0087
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
   }

    if(uMsg == WM_NCLBUTTONDOWN) //0x00a1
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
   }

 

    if(uMsg == 0x00af) //
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
 }

    if(uMsg == WM_KEYUP) //0x0101
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

    if(uMsg == WM_SYSCOMMAND) //0x0101
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }
    if(uMsg == WM_COMMAND)
 {
  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
 }
    if(uMsg == WM_VSCROLL) //0x0115
 {

//  CWnd *pWnd = CWnd::FromHandle(hwnd);
//  CWnd *pParent = pWnd->GetParent();
//  CRect rcClient;
//   pWnd->GetClientRect(rcClient);
//  pWnd->ClientToScreen(rcClient);
//  pParent->ScreenToClient(rcClient);
//  CWnd *pParentCB = g_cbEx->GetParent();
//  pParentCB->ScreenToClient(rcClient);
//   pParentCB->InvalidateRect(rcClient, TRUE);
//  pParent->InvalidateRect(rcClient, TRUE);
  
  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

    if(uMsg == WM_HSCROLL)//0x1501
 {
       
  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

 if(uMsg == WM_CTLCOLOREDIT)
 {
  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

 if(uMsg == WM_CTLCOLORLISTBOX)
 {
  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

    if(uMsg == LB_SETCURSEL) //0x0186
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

    if(uMsg == LB_GETCURSEL) //0x0188
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

 

    if(uMsg == LB_GETTEXT) //0x0189
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

    if(uMsg == LB_GETTEXTLEN) //0x018a
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
 }

    if(uMsg == LB_GETCOUNT) //0x018b
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
   }
    if(uMsg == LB_SELECTSTRING) //0x018c
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
   }
    if(uMsg == LB_GETTOPINDEX) //0x018e
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
   }


    if(uMsg == LB_FINDSTRING) //0x018f
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
   }

    if(uMsg == LB_GETITEMRECT) //0x0198
 {

  
  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
   }

 if(uMsg == LB_SETCARETINDEX)//0x019e
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

 if(uMsg == LB_SETTOPINDEX)//0x0197
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

 if(uMsg == LB_GETITEMHEIGHT)//0x01a1
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

 if(uMsg == LB_FINDSTRINGEXACT)//0x01a2
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

    if(uMsg == 0x01ae)
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
   }

    if(uMsg == 0x01af)
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
 }
    if(uMsg == WM_MOUSEMOVE)//0x0200
 {
//  TRACE("WM_PRINT/n");
  CListBox *pLB = (CListBox*)CListBox::FromHandle(hwnd);
  int nIndexTop = pLB->GetTopIndex();
//  TRACE("nIndexTop = %d/n", nIndexTop);
  POINT point;
  GetCursorPos(&point);

  CPoint pt(point.x, point.y);
  pLB->ScreenToClient(&pt);

  CRect rcClient;
  pLB->GetClientRect(rcClient);
        CRect rcItem;
  int nIndex = -1;
  for(int i = nIndexTop; i < pLB->GetCount();i++)
  {
   pLB->GetItemRect(i, rcItem);
   if(rcItem.PtInRect(pt))
   {
    nIndex = i;
    break;

   }
   
   if(rcItem.bottom > rcClient.bottom || rcItem.top < 0)
   {
    break;
   }

   if(pt.x < 0 || pt.y < 0 || pt.x > rcClient.right || pt.y > rcClient.bottom)
   {
    break;
   }
   
   }

  if(g_nIndexIn != nIndex)
  {

            g_nIndexInLast = g_nIndexIn;
            g_nIndexIn = nIndex;
//   pLB->Invalidate();
   if(g_nIndexInLast != -1)
   {
    CRect rcItemLast;
    pLB->GetItemRect(g_nIndexInLast, rcItemLast);
                pLB->InvalidateRect(rcItemLast, TRUE);

    }
   TRACE("g_nIndexInLast = %d/n", g_nIndexInLast);


   if(g_nIndexIn != -1)
   {
    CRect rcItem;
    pLB->GetItemRect(g_nIndexIn, rcItem);
                pLB->InvalidateRect(rcItem, TRUE);

    }
   TRACE("nIndex = %d/n/n", nIndex);

  }

  


  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
 }

    if(uMsg == WM_LBUTTONDOWN)//0x0201
 {
 
  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

    if(uMsg == WM_LBUTTONUP)//0x0202
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }
    if(uMsg == WM_MOUSEWHEEL) //0x020a
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }
    if(uMsg == WM_CAPTURECHANGED) //0x0215
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
 }


    if(uMsg == WM_IME_SETCONTEXT) //0x0281
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

    if(uMsg == WM_IME_NOTIFY) //0x0282
 {

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);
  }

    if (uMsg == WM_PRINT) //0x0317
 {
      
//  TRACE("WM_PRINT/n");
  CListBox *pLB = (CListBox*)CListBox::FromHandle(hwnd);
  
  //移动窗口  
  if(g_cbEx != NULL)
  {
 
   CRect rect;
      pLB->GetWindowRect(&rect);

   CRect rcCB;
   g_cbEx->GetWindowRect(rcCB);
   rect.left = rcCB.left + 120;
   rect.right = rcCB.right + 20;
    rect.bottom = rcCB.bottom + 150;
   pLB->MoveWindow(&rect);
  }
  //注意每次ShowDropDown就发送该消息,
  //得把它转给WM_PAINT

  //设置窗口有效区域
//  if(g_cbEx != NULL)
//  {
//      if(!g_bInit)
//   {
//                g_cbEx->Init(pLB);
//    g_bInit = FALSE;
//   }
//  
//   }

//      pLB->ShowScrollBar(SB_VERT, TRUE);

  int nOp = 0;

  //
  if(lParam & PRF_CHECKVISIBLE)
  {
//   nOp |= PRF_CHECKVISIBLE;
   }

  //背景重新绘制:WM_ERASEBKGND。
  if(lParam & PRF_ERASEBKGND)
  {
   nOp |= PRF_ERASEBKGND;
   }

  //滚动条等非客户区重新绘制。
  if(lParam & PRF_NONCLIENT)
  {
   nOp |= PRF_NONCLIENT;
   }

  //客户区重新绘制:WM_PRINTCLIENT。
  if(lParam & PRF_CLIENT)
  {
   nOp |= PRF_CLIENT;
  }
 
  //子窗口绘制,注意滚动条不属于自窗口它和ListBox并列。
  if(lParam & PRF_CHILDREN)
  {
//   nOp |= PRF_CHILDREN;
   }

  //父窗口绘制。
  if(lParam & PRF_OWNED)
  {
//   nOp |= PRF_OWNED; 
   }  

//  pLB->Invalidate(TRUE);

  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,(LPARAM)nOp); 

   
 }

    if (uMsg == WM_PRINTCLIENT) //绘制Item
 {
//     TRACE("WM_PRINTCLIENT!/n"); 
  return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam); 
//  return TRUE;

 }

 TRACE("%08x,%04x,%d,%d/n", hwnd, uMsg, wParam, lParam);
 return CallWindowProc((WNDPROC)wndprocOld,hwnd,uMsg,wParam,lParam);;

}

HBRUSH CCBEx::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 


    HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
 if(wndprocOld != NULL)
 {
  return hbr;
  }
 CRect rcClient;
 this->GetClientRect(rcClient);
 switch(nCtlColor)
 {
 case CTLCOLOR_EDIT:
  {
   if(m_editEx.GetSafeHwnd() == NULL)
   {
    m_editEx.SubclassWindow(pWnd->m_hWnd);
   }
   CRect rect;
   pWnd->GetWindowRect(&rect);
   pWnd->MoveWindow(CRect(1, 21, rcClient.right - m_nWidthDropBt, rcClient.bottom - 21));

  }
  break;
 case CTLCOLOR_LISTBOX:
  {    
   this->ClientToScreen(rcClient);           
   CRect rect;
   pWnd->GetWindowRect(&rect);

   rect.left = 0; //rcClient.right - m_nWidthDropBt / 2 - m_nWidthDropList / 2;
   rect.right = 0; //rect.left + m_nWidthDropList;
   rect.top = 0; //rcClient.bottom;
   rect.bottom = 0; //rcClient.bottom + 150;
   pWnd->MoveWindow(&rect);
           
   if(wndprocOld == NULL)
   {

       wndprocOld = GetWindowLong(pWnd->m_hWnd, GWL_WNDPROC);
    SetWindowLong(pWnd->m_hWnd, GWL_WNDPROC, (long)epassProc);
    
    UINT nStyle = GetWindowLong(pWnd->m_hWnd, GWL_STYLE);
    nStyle &= ~WS_BORDER;
    SetWindowLong(pWnd->m_hWnd, GWL_STYLE, WS_CHILD | nStyle/*| WS_VISIBLE*/);
    
    SetWindowLong(pWnd->m_hWnd, GWL_EXSTYLE, WS_CHILD | WS_EX_LEFTSCROLLBAR);
    
    
                g_cbEx = this;
//    int iStyle = g_cbEx->GetStyle();
//     g_cbEx->ModifyStyle(0, iStyle | LBS_NOTIFY);

      
   }   
            

  }
  break;
    }

 return hbr;
 // TODO: Change any attributes of the DC here
 
}
void CCBEx::Init(CListBox *pLB)
{
 DWORD dwStyle = GetWindowLong(pLB->m_hWnd, GWL_STYLE);

 int nWidScroll = 0;
    if(dwStyle & WM_VSCROLL)
 {
         nWidScroll = ::GetSystemMetrics(SM_CXVSCROLL);
 }

 CRect rcItem;
 CRgn rgnClient;
 rgnClient.CreateRectRgn(0, 0, 0, 0);
    CRgn rgnItem;
    for(int i = 0; i < pLB->GetCount(); i++)
 {
  pLB->GetItemRect(i, rcItem);
        rgnItem.CreateEllipticRgn(rcItem.left, rcItem.top, rcItem.right, rcItem.bottom);
        rgnClient.CombineRgn(&rgnClient, &rgnItem, RGN_OR);
  rgnItem.DeleteObject();

 }


// CRect rcClient;
// GetClientRect(rcClient);
// rcClient.right = rcClient.left;
//  rgnItem.CreateRectRgn(1, 1, rcClient.right, 99/*rcClient.bottom*/);
//  rgnClient.CombineRgn(&rgnClient, &rgnItem, RGN_OR);
//  rgnItem.DeleteObject();

    pLB->SetWindowRgn(rgnClient, FALSE);

 rgnClient.DeleteObject();
}


void CCBEx::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
 // TODO: Add your code to determine the size of specified item
// lpMeasureItemStruct->itemHeight = 100;
}

CBrush g_brushDropBt(RGB(0, 255, 0));
CPen g_penEdit(PS_SOLID, 2, RGB(0, 255, 0));
void CCBEx::OnPaint()
{
 CPaintDC dc(this); // device context for painting
    CRect rcClient;
 this->GetClientRect(rcClient);
 CRect rcEdit = rcClient;
 rcEdit.right = rcClient.right - m_nWidthDropBt + 1;
 rcEdit.top += 20;
 rcEdit.bottom -= 20;
 CRgn rgnEdit;
 rgnEdit.CreateRectRgn(rcEdit.left, rcEdit.top, rcEdit.right, rcEdit.bottom);

 CPen *pOldPen = dc.SelectObject(&g_penEdit);
 dc.Rectangle(rcEdit);
 CRect rcBt = rcClient;
 rcBt.left = rcClient.right - m_nWidthDropBt + 1;
 CRgn rgn;
 rgn.CreateEllipticRgn(rcBt.left, rcBt.top, rcBt.right, rcBt.bottom);
 dc.FillRgn(&rgn, &g_brushDropBt);
 rgn.CombineRgn(&rgn, &rgnEdit, RGN_OR);
 this->SetWindowRgn(rgn, TRUE);

 dc.SelectObject(pOldPen);
 rgnEdit.DeleteObject();
 rgn.DeleteObject();
   

 // TODO: Add your message handler code here
 
 // Do not call CComboBox::OnPaint() for painting messages
}

void CCBEx::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default

// this->SetFocus();
// this->SetCurSel(0); 

 if(wndprocOld == NULL)
 {
     ShowDropDown(TRUE);
     ShowDropDown(FALSE);
 }
 ShowDropDown(TRUE);

}

void CCBEx::OnDestroy()
{

    if(m_editEx.GetSafeHwnd() != NULL)
 {

    m_editEx.UnsubclassWindow();
  }
 CComboBox::OnDestroy();
 
 // TODO: Add your message handler code here
 
}

LRESULT CCBEx::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
 // TODO: Add your specialized code here and/or call the base class

// if(message == WM_COMMAND)
// {
//  if(HIWORD(wParam) == LBN_SELCHANGE)
//  {
//
//  }
//  }
 return CComboBox::DefWindowProc(message, wParam, lParam);
}

void CCBEx::OnDropdown()
{
 // TODO: Add your control notification handler code here 
}

void CCBEx::OnCloseup()
{

 // TODO: Add your control notification handler code here 
}

void CCBEx::OnMouseMove(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default

 CComboBox::OnMouseMove(nFlags, point);
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值