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数据结构的数据成员是进行自绘的关键
添加两幅位图 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下按钮自绘的实现(二)
- MFC 自绘按钮的实现
- MFC自绘按钮的实现,按钮动态效果
- MFC自绘按钮的实现
- MFC下按钮自绘的实现
- MFC下按钮自绘的实现
- MFC自绘按钮的实现
- MFC自绘按钮的实现
- MFC下按钮自绘的实现(一)
- VC自绘按钮的实现(NO MFC)
- MFC下按钮自绘的实现(三)
- MFC下按钮自绘的实现(四)
- MFC + CxImage 实现自绘半透明按钮
- MFC + CxImage 实现自绘半透明按钮
- MFC + CxImage 实现自绘半透明按钮
- VC自绘按钮的实现(NO MFC)
- 自绘按钮实现颜色选择器
- MFC实现点击按钮打开一个指定的文件或者网址或者exe
- MFC中实现自绘菜单
- 自绘按钮的实现