本来有点担心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是虚函数的原因!