转自:
http://www.cnblogs.com/iceqq/archive/2009/03/25/1421638.html
今天在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做参数