zl程序教程

您现在的位置是:首页 >  其它

当前栏目

MFC自绘按钮的实现

实现 按钮 mfc 自绘
2023-09-14 08:58:21 时间
进行VM_MESUREITEM事件响应,说明按钮的尺寸 进行VM_DRAWITEM消息的重新响应,说明如何绘制按钮

首先在vc6中新建工程,选择MFC并且新建dialog工程

输入工程名,然后将生成的按钮等删除,重新添加两个按钮。

为按钮设置属性

选择自绘,就是自己向上贴图

在dlg类的对象上添加WM_DRAWITEM属性

在生成的OnDrawItem方法中添加如下代码


//添加绘图函数

void CMy40_mybuttonDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 

 // TODO: Add your message handler code here and/or call default

 CDC ButtonDC;

 CBitmap bitmapTrans;

 BITMAP bmp;

 CDC mem;

 CRect rc;

 //得到用于绘制按钮的DC

 ButtonDC.Attach(lpDrawItemStruct- hDC);

 //准备用于向按钮区域传输位图

 mem.CreateCompatibleDC( ButtonDC);

 //获取按钮所占的矩形大小

 rc=lpDrawItemStruct- rcItem;

 //获取按钮目前所处的状态,根据不同的状态绘制不同的按钮

 UINT state = lpDrawItemStruct- itemState;

 //如果按钮已经得到焦点,绘制选中状态下的按钮

 if(state ODS_FOCUS)

 bitmapTrans.LoadBitmap(IDB_BITMAP1);

 bitmapTrans.GetBitmap( bmp);

 CBitmap *old=mem.SelectObject( bitmapTrans);

 //向按钮所在位置传输位图

 //使用StretcnBlt的目的是为了让位图随按钮的大小而改变

 ButtonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom, mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

 mem.SelectObject(old);

 bitmapTrans.DeleteObject();

 //设置文字背景为透明

 ButtonDC.SetBkMode(TRANSPARENT);

 ButtonDC.DrawText("已选中", rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

 else

 bitmapTrans.LoadBitmap(IDB_BITMAP2);

 CBitmap *old2 = mem.SelectObject( bitmapTrans);

 bitmapTrans.GetBitmap( bmp);

 CBitmap *old=mem.SelectObject( bitmapTrans);

 ButtonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom, mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

 ButtonDC.SetBkMode(TRANSPARENT);

 ButtonDC.DrawText("未选中", rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

 mem.SelectObject(old2);

 bitmapTrans.DeleteObject();

 CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);

}

编译运行,运行后得到效果如果所示



Qt编写自定义控件9-导航按钮控件 导航按钮控件,主要用于各种漂亮精美的导航条,我们经常在web中看到导航条都非常精美,都是html+css+js实现的,还自带动画过度效果,Qt提供的qss其实也是无敌的,支持基本上所有的CSS2属性,配合QPainter这个无敌大法工具,没有什么不能绘制的。
vc 按钮自绘 按钮自绘,将按钮区域分成三部分,左边、右边、中间都由贴图绘制,可用于手动进度条按钮,或者左右选择项按钮 cpp代码部分: