自绘按钮:(VC的)资料来源 http://hi.baidu.com/3582077/blog/item/9e86f81c64a97b9c86d6b677.html3按钮控件自绘自绘按钮控件的原理很简单,获取控件窗口的设备上下文(DC),然后调用相应的API画图函数进行控件自绘,所有能针对DC操作的API函数都能应用到控件里来,如Rectangle(画一个矩形),BitBlt(显示图片)函数等。首先我们向工程导入两张位图,一张为按钮按下时显示的图片(ID号:IDB_SELECT),另一张为正常显示的图片(IDB_NORMAL)两张位图:
我们知道按钮控件对应的类为CButton,所以我们得从这个类派生出一个类。
派生CButton类的方法是进入ClassView选项卡,右击First Classes,选择New Class...,接着弹出了一个新建类对话框,Name项是你新建的类名称,这里类名取为CNewButton。Base class(基类)选CButton,点确定。此时First Classes下就多出了一个CNewButton类,是我们从按钮类(CButton)派生出的类。
接着给CNewButton添加虚函数DrawItem,添加虚函数方法在添加PreTranslateMessage虚函数的时候已经说明过了。
这个函数的定义如下:
void CNewButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
lpDrawItemStruct是一个DRAWITEMSTRUCT结构指针,这个结构在"网上收藏(转载)"里有介绍。DrawItem函里的代码如下:// TODO: Add your code to draw the specified item
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);//CDC类里的ATTACH函数用于把HDC转换成CDC
UINT state=lpDrawItemStruct->itemState;
CRect ButtonRect;
GetClientRect(&ButtonRect);//调用按钮类里的GetWindowRect函数获取按钮区域大小
CDC memDC;
memDC.CreateCompatibleDC(&dc);//创建兼容DC
CBitmap bmp;
if(state&ODS_SELECTED)//如果按钮按下
{
bmp.LoadBitmap(IDB_SELECT);//装载按下图片
}
else
{
bmp.LoadBitmap(IDB_NORMAL);
}
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);//获取位图信息
memDC.SelectObject(&bmp);//选入图片
dc.StretchBlt(0,0,ButtonRect.right,ButtonRect.bottom,&memDC,
0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);//显示图片
CString str;
GetWindowText(str);//获取按钮文本
dc.SetBkMode(TRANSPARENT);//设置文字背景透明
dc.DrawText(str,&ButtonRect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);//输出按钮文本 memDC.DeleteDC();
bmp.DeleteObject();接着我们往对话框添加一个按钮,并为关联变量,在Add Member Variable对话框里,Variable type栏里选择类型为CNewButton.并把按钮控件的样式设置为"所有者绘制"然后在对话框类里包含NewButton.h(派生下来的按钮类头文件):#include"NewButton.h"接着我们编译,运行,效果如下图:
由于我们在上面只处理了按钮的两个状态,按下,和正常状态,所以当按钮获得焦点,或处于其它状态时,则没有对应的动作。
“美工做的按钮”在编程中通常叫做图形按钮。
制作图形按钮有多种方法,最基础的是MFC的标准图片按钮方法CBitmapButton。
1、在资源编辑的时候选中按钮的 Owner draw 属性,不需要选择 Bitmap 属性.
按钮右键-->Styles-->Owner draw
2、在程序中定义一个CBitmapButton成员变量。注意:不能使用ClassWizard为按钮映射一个CButton变量,然后改为CBitmapButton,这么做并不能将按钮直接映射为CBitmapButton类的对象,反而会出现初始化错误。
3、使用CBitmapButton::LoadBitmaps装载各种状态的图片,
使用CBitmapButton::SubclassDlgItem关联到想要的按钮,
使用CBitmapButton::SizeToContent函数使按钮适合图片大小。
注意Loadbitmaps一定要在关联到按钮之前进行!
添加资源Bitmap的方法:Insert菜单-->Resource -->Resource type:Bitmap-->Import, 之后选择所需的图片就可以了。
此外,还可以通过扩展的CButtonST类和界面库(皮肤库)的方法来实现图形按钮和异形图形按钮,可以让按钮更美观,形式更多样。
不了解!冒个泡!