MFC 自绘按钮的实现

==================

添加两幅位图 IDB_GETFOCUS IDB_LOSTFOCUS

==========================

在对话框窗口属性中添加WM_DRAWITEM消息响应函数

=========================

函数代码如下

void CMyButtonDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 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.LoadBitmapW(IDB_GETFOCUS);
  bitmapTrans.GetBitmap(&bmp);
  CBitmap *old=mem.SelectObject(&bitmapTrans);
  //向按钮所在位置传输位图
  //只用StetchBlt的目的是为了让位图随按钮的大小而改变
  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(_T("已选中"),&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

 }
 else
 {
  //绘制未选中状态下的按钮
  bitmapTrans.LoadBitmapW(IDB_LOSTFOCUS);
  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.DrawText(_T("未选中"),&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
  mem.SelectObject(old2);
  bitmapTrans.DeleteObject();
 }

 //
 CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
=============================

这里只对ODS_FOCUS状态进行了定制,其他状态原理同此

 

随时访问MEASUREITEMSTRUCT数据结构的数据成员是进行自绘的关键

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值