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

本文主要是介绍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,这样父窗体就不会刷新子控件区域
在这里插入图片描述

这篇关于MFC窗体背景颜色的设置、控件白色背景问题、控件文本显示重叠问题、被父窗体背景覆盖的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/530524

相关文章

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql