mfc按钮类有底色?

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

请问,这个灰色的底色怎么才能去掉?
...全文
442 11 打赏 收藏 转发到动态 举报
写回复
用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一份父窗口按钮位置的背景图贴上去作为按钮的背景图
已经博主授权,源码转载自 https://pan.quark.cn/s/62a514083238 在Microsoft Foundation Classes (MFC)框架中,ComboBox组件被视为一种普遍应用的图形用户界面组件,它整合了文本输入域与下拉菜单的功能,使用户既可以在文本区域键入数据,也能够通过下拉列表挑选可用选项。当进行Windows程序的构建时,开发人员有时需要针对ComboBox组件的外观进行个性化定制,比如调整下拉列表的底色按钮的视觉样式,以此满足特定的界面美学要求。本指南将系统性地阐释在VS2017开发环境中如何调整MFC ComboBox的视觉表现。启动VS2017软件,建立一个新的MFC应用程序实例,比如命名为“MFCApplication3”。在资源管理界面中,识别并选择`IDD_MAINFRAME`对话框资源进行双击操作,从而激活对话框编辑模块。在对话框编辑模块内,从工具箱中选取一个ComboBox组件,并将其放置于对话框界面之上,同时为其分配一个标识符,例如`IDC_COMBOBOX1`。紧接着,开发人员需要执行ComboBox的自定义绘制功能。这一任务通常通过覆写CComboBox类所包含的成员函数来实现。在工程文件中,对`MFCApplication3View.cpp`文件执行右键操作,并选择“添加”菜单下的“类”选项,进而创建一个派生自CComboBox的类,比如名为`CMyComboBox`。在`CMyComboBox`类中,必须覆写以下核心函数:1. `OnDrawItem`:此函数负责在下拉列表中呈现每一个条目。在此处,开发人员需要设定背景色调、字体色彩等属性。可以利用CDC对象的`FillSolidRect`方法填充背景...

15,976

社区成员

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

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