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

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的重要方向&#xf…...

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&#xff08; Not Suitable for Work&#xff09;直接翻译就是 工作的时候不适合看&#xff0c;真文雅 nsfw效果&#xff0c;注意底部的分数 大体流程&#xff0c;输入图片/视频&#xff0c;输出0-1之间的数字&#xff0c;一般情况下&#xff0c;Scores < 0.2 认为是非…...

四、Linux中cd、pwd以及相对/绝对路径和特殊路径符

1、cd命令&#xff1a; cd命令可以切换当前工作目录&#xff0c;基础语法是&#xff1a; cd [linux路径] &#xff08;1&#xff09;、打开Linux的命令提示行&#xff0c;当前工作目录是home&#xff0c;输入“cd /”&#xff0c;可以切换到根目录下&#xff0c;在根目录下输…...

第八章 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 不一样的地方&#xff1a;...

【AI】《动手学-深度学习-PyTorch版》笔记(十七):卷积神经网络入门

AI学习目录汇总 1、从全链接层到卷积 1.1 卷积 我们在前面学习的多层感知机中,已经认识了全链接层,缺点很明显,在稍微大点的网络模型中,参数成指数级别增长。参数量很快就达到数十亿,这样的量级几乎无法计算。为此科学家们想出一个减少参数的方法:卷积。 从全链接层到…...

element-ui table表格,根据缩放自适应

安装依赖 npm install af-table-columnmain.js 中引入依赖&#xff0c; import Vue from vue import ElementUI from element-ui //需要按需引入&#xff0c;先引入vue并引入element-ui import AFTableColumn from af-table-column Vue.use(AFTableColumn)demo样式&#xff1…...

【electron】electron安装过慢和打包报错:Unable to load file:

文章目录 一、安装过慢问题:二、打包报错&#xff1a;Unable to load file: 一、安装过慢问题: 一直处于安装过程 【解决】 #修改npm的配置文件 npm config edit#添加配置 electron_mirrorhttps://cdn.npm.taobao.org/dist/electron/二、打包报错&#xff1a;Unable to load…...

微服务部署中的动态扩缩容和故障迁移实践经验!快来看看!

随着微服务架构的快速普及&#xff0c;越来越多的组织开始将传统的单体应用转变为分布式的微服务系统。在这种架构下&#xff0c;动态扩缩容和故障迁移变得尤为重要&#xff0c;因为它们能够帮助我们应对不断变化的负载和故障情况。本文将详细介绍动态扩缩容和故障迁移的概念&a…...

代码随想录第四十五天

代码随想录第四十五天 Leetcode 70. 爬楼梯Leetcode 322. 零钱兑换Leetcode 279. 完全平方数 Leetcode 70. 爬楼梯 题目链接: 爬楼梯 自己的思路:之前是用斐波那契做的&#xff0c;但是现在学了完全背包&#xff0c;可以将m2拓展的更大一点&#xff0c;我们可以将楼顶n设为背包…...

Vue Baidu Map--自定义点图标bm-marker

自定义点图标 将准备好的图标放到项目中 使用import引入&#xff0c; 并在data中进行声明 <script> import mapIconRed from ./vue-baidu-map/img/marker_red_sprite.png export default {data() {return {mapIconRed,}}, } </script>在<bm-marker>中加入参…...

ZooKeeper的基本概念

集群角色 通常在分布式系统中&#xff0c;构成一个集群的每一台机器都有自己的角色&#xff0c;最典型的集群模式就是Master/Slave模式(主备模式)。在这种模式中&#xff0c;我们把能够处理所有写操作的机器称为Master机器&#xff0c;把所有通过异步复制方式获取最新数据&…...

SpringBoot复习:(51)默认情况下DataSource是怎么创建出来的,是什么类型的?

DataSource是通过DataSourceAutoConfiguration创建的&#xff0c;这个类代码如下&#xff1a; 可以看到DataSourceAutoConfiguration有个静态内部类PooledDataSourceConfiguration,在这个类上有个Import注解&#xff0c;导入了DataSourceConfiguration.Hikari这个类&#xff0…...

Python+Selenium自动化测试环境搭建步骤(selenium环境搭建)

一、自动化简介 1.自动化测试概念&#xff1a; 是把以人为驱动的测试转化为机器执行的一种过程&#xff0c;它是一种以程序测试程序的过程 2.自动化测试分类&#xff1a; 一般IT上所说的自动化测试是指功能自动化测试&#xff0c;通过编码的方式用一段程序来测试一个软件的功…...

