最近在为公司用MFC做产品界面。因为是小公司,所以也没有现成的界面库,必须自己一点一点写。自己在网上收集了点资料,就写了几个类型的button类,以供以后使用。
目前为止,做了三种类型的按钮,分别是:
1.一般情况使用的,比较常用的button类CNormalBtn;
2.特殊一点的,类似拥有菜单功能的button类CMenuBtn(和CNormal的区别是按钮selected后的状态不会随着鼠标的离开而消失);
3.静态按钮,用来呈现log等图片之类的button类CStatic,该类不会响应鼠标事件。
对于1,2种按钮,用的图片模式是:(png格式,一幅图里有四副小图,依次表示NoFoucs,Mousemove, buttondown, Disable四种状态);
对于3类按钮,用的图片模式是:(png格式)
下面贴代码:
基类代码(BaseBtn.h)
#ifndef __BASEBTN_H__
#define __BASEBTN_H__
#include "stdafx.h"
#include <atlimage.h>
#if _MSC_VER > 1000
#pragma once
#endif
class CBaseBtn : public CButton
{
public:
CBaseBtn();
~CBaseBtn();
public:
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual void SetFont(CFont* pFont, BOOL bRedraw = TRUE);
virtual void SetWindowText(LPCTSTR lpszString);
public:
void Init(UINT uImageID);
void SetBtnTextColor(COLORREF clr);
protected:
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
DECLARE_MESSAGE_MAP()
protected:
int m_nCtrlState;
CImage m_Image;
int m_nSrcWidth;
int m_nSrcHeight;
private:
CString m_strBtnText;
CFont* m_pFont;
COLORREF m_clr;
};
#endif
基类代码(BaseBtn.cpp)
#include "stdafx.h"
#include "BaseBtn.h"
#include "Public.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CBaseBtn::CBaseBtn()
{
m_pFont = new CFont;
VERIFY(m_pFont->CreateFont(15, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,