1. 程式人生 > >MFC的對話方塊中建立點陣圖按鈕

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) );