当前位置: 首页 > news >正文

MFC窗体背景颜色的设置、控件白色背景问题、控件文本显示重叠问题、被父窗体背景覆盖的问题

文章目录

  • 设置mfc窗体背景颜色
  • 窗体设置背景颜色后解决控件白色背景
  • 解决重复修改控件文本后重叠的问题
  • 自绘控件被父窗体背景覆盖的问题

设置mfc窗体背景颜色

设置窗体的背景颜色非常简单,只需要在窗体的OnEraseBkgnd里面填充窗体背景就可以了,甚至直接画一张背景图片(一般在OnPaint函数里画背景图片)。

OnEraseBkgnd(CDC* pDC)
{// TODO:  在此添加消息处理程序代码和/或调用默认值CBrush brushBg;brushBg.CreateSolidBrush(RGB(51, 51, 51)); // 创建红色画刷CRect rect;GetClientRect(&rect); // 获取窗口客户区大小pDC->FillRect(&rect, &brushBg); // 使用自定义画刷填充背景return TRUE;// 返回 TRUE 表示背景已经擦除,不需要再次擦除return CDialogEx::OnEraseBkgnd(pDC);
}

窗体设置背景颜色后解决控件白色背景

窗体在设置背景色或者背景图片后,控件的背景会变成白色。
对于静态文本控件,显示的内容关系,默认的控件背景没有改变,因此会有白色的控件背景和文字背景
在这里插入图片描述
需要在OnCtlColor里面设置控件背景透明,方法就是返回一个空画刷。同时文本背景也设置成透明

HBRUSH DlgP::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);// TODO:  在此更改 DC 的任何特性if (nCtlColor == CTLCOLOR_STATIC)//对于文本控件实现背景透明{pDC->SetTextColor(RGB(222, 222, 222));//设置字体颜色pDC->SetBkMode(TRANSPARENT);//文本背景透明return (HBRUSH)::GetStockObject(NULL_BRUSH);//控件背景透明}// TODO:  如果默认的不是所需画笔,则返回另一个画笔return hbr;
}

解决重复修改控件文本后重叠的问题

设置窗体背景色后,控件文本改变后不能得到背景的刷新。因此会造成重叠。
获取控件在客户区的坐标区域,只有使用GetWindowRect和ScreenToClient进行屏幕坐标转换,再配合GetClientRect函数获取控件大小,才能够真正获取到控件在窗体中的相对位置。网上其他的办法,多数是错的。

//获取控件在客户区的坐标区域RECT get_control_rect_in_client(CWnd* control){RECT rc;//获取控件在屏幕中位置control->GetWindowRect(&rc);//将左上坐标转化成点POINT p;p.x = rc.left;p.y = rc.top;//将点坐标在屏幕位置转化成在本窗体客户区位置this->ScreenToClient(&p);//获取控件区域大小control->GetClientRect(&rc);//真正的在客户区的区域rc.right = p.x + rc.right - rc.left;rc.left = p.x;rc.bottom = p.y + rc.bottom - rc.top;rc.top = p.y;return rc;}

设置控件所在区域为无效区,rc是上面代码里面获取控件在客户区的坐标区域

InvalidateRect(&rc,true);

之后立即使用updatewindow更新无效区

UpdateWindow();

就可以解决文本重叠问题

自绘控件被父窗体背景覆盖的问题

有的控件如按钮属性设置为ownerdraw并且进行自绘操作
在这里插入图片描述
父窗体如果有背景色或者背景图片,刷新就会导致直接覆盖ownerdraw属性的子控件。
解决方法是设置父窗体的属性为Clip Children,这样父窗体就不会刷新子控件区域
在这里插入图片描述

http://www.lryc.cn/news/269967.html

相关文章:

  • c++简易AI
  • java获取两个List集合之间的交集、差集、并集
  • 轻松实现iphone截图传电脑
  • 【网络安全】upload靶场pass1-10思路
  • 共享单车之数据存储
  • Flink(十一)【状态管理】
  • 【三维目标检测/自动驾驶】IA-BEV:基于结构先验和自增强学习的实例感知三维目标检测(AAAI 2024)
  • wefew
  • Springboot整合JSP-修订版本(Springboot3.1.6+IDEA2022版本)
  • Java核心知识点1-java和c++区别、隐式和显示类型转换
  • C++图论之强连通图
  • SadTalker数字人增加视频输出mp4质量精度
  • swing快速入门(三十二)消息对话框
  • 《Spring Cloud学习笔记:Nacos配置管理 OpenFeign LoadBalancer Getway》
  • 深入解析 Flink CDC 增量快照读取机制
  • 060:vue中markdown编辑器mavon-editor的应用示例
  • 使用SCP在Linux中安全复制文件:参数详解
  • 【动态规划精选题目】3、简单多状态模型
  • 软件测试/测试开发丨Python 虚拟环境及pip环境管理
  • Mybatis SQL构建器类 - SQL类
  • 海云安亮相2023北京国际金融安全论坛,助力金融企业数字化转型降本增效
  • nodeJS搭建免费代理IP池爬取贴吧图片实战
  • 基于图搜索的自动驾驶规划算法 - BFS,Dijstra,A*
  • Spring系列学习四、Spring数据访问
  • HBase 创建不分裂的表 ( 禁止 Table Split )
  • docker入门概念详解
  • C++程序设计实践报告【格式】
  • 浅谈数据仓库运营
  • 系列六、Consul
  • Java集合/泛型篇----第一篇