• 大小: 2KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-08
  • 语言: C/C++
  • 标签: 按钮  

资源简介

MFC自绘按钮类,显示点击,悬浮,初始状态,调用按钮类的SetBitmapId函数。

资源截图

代码片段和文件信息

// PicButton.cpp : 实现文件
//

#include “stdafx.h“
#include “MFCApplication5.h“
#include “PicButton.h“


// CPicButton

IMPLEMENT_DYNAMIC(CPicButton CButton)

CPicButton::CPicButton()
{
m_bOver/*(鼠标位于按钮之上)*/ = FALSE;
m_bSelected/*(按钮被按下)*/ = FALSE;
m_bTracking/*(在鼠标按下释放)*/ = FALSE;
m_bFocus /*按钮为当前焦点*/ = FALSE;
}

CPicButton::~CPicButton()
{
}


BEGIN_MESSAGE_MAP(CPicButton CButton)
ON_WM_MOUSEMOVE()
ON_WM_MOUSELEAVE()
ON_WM_MOUSEHOVER()
END_MESSAGE_MAP()



// CPicButton 消息处理程序




void CPicButton::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 = 100;//光标停在按钮上,改变状态的时间,以1毫秒为单位
m_bTracking = _TrackMouseEvent(&tme);
} CButton::onmousemove(nFlags point);

}


void CPicButton::onmouseleave()
{
// TODO:  在此添加消息处理程序代码和/或调用默认值
m_bOver = FALSE; //   鼠标没位于按钮之上     
m_bTracking = FALSE;           //鼠标离开按钮       
InvalidateRect(NULL FALSE);  //让按钮重画

CButton::onmouseleave();
}


void CPicButton::OnMouseHover(UINT nFlags CPoint point)
{
// TODO:  在此添加消息处理程序代码和/或调用默认值

m_bOver = TRUE;  //鼠标盘旋在按钮上空
InvalidateRect(NULL); //重画!

CButton::OnMouseHover(nFlags point);
}


void CPicButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CRect rect = lpDrawItemStruct->rcItem;
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
int nSaveDC = pDC->SaveDC();
UINT state = lpDrawItemStruct->itemState;

//根据按钮的状态贴图

//(以下贴按钮状态图,分以下几种情况来贴,,,和我们平常贴背景图片一样的做法)


//鼠标停留按钮的状态
if (m_bOver)
{

//(以下按钮贴图,,可以用我们自己以前贴背景图的方法去做)

CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap *pOldBmp;
pOldBmp = MemDC.Selectobject(&m_OverBitmap);//加载停留状态
pDC->BitBlt(0 0 rect.Width() rect.Height() &MemDC 0 0 SRCCOPY);

}

else
{

//初始状态
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap *pOldBmp;
pOldBmp = MemDC.Selectobject(&m_NormalBitmap);//加载最初状态
BITMAP bmp;
m_NormalBitmap.Getobject(sizeof(bmp) &bmp);
pDC->BitBlt(0 0 rect.Width() rect.Height() &MemDC 0 0 SRCCOPY);
}

//按钮被按下(选中)
if (state & ODS_SELECTED)
{
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap *pOldBmp;
pOldBmp = MemDC.Selectobject(&m_PressedBitmap);
BITMAP bmp;
//pOldBmp->GetBitmap(&bmp);
m_PressedBitmap.Getobject(sizeof(bmp) &bmp);
pDC->BitBlt(0 0 rect.Width() rect.Height() &MemDC 0 0 SRCCOPY);
}

// TODO:  添加您的代码以绘制指定项
}
void CPicButton::SetBitmapId(int nOver int nNormal int nPressed int nFocus)
{
m_NormalBitmap.LoadBitmap(nNormal);
m_PressedBitmap.LoadBitmap(nPressed);
m_FocusBitmap.LoadBitmap(nFocus);
m_OverBitmap.LoadBitmap(nOver);

}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2017-06-16 11:27  CPicButton\
     文件        3099  2017-06-16 09:50  CPicButton\PicButton.cpp
     文件         968  2017-06-16 09:50  CPicButton\PicButton.h

评论

共有 条评论