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 정복 (가남사)