mfc按钮类有底色?

飘零风 2021-04-06 10:11:11
VS2019+win7 64。我打算用PNG做一个透明的按钮。我写了一个子类,重写了DrawItem函数,贴上PNG图片,发现效果完全不对。经过排查,发现这个按钮有自己的底色!最后我把DrawItem搞成空函数(什么也不做),得到的效果如下图:

请问,这个灰色的底色怎么才能去掉?
...全文
395 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
aisjmren 2021-04-27
  • 打赏
  • 举报
回复
背景变成透明的
待续_1006 2021-04-21
  • 打赏
  • 举报
回复 1
HBRUSH XXX::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); if(nCtlColor==CTLCOLOR_STATIC) //CTLCOLOR_STATIC为控件ID { pDC->SetTextColor(RGB(0,188,0));//修改字体的颜色 pDC->SetBkMode(TRANSPARENT);//把字体的背景变成透明的 return (HBRUSH)GetStockObject(NULL_BRUSH); } return hbr; }
飘零风 2021-09-07
  • 举报
回复
@待续_1006 确实如你所说,在OnCtlColor里面返回空画刷即可。 唔……现在怎么结贴?还是不需要结贴了?
飘零风 2021-04-08
  • 打赏
  • 举报
回复
引用 6 楼 Eleven 的回复:
CMFCButton:: m_bTransparent
这个属性应该怎么用呢?无论我在dialog的OnInitDialog里面还是在子类的OnCreate方法里面设置这个属性为TRUE,都不起作用。
Eleven 2021-04-08
  • 打赏
  • 举报
回复
CMFCButton:: m_bTransparent
tko2002 2021-04-07
  • 打赏
  • 举报
回复
我也是在学习,但我直接GDI绘制一个按钮
飘零风 2021-04-07
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
https://blog.csdn.net/defaultbyzt/article/details/46724287
我把这段代码复制到DrawItem方法中,仍然不起作用:

    if (m_first)
    {// 复制背景
        CDialog* pParent = (CDialog*)GetParent();
        CPoint pt(0, 0);
        MapWindowPoints(pParent, &pt, 1);
        CDC* pdc = GetParent()->GetDC();
        m_bkDc.CreateCompatibleDC(pdc);
        CBitmap memBmp;
        memBmp.CreateCompatibleBitmap(pdc, rect.right, rect.bottom);
        m_bkDc.SelectObject(&memBmp);
        m_bkDc.BitBlt(0, 0, rect.right, rect.bottom, pdc, pt.x, pt.y, SRCCOPY);
        ReleaseDC(pdc);
        m_first = false;
    }
飘零风 2021-04-07
  • 打赏
  • 举报
回复
引用 1 楼 hurryboylqs 的回复:
没办法去掉,你可以copy一份父窗口按钮位置的背景图贴上去作为按钮的背景图
我试过,然而copy出来的也是灰色的。我从旁边copy一份过去就可以完美透明。也许是我copy的方式不对?

void CMyButton::PaintBk(CDC* pDC)
{
    CClientDC clDC(GetParent());
    CRect rect;
    CRect rect1;

    CDC			m_dcBk;
    CBitmap		m_bmpBk;
    CBitmap* m_pbmpOldBk;

    GetClientRect(rect);

    GetWindowRect(rect1);
    GetParent()->ScreenToClient(rect1);

    if (m_dcBk.m_hDC == NULL)
    {
        m_dcBk.CreateCompatibleDC(&clDC);
        m_bmpBk.CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());
        m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);
        m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, SRCCOPY); //将rect1.left的值增加一个button宽度,就透明了
    } // if

    pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcBk, 0, 0, SRCCOPY);
} // End of PaintBk
hurryboylqs 2021-04-07
  • 打赏
  • 举报
回复
没办法去掉,你可以copy一份父窗口按钮位置的背景图贴上去作为按钮的背景图

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