创建新的Button类,设置按键的背景图(不限于bitmap图)

本来有点担心MFC会不会过时,不知道哪里看到的:MFC是一个类库,只要还用Windows就不会过时。

先列一下程序里面用到的几个库函数

SubclassDlgItem(nID, pParent)//把ID为nID的控件子类化,父类的指针式pParent如果Button是自己创建,而不是用资源管理器画出来的,这个应该很有用

Detch()//把资源和类名分开,返回值是资源的句柄,不同的类可能返回不同的值

Attach()//跟Detch刚好相反,但是要有参数进去,把hbitmap和使用它的类关联上,比如bmp.Attach(hbitmap), bmp是CBitmap类的



进入主题:

创建一个新的Button类。

//MyButton头文件

#pragma once
// CMyButton
class CMyButton : public CButton
{
DECLARE_DYNAMIC(CMyButton)
public:
CMyButton();
virtual ~CMyButton();
protected:
DECLARE_MESSAGE_MAP()
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);//这个函数很重要,画按键,哪怕是字体设置,全靠它了。。。下面设置背景色的,这里先不讲了,也是

//我从别的地方看来的。
COLORREF m_TextColor, m_DownColor, m_UpColor;


public: void SetDownColor(COLORREF color);//按下的背景色
void SetUpColor(COLORREF color);//设置Button Up的背景颜色
BOOL Attach(const UINT nID, CWnd* pParent);
private:
HBITMAP hbitmap;
};

看MyButton.cpp里面函数的实现

BOOL CMyButton::Attach(const UINT nID, CWnd* pParent)
{
//GetDlgItem(nID)->ModifyStyle(0,BS_OWNERDRAW,0);
if (!SubclassDlgItem(nID, pParent))
return FALSE;
return TRUE;
}

void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);//得到绘制的环境设备CDC
VERIFY(lpDrawItemStruct->CtlType == ODT_BUTTON);

CDC MemDC;
CBitmap bmpbackgnd;
BITMAP bitmap;
CRect rect;
GetClientRect(&rect);

MemDC.CreateCompatibleDC(&dc);
bmpbackgnd.Attach(hbitmap);
bmpbackgnd.GetBitmap(&bitmap);
MemDC.SelectObject(&bmpbackgnd);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);

//上面就是用双缓存法画的背景图,需要下面的函数,把图像load进去,给成员变量hbitmap

}

 BOOL CMyButton::LoadImage(const CString PATH)
{
CImage image;
HRESULT ret = image.Load(PATH);
if (S_OK== ret)
{
hbitmap = image.Detach();
return TRUE;
}
return FALSE;
}

//实现的时候这么用

先在OnInitDialog里面,把按钮和你建的类关联上,如果在DDX_CTROL里面已经关联上了,注释掉

GetDlgItem(IDC_APPLE)->ModifyStyle(0,BS_OWNERDRAW,0);//一定要BS_OWNERDRAW
m_btnapple.Attach(IDC_APPLE,this);//m_btnapple在h文件里面要声明为CMyButton类

m_btnapple.LoadImage(_T("res/20120517040953987_Apple.png"));


不用再OnPaint里面做renhe然后就可以了。。。为什么???因为CMyButton类继承了CButton类,自己调用了DrawItem函数。。。这就是为什么DrawItem是虚函数的原因!




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值