论文写得像流水账?资深教授推荐这几个AI写作辅助软件

论文写得像流水账&#xff1f;选题难、逻辑乱、语言差&#xff0c;是很多学生共同的困扰。其实&#xff0c;只要用对AI写作辅助工具&#xff0c;再配合科学的写作流程&#xff0c;就能大幅提升效率和质量。资深教授普遍推荐&#xff1a;千笔AI&#xff08;中文全流程首选&#…...

告别Wi-Fi卡顿!手把手教你读懂802.11ax的BSR机制,优化家庭网络上行体验

告别Wi-Fi卡顿&#xff01;手把手教你读懂802.11ax的BSR机制&#xff0c;优化家庭网络上行体验 你是否经历过这样的场景&#xff1a;视频会议时画面突然卡成马赛克&#xff0c;游戏团战时操作延迟飙升&#xff0c;或是上传文件进度条像蜗牛爬行&#xff1f;这些恼人的问题往往源…...

【职场】为什么越努力的人,在职场死得越惨?

为什么越努力的人&#xff0c;在职场死得越惨&#xff1f; ——没有人告诉你&#xff0c;努力本身是一种暴露。一、先说一个你亲眼见过&#xff0c;但从没想明白的现象 你身边一定有这样的人&#xff1a; 工作最拼的那个&#xff0c;最后被裁了。 加班最多的那个&#xff0c;升…...

为内部知识库问答机器人接入Taotoken多模型增强能力

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为内部知识库问答机器人接入Taotoken多模型增强能力 构建企业内部知识库问答系统&#xff0c;是提升信息流转效率和员工生产力的常…...

原子制造:从单原子操控到新材料创制的技术原理与应用

1. 原子制造&#xff1a;从宏观“锤子”到微观“镊子”的范式革命我们常说&#xff0c;人类文明史是一部材料史。从打磨石器的旧石器时代&#xff0c;到熔铸青铜的青铜时代&#xff0c;再到锻造钢铁的工业时代&#xff0c;每一次文明的跃迁&#xff0c;都伴随着我们对物质操控能…...

电池级氢氧化锂粉碎设备选型指南:氮气保护气流粉碎机详解

氢氧化锂&#xff08;LiOH&#xff09;具有易吸潮、强碱性、有一定粘附性的特点&#xff0c;且在电池级应用中对金属杂质污染零容忍。因此&#xff0c;行业主流不推荐传统的机械碾压式磨机&#xff08;如雷蒙磨&#xff0c;容易引入铁屑且密封难&#xff09;&#xff0c;而是首…...

5G网络切换实战:当gNB之间没有Xn接口时,N2/NGAP切换如何保证你的游戏不掉线?

5G网络无缝切换实战&#xff1a;无Xn接口场景下的高可靠连接方案 手游玩家小张正沉浸在激烈的团战中&#xff0c;突然屏幕右上角的延迟数字从30ms飙升至500ms——角色瞬间卡顿&#xff0c;等他重新恢复操作时&#xff0c;团队已经团灭。这种场景在5G时代本应成为历史&#xff0…...

AI嵌入式系统测试:融合经典方法与数据驱动验证的工程实践

1. 项目概述&#xff1a;当嵌入式遇见AI&#xff0c;测试的“变”与“不变”干了十几年嵌入式&#xff0c;从8位单片机玩到多核异构处理器&#xff0c;从裸机编程干到复杂的RTOS&#xff0c;我原以为测试这件事&#xff0c;左不过就是单元测试、集成测试、系统测试那几板斧&…...

深入解析PyTorch-FCN架构:FCN32s、FCN16s、FCN8s模型对比分析

深入解析PyTorch-FCN架构&#xff1a;FCN32s、FCN16s、FCN8s模型对比分析 【免费下载链接】pytorch-fcn PyTorch Implementation of Fully Convolutional Networks. (Training code to reproduce the original result is available.) 项目地址: https://gitcode.com/gh_mirro…...

高级音频解密技术实现:ncmdump模块化架构解析与自动化工作流

高级音频解密技术实现&#xff1a;ncmdump模块化架构解析与自动化工作流 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 在数字音乐版权保护日益严格的今天&#xff0c;网易云音乐的NCM加密格式为用户带来了设备兼容性的技术挑战。n…...