您的位置:首页 > 其它

MFC 自绘按钮的实现

2013-10-27 10:51 246 查看
==================

添加两幅位图 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数据结构的数据成员是进行自绘的关键
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc 控件 图片