今天在Dialog中试了下给按钮加bmp图片.折腾了好久..

直接给CButton加图片的方法:

1.在资源编辑器中添加一个按钮.把它的Bitmap属性设为true

2.在按钮上点右键,添加一个变量m_Btn(CButton类型的)

3.将图片导入到资源管理器中.ID为IDB_BITMAP1

4.然后在初始化中加入如下代码:

HBITMAP hBmp 
 = 
 ::LoadBitmap(AfxGetInstanceHandle(),  MAKEINTRESOURCE(IDB_BITMAP1));   
    m_Btn.SetBitmap(hBmp);

按钮上的文字就被图片取而代之了.但是按钮的四方边框仍然在.有点难看..

换成CBitmapButton就好看多了.没有那个四方边框.而且可以很容易地做出点动态的效果.方法如下:

1.在资源编辑器中添加一个按钮.

     把它的Owner Draw属性设为true.

     把它的ID设为IDC_BUTTON1.

     把它的Caption改成BITMAP_BUTTON

2.准备4张图片(只准备其中一两张也可以).添加到资源管理器中

     正常状态时的按钮图片     的ID设为"BITMAP_BUTTONU"

     鼠标按下时的按钮图片     的ID设为"BITMAP_BUTTOND"

     鼠标点击过后的按钮图片  的ID设为"BITMAP_BUTTONF"

     按钮失效后的图片          的ID设为"BITMAP_BUTTONS"

一定要左右都带双引号!

     其实就是 "按钮的Caption+U或D或F或S"

3.在dlg的头文件里添加一个CBitmapButton类型的成员变量m_bbtn

4.在初始化中加入以下代码


m_bbtn.AutoLoad(IDC_BUTTON1,  
 this 
 );


 

 


应用CBitmapButton时遇到点小问题.如果对按钮(CButton)用向导添加了Control变量.就出错了..

把DDX_Control(pDX, IDC_BUTTON1, m_btn1);这一行注释掉就又可以运行了..

按目前的理解.CBitmapButton是一个Control型的类.是专门用来扩展CButton的功能的.不能自己独立创建出一个按钮 

嗯.现在有新的理解了.在资源编辑器里面画的按钮什么的,都只是一种资源.在MFC中被静态地创建成对象了.


也可以动态地用那些资源创建对象,只要在调用对象的Create函数时使用某个按钮的ID就可以了.Dialog不都是这样创建的吗


所以用CBitmapButton实际上就是利用做好的资源建立一个对象.


这时这个对象自身就是那个button的"Control变量"了,所以不能再有其它的Control变量了,不然在DDX里面会冲突吧

 

在MSDN里找到了很好的例子程序.所以把CBitmapButton的另一种用法就直接贴出来吧

同之前一样,先拖出来两个按钮.一个ID为IDOK,另一个是IDCANCEL.OwnerDraw设为true.不用设Caption

 

/// 
 // 
 
 
 // 
  BitmapButton Test dialog #1

 
 // 
  In this example we pass the bitmap resource names to LoadBitmaps
 
 // 
   OnInitDialog is used to Subclass the buttons so the dialog
 
 // 
   controls get attached to the MFC WndProc for C++ message map dispatch. 
 
 
 
 
 class 
  CBMTest1Dlg :  
 public 
  CDialog
 {
 
 protected 
 :
     CBitmapButton button1, button2;
 
 public 
 :
      
 // 
 {{AFX_DATA(CBMTest1Dlg) 
 
 
          
 enum 
  { IDD  
 = 
  IDM_TEST_BITMAP_BUTTON1 };
      
 // 
 }}AFX_DATA 
 
 
     CBMTest1Dlg();

     BOOL OnInitDialog();
      
 // 
 {{AFX_MSG(CBMTest1Dlg)
      
 // 
 }}AFX_MSG 
 
 
     DECLARE_MESSAGE_MAP()
 };

 BEGIN_MESSAGE_MAP(CBMTest1Dlg, CDialog)
      
 // 
 {{AFX_MSG_MAP(CBMTest1Dlg)
      
 // 
 }}AFX_MSG_MAP 
 
 
 END_MESSAGE_MAP()


 CBMTest1Dlg::CBMTest1Dlg()
     : CDialog(CBMTest1Dlg::IDD)
 {
      
 // 
  NOTE: The obsolete MFC V1 CBitmapButton constructor with 3 arguments is
      
 // 
   replaced by a call to LoadBitmaps. 
 
 
      
 if 
  ( 
 ! 
 button1.LoadBitmaps(_T( 
 " 
 Image1Up 
 " 
 ), _T( 
 " 
 Image1Down 
 " 
 ), _T( 
 " 
 Image1Focus 
 " 
 ))  
 || 
 
          
 ! 
 button2.LoadBitmaps(_T( 
 " 
 Image2Up 
 " 
 ), _T( 
 " 
 Image2Down 
 " 
 ), _T( 
 " 
 Image2Focus 
 " 
 )))
     {
         TRACE0( 
 " 
 Failed to load bitmaps for buttons/n 
 " 
 );
         AfxThrowResourceException();
     }
 }

 BOOL CBMTest1Dlg::OnInitDialog()
 {
      
 // 
  each dialog control has special bitmaps 
 
 
     VERIFY(button1.SubclassDlgItem(IDOK,  
 this 
 ));
     button1.SizeToContent();
     VERIFY(button2.SubclassDlgItem(IDCANCEL,  
 this 
 ));
     button2.SizeToContent();

      
 return 
  TRUE;
 }


 

LoadBitmaps也可以用资源ID做参数