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