CButton 을 상속받는 클래스를 만들어 처리합니다.


// MSNButton.cpp : 구현 파일입니다.
//

#include "stdafx.h"
#include "ImageButton.h"
#include "MSNButton.h"


// CMSNButton

IMPLEMENT_DYNAMIC(CMSNButton, CButton)

CMSNButton::CMSNButton()
{
 m_bTracking = FALSE;
 m_bHover = FALSE;
}

CMSNButton::~CMSNButton()
{
}


BEGIN_MESSAGE_MAP(CMSNButton, CButton)
 ON_WM_DRAWITEM()
 ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
 ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
 ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()

 

// CMSNButton 메시지 처리기입니다.

void CMSNButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

 // TODO:  지정된 항목을 그리는 코드를 추가합니다.
 CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
 CDC MemDC;
 MemDC.CreateCompatibleDC(pDC);

 BITMAP bmpInfo;
 CBitmap Bmp;
 CBitmap* pOldBitmap = NULL;
 Bmp.LoadBitmapW(IDB_BITMAP1);
 Bmp.GetBitmap(&bmpInfo);

 pOldBitmap = MemDC.SelectObject(&Bmp);

 // 버튼이 선택되었는가?
 if(lpDrawItemStruct->itemState & ODS_SELECTED)
 {
  // 세번째 버튼 이미지 출력
  pDC->BitBlt(0,0,bmpInfo.bmWidth, bmpInfo.bmHeight, &MemDC, 206, 0, SRCCOPY);
 }
 else
 {
  // 마우스 포인터가 버튼 위에 존재하는가?
  if(m_bHover)
  {
   // 두번째 버튼 이미지 출력!
   pDC->BitBlt(0,0, bmpInfo.bmWidth, bmpInfo.bmHeight, &MemDC, 103, 0, SRCCOPY);
   //pDC->BitBlt(0,0, bmpInfo.bmWidth, bmpInfo.bmHeight, &MemDC, 50, 0, SRCCOPY);
  }
  else
  {
   // 첫번째 버튼 이미지 출력!
   pDC->BitBlt(0,0, bmpInfo.bmWidth, bmpInfo.bmHeight, &MemDC, 0, 0, SRCCOPY);
  }
 }

 MemDC.SelectObject(pOldBitmap);
}

void CMSNButton::OnMouseMove(UINT nFlags, CPoint point)
{
 // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
 
 // 마우스 트래킹이 시작되었는가???
 if(!m_bTracking)
 {
  TRACKMOUSEEVENT tme;
  tme.cbSize = sizeof(tme);
  tme.hwndTrack = m_hWnd;
  tme.dwFlags = TME_LEAVE | TME_HOVER;
  tme.dwHoverTime = 1;
  m_bTracking = _TrackMouseEvent(&tme);
 }
 
 CButton::OnMouseMove(nFlags, point);
}

LRESULT CMSNButton::OnMouseHover(WPARAM wparam, LPARAM lparam)
{
 // 마우스 포인터가 버튼 위에서 움직이고 있음.
 m_bHover = TRUE;
 RedrawWindow();
 return 0;
}

LRESULT CMSNButton::OnMouseLeave(WPARAM wparam, LPARAM lparam)
{
 // 마우스 포인터가 버튼 밖으로 나갔음.
 m_bTracking = FALSE;
 m_bHover = FALSE;
 RedrawWindow();
 return 0;
}


출처 : Windows MFC 정복 (가남사)

Posted by +깡통+