MFC 学习之 按钮重绘
来源:互联网 发布:灰度共生矩阵实现 编辑:程序博客网 时间:2024/06/05 04:53
代码如下:
添加 ON_WM_DRAWITEM() 消息
映射 afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct); 函数
实现如下:
void CBtnDrawDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct){// TODO: 在此添加消息处理程序代码和/或调用默认值//ADD A PICTURE TO BUTTONCDC 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(); }}
CPen m_OutBorderPen;CBrush m_BackgroundBrush;
实现如下:
void CBtnDrawDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct){// TODO: 在此添加消息处理程序代码和/或调用默认值//REDRAW BUTTONCRect rect = lpDrawItemStruct->rcItem;CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);int nSavedDC = pDC->SaveDC();//绘制按钮的外边框POINT pt;pt.x = 5;pt.y = 5;CPen *pOldPen = pDC->SelectObject(&m_OutBorderPen);pDC->RoundRect(&rect, pt);pDC->SelectObject(pOldPen);// 绘制按钮的底色rect.DeflateRect(3, 3, 3, 3);CBrush *pOldBrush = pDC->SelectObject(&m_BackgroundBrush);pDC->Rectangle(rect);pDC->SelectObject(pOldBrush);//绘制按钮文本TCHAR strButtonText[MAX_PATH + 1];::GetWindowText(m_hWnd, strButtonText, MAX_PATH); // 获取按钮文本if (strButtonText != NULL){CFont *pFont = GetFont();CFont *pOldFont = pDC->SelectObject(pFont);CSize szExtent = pDC->GetTextExtent(strButtonText, _tcslen(strButtonText));CRect rectText = lpDrawItemStruct->rcItem;rectText.DeflateRect(rect.CenterPoint().x - szExtent.cx / 2, rect.CenterPoint().y - szExtent.cy / 2, rect.CenterPoint().x - szExtent.cx / 2, rect.CenterPoint().y - szExtent.cy / 2);int nOldBkMode = pDC->SetBkMode(TRANSPARENT);UINT state = lpDrawItemStruct->itemState;if (state & ODS_SELECTED){rectText.OffsetRect(1, 1);}pDC->DrawText(strButtonText, -1, rectText, DT_WORDBREAK | DT_CENTER);pDC->SelectObject(pOldFont);pDC->SetBkMode(nOldBkMode);}CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct);}
0 0
- MFC 学习之 按钮重绘
- MFC重绘控件篇---按钮CButton
- MFC重绘控件篇---按钮CEdit
- MFC重绘控件篇---按钮CCombox
- MFC重绘控件篇---按钮CListBox
- MFC重绘的按钮控件
- MFC:三角形按钮(重绘CButton)
- MFC学习笔记整理:001_VC6按钮控件的重绘
- MFC学习笔记之图形保存与重绘
- MFC学习笔记之图形保存与重绘
- MFC 单文档标题栏菜单按钮重绘
- MFC之按钮
- MFC实例学习(2)----重绘
- C++ mfc学习之路二 网页按钮启动应用程序
- MFC学习之:对话框中的单选按钮(Radio)
- C++ mfc学习之路二 网页按钮启动应用程序
- C++学习笔记之MFC改变按钮颜色
- WTL按钮重绘
- hdu 3065 AC自动机
- 电子邮件协议
- ArrayDeque 双端队列
- Linux命令-压缩文件类
- All the TCP/IP ports that are in a TIME_WAIT status
- MFC 学习之 按钮重绘
- Eclipse常用快捷键
- GDAL vs2010 编译
- GIS技术范围总结
- MSSQL XML使用(三):把字段名作为XML的节点
- Objective-C语言关键词,@property与@synthesize使用。
- 字符串String类学习总结
- WdatePicker日历控件使用方法
- http协议请求头与响应头相关注解