MFC的對話方塊中建立點陣圖按鈕
1.可新建一個類ImageButton(繼承自CButton),並設定其風格為自繪: ModifyStyle(0,BS_OWNERDRAW);
ImageButton.h:
class ImageButton : public CButton
{
private:
public:
ImageButton();
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(ImageButton)
protected:
virtual void PreSubclassWindow();//修改其風格屬性
//}}AFX_VIRTUAL
// Implementation
public:
void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);//繪圖
virtual ~ImageButton();
DECLARE_MESSAGE_MAP()
};
2.ImageButton.cpp:
#include "ImageButton.h"
ImageButton::ImageButton()
{
}
ImageButton::~ImageButton()
{
}
//當主框架的OnDraw呼叫後,此按鈕會自動更新顯示(一直迴圈)
void ImageButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CClientDC dc(this);
HBITMAP hBitmap; //點陣圖控制代碼
hBitmap=(HBITMAP)LoadImage(
::AfxGetInstanceHandle(),_T("ok.bmp"),
IMAGE_BITMAP,0,0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
ASSERT(hBitmap);
HBITMAP hOldBitmap;
CDC memDC;
memDC.CreateCompatibleDC(&dc);
hOldBitmap = (HBITMAP)memDC.SelectObject(/*&bmpDraw*/hBitmap); //新增新的控制代碼
dc.BitBlt(0,0,100,40,&memDC,0,0,SRCCOPY);//將快取DC放入實際客戶DC
//顯示文字
CString text(_T("FUCK"));
CRect rect( 0, 0, 100,100);
dc.DrawText(text,rect,DT_LEFT|DT_SINGLELINE|DT_VCENTER);
memDC.SelectObject(hOldBitmap); //恢復控制代碼
}
void ImageButton::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
CButton::PreSubclassWindow();
ModifyStyle(0,BS_OWNERDRAW);//注意,此句一定要,這樣才能設定按鈕為自繪,否則不有顯示圖片
}
此後有兩種方法呼叫:一是純程式碼,二是通過按鈕控制元件.
一.在對話方塊DLGDlg.h中新增上面ImageButton類的物件:
在class CDLGDlg : public CDialog
{
ImageButton m_btnImg;
}
在DLGDlg.cpp加入:
#define IDC_MYBUTTON 1010 //先定義一個資源號,以便和按鈕繫結
BEGIN_MESSAGE_MAP(CDLGDlg, CDialog)
ON_BN_CLICKED(IDC_MYBUTTON, CDLGDlg::OnBnClickedOk) //資源號與函式事件繫結
END_MESSAGE_MAP()
在的BOOL CDLGDlg::OnInitDialog()里加入
//通過程式碼建立按鈕
m_btnImg.Create(_T ( "Title "), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_BITMAP/*|BS_ICON*/ ,CRect(0,0,100,124),this,IDC_MYBUTTON); //與資源號IDC_MYBUTTON繫結,在前面資源號已與函式事件繫結
二.拖一個按鈕控制元件,設定其[屬性]中的[owner draw]為true,設定其ID號為IDC_BUTTON1.
在對話方塊DLGDlg.h中新增上面ImageButton類的物件:
在class CDLGDlg : public CDialog
{
ImageButton m_btnImg;
}
在DLGDlg.cpp中:
將按鈕與按鈕變數關聯:
DDX_Control(pDX, IDC_BUTTON1, m_button1);
BEGIN_MESSAGE_MAP(CDLGDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, CDLGDlg::OnBnClickedOk) //資源號與函式事件繫結
END_MESSAGE_MAP()
上面兩者區別:用純程式碼,要自己定義資源號(IDC_MYBUTTON),並顯示建立按鈕(Create函式).而用按鈕控制元件時,要拖放按鈕,設定其屬性[owner draw]為true,再將其ID與變數繫結,並與事件繫結.
三.也可用按鈕的成員函式SetBitmap()來直接設定點陣圖:
CButton CBtn;
CBtn.ModifyStyle(0, BS_BITMAP );//可以畫點陣圖,但注意,不能要WS_OWNERDRAW,因為WS_OWNERDRAW要自己寫繪製函式
CBtn.SetBitmap( (HBITMAP)LoadImage(
::AfxGetInstanceHandle(),_T("res//out.bmp"),
IMAGE_BITMAP,0,0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION) );