MFC中的窗体绘制事件函数:OnCtlColor、OnPaint、OnNcPaint、OnDrawItem、OnEraseBkgnd、OnDraw
文章目录
- CWnd::OnCtlColor
- CWnd::OnPaint
- CWnd::OnNcPaint
- CWnd::OnDrawItem
- CWnd::OnEraseBkgnd
- CWnd::InvalidateRect
- CView::OnDraw
参考:https://learn.microsoft.com/
CWnd::OnCtlColor
即将绘制子控件时,框架会调用此成员函数。
afx_msg HBRUSH OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor);
参数
pDC
包含指向子窗口的显示上下文的指针。 可能是暂时性指针。
pWnd
包含指向请求颜色的控件的指针。 可能是暂时性指针。
nCtlColor
包含以下用于指定控件类型的值之一:
CTLCOLOR_BTN 按钮控件
CTLCOLOR_DLG 对话框
CTLCOLOR_EDIT 编辑控件
CTLCOLOR_LISTBOX 列表框控件
CTLCOLOR_MSGBOX 消息框
CTLCOLOR_SCROLLBAR 滚动条控件
CTLCOLOR_STATIC 静态控件
返回值
OnCtlColor 必须返回用于绘制控件背景的画笔的句柄。
注解
大多数控件将此消息发送到其父级(通常是一个对话框),以准备 pDC 来使用正确的颜色绘制控件。
若要更改文本颜色,请使用所需的红绿蓝 (RGB) 值调用 SetTextColor 成员函数。
若要更改单行编辑控件的背景色,请在 CTLCOLOR_EDIT 和 CTLCOLOR_MSGBOX 消息代码中设置画笔句柄,并调用 CDC::SetBkColor 函数来响应 CTLCOLOR_EDIT 代码。
不会对下拉组合框的列表框调用 OnCtlColor,因为下拉列表框实际上是组合框的子级,而不是窗口的子级。 若要更改下拉列表框的颜色,请在 nCtlColor 参数中创建一个 CComboBox,并在其中包含一个用于检查 CTLCOLOR_LISTBOX 的 OnCtlColor 重写。 在此处理程序中,必须使用 SetBkColor 成员函数来设置文本的背景色。
备注
框架调用此成员函数来支持你的应用程序处理 Windows 消息。 传递到函数的参数反映了收到消息时框架所接收的参数。 如果调用此函数的基类实现,该实现将使用最初随消息传递的参数,而不是你提供给该函数的参数。 若要将以下方法添加到对话框类,请使用 Visual Studio 属性窗格添加 WM_CTLCOLOR 的消息处理程序。 或者,可以手动将 ON_WM_CTLCOLOR() 条目添加到消息映射。
示例
// This OnCtlColor handler will change the color of a static control
// with the ID of IDC_MYSTATIC. The code assumes that the CPenWidthsDlg
// class has an initialized and created CBrush member named m_brush.
// The control will be painted with red text and a background
// color of m_brush.
HBRUSH CPenWidthsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{// Call the base class implementation first! Otherwise, it may// undo what we're trying to accomplish here.HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// Are we painting the IDC_MYSTATIC control? We can use// CWnd::GetDlgCtrlID() to perform the most efficient test.if (pWnd->GetDlgCtrlID() == IDC_MYSTATIC){// Set the text color to redpDC->SetTextColor(RGB(255, 0, 0));// Set the background mode for text to transparent // so background will show thru.pDC->SetBkMode(TRANSPARENT);// Return handle to our CBrush objecthbr = m_brush;}return hbr;
}
CWnd::OnPaint
当 Windows 或应用程序请求重绘应用程序窗口的一部分时,框架会调用此成员函数。
afx_msg void OnPaint();
注解
在调用 UpdateWindow 或 RedrawWindow 成员函数时发送 WM_PAINT 消息。
由于在设置了 RDW_INTERNALPAINT 标志的情况下调用了 RedrawWindow 成员函数,窗口可能会收到内部绘制消息。 在这种情况下,窗口可能不包含更新区域。 应用程序应调用 GetUpdateRect 成员函数来确定窗口是否包含更新区域。 如果 GetUpdateRect 返回 0,则应用程序不应调用 BeginPaint 和 EndPaint 成员函数。
应用程序需负责通过在其内部数据结构中查找每个 WM_PAINT 消息来检查任何必要的内部重绘或更新,因为 WM_PAINT 消息可能是由无效区域以及在设置了 RDW_INTERNALPAINT 标志的情况下调用 RedrawWindow 成员函数而导致的。
Windows 仅发送内部 WM_PAINT 消息一次。 在 UpdateWindow 成员函数将内部 WM_PAINT 消息发送到某个窗口后,在该窗口失效或者在设置了 RDW_INTERNALPAINT 标志的情况下再次调用 RedrawWindow 成员函数之前,不会发送或发布更多的 WM_PAINT 消息。
CWnd::OnNcPaint
需要绘制非工作区时,框架会调用此成员函数。
afx_msg void OnNcPaint();
注解
默认实现绘制窗口框架。
应用程序可以重写此调用并绘制其自身的自定义窗口框架。 剪切区域始终是矩形,即使框架的形状已更改。
CWnd::OnDrawItem
当控件或菜单的视觉方面发生更改时,框架将对所有者绘制按钮控件、组合框控件、列表框控件或菜单的所有者调用此成员函数。
afx_msg void OnDrawItem(int nIDCtl,LPDRAWITEMSTRUCT lpDrawItemStruct);
参数
nIDCtl
包含发送了 WM_DRAWITEM 消息的控件的标识符。 如果菜单发送了消息,则 nIDCtl 包含 0。
lpDrawItemStruct
指定指向 DRAWITEMSTRUCT 数据结构的长指针,该结构包含有关要绘制的项和所需绘制类型的信息。
注解
DRAWITEMSTRUCT 结构的 itemAction 成员定义要执行的绘制操作。 此成员中的数据允许控件所有者确定所需的绘制操作。
在处理此消息后返回之前,应用程序应确保 DRAWITEMSTRUCT 结构的 hDC 成员所标识的设备上下文已还原到默认状态。
如果 hwndItem 成员属于 CButton、CMenu、CListBox 或 CComboBox 对象,则调用相应类的 DrawItem 虚拟函数。 重写相应控件类的 DrawItem 成员函数可绘制项。
备注
框架调用此成员函数来支持你的应用程序处理 Windows 消息。 传递到函数的参数反映了收到消息时框架所接收的参数。 如果调用此函数的基类实现,该实现将使用最初随消息传递的参数,而不是你提供给该函数的参数。
CWnd::OnEraseBkgnd
当 CWnd 对象背景需要擦除时(例如,调整大小时),框架会调用此成员函数。
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
参数
pDC
指定设备上下文对象。
返回值
如果擦除背景,则返回非零值;否则返回 0。
注解
调用它来准备一个用于绘制的失效区域。
默认实现使用窗口类结构的 hbrBackground 成员指定的窗口类背景画笔来擦除背景。
如果 hbrBackground 成员为 NULL,则 OnEraseBkgnd 的重写版本应擦除背景色。 该版本还应通过首先对画笔调用 UnrealizeObject,然后选择画笔,将所需画笔的原点与 CWnd 坐标对齐。
如果重写的 OnEraseBkgnd 处理消息并擦除背景,则它应返回非零值以响应 WM_ERASEBKGND;这表示不需要进一步擦除。 如果它返回 0,则窗口将仍旧标记为需要擦除。 (通常,这意味着 PAINTSTRUCT 结构的 fErase 成员将是 TRUE。)
Windows 假设使用 MM_TEXT 映射模式来计算背景。 如果设备上下文使用任何其他映射模式,则擦除的区域可能不在工作区的可见部分内。
备注
框架调用此成员函数来支持你的应用程序处理 Windows 消息。 传递到函数的参数反映了收到消息时框架所接收的参数。 如果调用此函数的基类实现,该实现将使用最初随消息传递的参数,而不是你提供给该函数的参数。
CWnd::InvalidateRect
通过将给定矩形添加到 CWnd 更新区域,使给定矩形中的工作区失效。
void InvalidateRect(LPCRECT lpRect,BOOL bErase = TRUE);
参数
lpRect
指向包含要添加到更新区域的矩形(以客户端坐标表示)的 CRect 对象或 RECT 结构。 如果 lpRect 为 NULL,则将整个工作区添加到该区域。
bErase
指定是否要擦除更新区域中的背景。
注解
在发送下一条 WM_PAINT 消息时,会将失效矩形连同更新区域中的所有其他区域一起标记为可绘制。 失效区域在更新区域中累积到在下一次发生 WM_PAINT 调用时处理该区域,或者该区域被 ValidateRect 或 ValidateRgn 成员函数验证为止。
bErase 参数指定在处理更新区域时是否要擦除更新区域中的背景。 如果 bErase 为 TRUE,则在调用 BeginPaint 成员函数时擦除背景;如果 bErase 为 FALSE,则背景将保持不变。 对于更新区域的任何部分,如果 bErase 为 TRUE,则会擦除整个区域(而不仅仅是给定部分)中的背景。
每当 CWnd 更新区域不为空并且该窗口的应用程序队列中没有其他消息时,Windows 就会发送一条 WM_PAINT 消息。
类似的函数
MFC中的CWnd::Invalidate、CWnd::InvalidateRgn
void Invalidate(BOOL bErase = TRUE);
void InvalidateRect(LPCRECT lpRect, BOOL bErase = TRUE);
WIN32API中的InvalidateRect
BOOL InvalidateRect([in] HWND hWnd,[in] const RECT *lpRect,[in] BOOL bErase
);
CView::OnDraw
由框架调用以呈现文档的图像。
virtual void OnDraw(CDC* pDC) = 0;
参数
pDC
指向用于呈现文档图像的设备上下文。
注解
框架调用此函数以执行屏幕显示、打印和打印预览,并在每种情况下传递不同的设备上下文。 没有默认实现。
必须重写此函数才能显示文档的视图。 可以使用 pDC 参数所指向的 CDC 对象发出图形设备接口 (GDI) 调用。 可以在绘图前在设备上下文中选择 GDI 资源(例如笔或字体),之后将取消选择它们。 通常,绘图代码可以与设备无关;也就是说,不需要有关哪种类型的设备显示图像的信息。
若要优化绘图,请调用设备上下文的 RectVisible 成员函数,以确定是否绘制给定的矩形。 如果需要区分普通屏幕显示和打印,请调用设备上下文的 IsPrinting 成员函数。
相关文章:
MFC中的窗体绘制事件函数:OnCtlColor、OnPaint、OnNcPaint、OnDrawItem、OnEraseBkgnd、OnDraw
文章目录 CWnd::OnCtlColorCWnd::OnPaintCWnd::OnNcPaintCWnd::OnDrawItemCWnd::OnEraseBkgndCWnd::InvalidateRectCView::OnDraw 参考:https://learn.microsoft.com/ CWnd::OnCtlColor 即将绘制子控件时,框架会调用此成员函数。 afx_msg HBRUSH OnCt…...
dialogbot:开箱即用的对话机器人解决方案,涵盖问答型对话、任务型对话和聊天型对话等多种场景,为您提供全方位的对话交互体验。
dialogbot:开箱即用的对话机器人解决方案,涵盖问答型对话、任务型对话和聊天型对话等多种场景,支持网络检索问答、领域知识问答、任务引导问答和闲聊问答,为您提供全方位的对话交互体验。 人机对话系统一直是AI的重要方向…...
TCP服务器—实现数据通信
目录 前言 1.接口介绍 2.编写服务器 3.编写客户端 4.编译链接 5.测试 6.总结 前言 今天我们要介绍的是使用TCP协议实现数据通信,相比于之前写的UDP服务器实现数据信,在主体逻辑上并没有差别。客户端向服务器发送信息,服务器接受信息并回…...
基于SpringBoot实现MySQL备份与还原
基于SpringBoot实现MySQL备份与还原,需求是在页面上对所有的平台数据执行备份和恢复操作,那么就需要使用代码去调用MySQL备份和恢复的指令,下面是具体实现步骤; MySQL备份表设计 CREATE TABLE IF NOT EXISTS mysql_backups (id …...
【VUE 监听用户滑动】
监听滑动方法 一. touchstart、touchmove、touchend二.v-touch三. 自定义指令 一. touchstart、touchmove、touchend 在 Vue 中监听用户往哪个方向滑动可以通过添加事件监听器,然后在事件回调函数中判断滑动方向。常用的事件监听器有touchstart、touchmove、touche…...
通义大模型:打造更智能、更灵活的自然语言处理技术
大家好,今天我想向大家介绍一款备受瞩目的自然语言处理技术——通义大模型。作为一种基于深度学习的人工智能技术,通义大模型能够模拟人类的思维方式,实现更智能、更灵活的自然语言处理,为我们的生活和工作带来了极大的便利。 在…...
Go 流程控制
if语句使用 package mainimport "fmt"func main() {score : 700if score 700 {fmt.Println("清华")}//if支持一个初始化语句 初始化语句和条件判断用;分割if a : 700; a 700 {fmt.Println("清华")}}清华 清华if_else使用 package mainimpor…...
Python opennsfw/opennsfw2 图片/视频 鉴黄 笔记
nsfw( Not Suitable for Work)直接翻译就是 工作的时候不适合看,真文雅 nsfw效果,注意底部的分数 大体流程,输入图片/视频,输出0-1之间的数字,一般情况下,Scores < 0.2 认为是非…...
四、Linux中cd、pwd以及相对/绝对路径和特殊路径符
1、cd命令: cd命令可以切换当前工作目录,基础语法是: cd [linux路径] (1)、打开Linux的命令提示行,当前工作目录是home,输入“cd /”,可以切换到根目录下,在根目录下输…...
第八章 CUDA内存应用与性能优化篇(上篇)
cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…...
chrome浏览器改为黑色背景
chrome浏览器改为黑色背景 https://blog.csdn.net/yuchen_123456/article/details/127487278 不一样的地方:...
【AI】《动手学-深度学习-PyTorch版》笔记(十七):卷积神经网络入门
AI学习目录汇总 1、从全链接层到卷积 1.1 卷积 我们在前面学习的多层感知机中,已经认识了全链接层,缺点很明显,在稍微大点的网络模型中,参数成指数级别增长。参数量很快就达到数十亿,这样的量级几乎无法计算。为此科学家们想出一个减少参数的方法:卷积。 从全链接层到…...
element-ui table表格,根据缩放自适应
安装依赖 npm install af-table-columnmain.js 中引入依赖, import Vue from vue import ElementUI from element-ui //需要按需引入,先引入vue并引入element-ui import AFTableColumn from af-table-column Vue.use(AFTableColumn)demo样式࿱…...
【electron】electron安装过慢和打包报错:Unable to load file:
文章目录 一、安装过慢问题:二、打包报错:Unable to load file: 一、安装过慢问题: 一直处于安装过程 【解决】 #修改npm的配置文件 npm config edit#添加配置 electron_mirrorhttps://cdn.npm.taobao.org/dist/electron/二、打包报错:Unable to load…...
微服务部署中的动态扩缩容和故障迁移实践经验!快来看看!
随着微服务架构的快速普及,越来越多的组织开始将传统的单体应用转变为分布式的微服务系统。在这种架构下,动态扩缩容和故障迁移变得尤为重要,因为它们能够帮助我们应对不断变化的负载和故障情况。本文将详细介绍动态扩缩容和故障迁移的概念&a…...
代码随想录第四十五天
代码随想录第四十五天 Leetcode 70. 爬楼梯Leetcode 322. 零钱兑换Leetcode 279. 完全平方数 Leetcode 70. 爬楼梯 题目链接: 爬楼梯 自己的思路:之前是用斐波那契做的,但是现在学了完全背包,可以将m2拓展的更大一点,我们可以将楼顶n设为背包…...
Vue Baidu Map--自定义点图标bm-marker
自定义点图标 将准备好的图标放到项目中 使用import引入, 并在data中进行声明 <script> import mapIconRed from ./vue-baidu-map/img/marker_red_sprite.png export default {data() {return {mapIconRed,}}, } </script>在<bm-marker>中加入参…...
ZooKeeper的基本概念
集群角色 通常在分布式系统中,构成一个集群的每一台机器都有自己的角色,最典型的集群模式就是Master/Slave模式(主备模式)。在这种模式中,我们把能够处理所有写操作的机器称为Master机器,把所有通过异步复制方式获取最新数据&…...
SpringBoot复习:(51)默认情况下DataSource是怎么创建出来的,是什么类型的?
DataSource是通过DataSourceAutoConfiguration创建的,这个类代码如下: 可以看到DataSourceAutoConfiguration有个静态内部类PooledDataSourceConfiguration,在这个类上有个Import注解,导入了DataSourceConfiguration.Hikari这个类࿰…...
Python+Selenium自动化测试环境搭建步骤(selenium环境搭建)
一、自动化简介 1.自动化测试概念: 是把以人为驱动的测试转化为机器执行的一种过程,它是一种以程序测试程序的过程 2.自动化测试分类: 一般IT上所说的自动化测试是指功能自动化测试,通过编码的方式用一段程序来测试一个软件的功…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
