📄 hoverbutton.cpp
字号:
/*
Copyright 2006 - 2007, All Rights Reserved.
图片按钮类
作者 - 张鲁夺(zhangluduo)
MSN - zhangluduo@msn.com
QQ群 - 34064264
为所有爱我的人和我爱的人努力!
*/
#include "stdafx.h"
#include "HoverButton.h"
#include "HoverButton.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// HoverButton
HoverButton::HoverButton()
{
m_hBitmap = NULL;
m_bIsMouseMove = false;
}
HoverButton::~HoverButton()
{
}
BEGIN_MESSAGE_MAP(HoverButton, CButton)
//{{AFX_MSG_MAP(HoverButton)
ON_WM_MOUSEMOVE()
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// HoverButton message handlers
bool HoverButton::LoadBitmap(HMODULE hModule, UINT nBitmapID)
{
if(m_hBitmap != NULL)
DeleteObject(m_hBitmap);
m_hBitmap = ::LoadBitmap(hModule, MAKEINTRESOURCE(nBitmapID));
if(m_hBitmap == NULL)
return false;
int nWidth = 0;
int nHeight = 0;
if(!GetBitmapSize(m_hBitmap, &nWidth, &nHeight))
return false;
SetWindowPos(NULL, 0, 0, (nWidth + 1) / 4, nHeight, SWP_NOMOVE |SWP_NOOWNERZORDER);
return true;
}
bool HoverButton::GetBitmapSize(HBITMAP hBmp, int* nWidth, int* nHeight)
{
*nWidth = *nHeight = -1;
BITMAP bm;
int ret = GetObject((HGDIOBJ)hBmp, sizeof(BITMAP), (LPSTR)&bm);
if(ret == 0)
return false;
*nWidth = bm.bmWidth;
*nHeight = bm.bmHeight;
return true;
}
void HoverButton::DrawBitmap(HBITMAP hBmp, STATUS Status)
{
RECT rcWnd;
::GetClientRect(m_hWnd, &rcWnd);
HDC hDC = ::GetDC(m_hWnd);
HDC hImgDC = ::CreateCompatibleDC(hDC);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hImgDC, hBmp);
switch(Status)
{
case NORMAL:
BitBlt(hDC, 0, 0, rcWnd.right, rcWnd.bottom, hImgDC, 0, 0, SRCCOPY);
break;
case MOUSEMOVE:
BitBlt(hDC, 0, 0, rcWnd.right, rcWnd.bottom, hImgDC, rcWnd.right, 0, SRCCOPY);
break;
case LBUTTONDOWN:
BitBlt(hDC, 0, 0, rcWnd.right, rcWnd.bottom, hImgDC, rcWnd.right * 2, 0, SRCCOPY);
break;
case DISABLED:
BitBlt(hDC, 0, 0, rcWnd.right, rcWnd.bottom, hImgDC, rcWnd.right * 3, 0, SRCCOPY);
break;
default:
BitBlt(hDC, 0, 0, rcWnd.right, rcWnd.bottom, hImgDC, 0, 0, SRCCOPY);
}
SelectObject(hImgDC, hOldBmp);
DeleteObject(hImgDC);
::ReleaseDC(m_hWnd, hDC);
}
void HoverButton::PreSubclassWindow()
{
SetButtonStyle(GetButtonStyle() | BS_OWNERDRAW);
CButton::PreSubclassWindow();
}
void HoverButton::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_bIsMouseMove == false)
{
m_bIsMouseMove = true;
Invalidate();
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = HOVER_DEFAULT;
_TrackMouseEvent(&tme);
}
CButton::OnMouseMove(nFlags, point);
}
LRESULT HoverButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_bIsMouseMove = false;
Invalidate();
return 0;
}
void HoverButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if(::IsWindowEnabled(m_hWnd) == 0)
{
DrawBitmap(m_hBitmap, DISABLED);
return ;
}
else if(lpDrawItemStruct->itemState & ODS_SELECTED)
{
m_bIsMouseMove = false;
DrawBitmap(m_hBitmap, LBUTTONDOWN);
}
else
{
DrawBitmap(m_hBitmap, NORMAL);
}
if(m_bIsMouseMove)
{
DrawBitmap(m_hBitmap, MOUSEMOVE);
}
}
BOOL HoverButton::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_SPACE)
return TRUE;
}
return CButton::PreTranslateMessage(pMsg);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -