MFC 学习之 按钮重绘

代码如下:

添加 ON_WM_DRAWITEM()  消息

映射 afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);  函数

实现如下:

void CBtnDrawDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	//ADD A PICTURE TO BUTTON
	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.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 BUTTON
	CRect 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值