MFC 关于OnPaint绘图的一些经验

问题描述:

在MFC中在对话框上绘图时, 要求按下按钮绘制相关图形, 写好绘制函数调用调试时,发现若是改变对话框的界面大小或者最小化/最大化或者有隐藏时会导致图形消失。

原因分析:

改变对话框的界面大小或者最小化/最大化或者有隐藏时会让整个对话框重新加载,而控件是会自己显示的,而手动绘制的图形则不会重新绘制,因此需要做这样一个事情:在改变对话框的界面大小等操作时,对要画的图形做一次重绘。

解决方法:

针对这些问题,MFC有自己的重绘机制来解决,即ON_WM_PAINT消息和OnPaint函数。

当对话框进行某些特定操作引起对话框重绘时,会发送WM_PAINT消息, ON_WM_PAINT可以捕获此消息,并自己调用OnPaint()函数来实现对某些要素图形的重新绘制;如此,只需要把要绘制的内容写进OnPaint()函数里面,并且在消息队列里加上ON_WM_PAINT即可时候特定操作下的重绘来保证图形一直显示在界面上。

代码如下:

BEGIN_MESSAGE_MAP(CDlg, CDialogEx)ON_WM_PAINT()
END_MESSAGE_MAP()void CDlg::OnPaint()
{CPaintDC dc(this);CPen pen;pen.CreatePen(PS_SOLID,10, RGB(0, 0, 0));Dc.SelectObject(pen);Dc.MoveTo(0, 0);Dc.LineTo(20, 20);
}

需要注意的是,如果绘图设备不使用CPaintDC,则会引起onpaint在没有操作的情况下也一直重绘的问题,关于这个问题的原因引用自:OnPaint不停刷新的问题_wuzoujing的博客-CSDN博客自定义控件响应WM_PAINT消息,在OnPaint中,默认有CPaintDC dc(this); 如果注释掉CPaintDC dc(this);则程序不停地刷新(计数器不停地飞涨!!),可是如果保留CPaintDC dc(this);,如下: void COpenGLControl::OnPaint() { CPaintDC dc(this); // device contexthttps://blog.csdn.net/wuzoujing/article/details/4942470

 大概原因是:

CPaintDC为窗口的OnPaint函数所使用的设备环境类。该类的构造函数会自动调用BeginPaint函数,析构函数自动调用EndPaint函数。BeginPaint函数的作用就是将窗口需要重绘的区域设置为空(也就是Update Region置空)。在正常情况下,我们接收到了WM_PAINT消息后,窗口的Update Region都是非空的(如果为空就不需要发送WM_PAINT消息了)。而当你响应这个消息的时候又不调用BeginPaint来清空,窗口的Update Region就一直是非空的,系统就会一直发送WM_PAINT消息。这样就形成了一个处理WM_PAINT消息的死循环。

如上便是自动重绘的过程, 若要使得按下按钮才开始绘制,并且在改变大小窗口后仍然显示图形的话,我是如下操作:

BEGIN_MESSAGE_MAP(CDlg, CDialogEx)ON_BN_CLICKED(IDOK, &CDlg::OnBnClickedOk)ON_WM_PAINT()
END_MESSAGE_MAP()void CDlg::OnBnClickedOk()
{m_needDraw = true;    //此处m_needDraw是成员变量, 用来判断是否按下按钮Invalidate();        //使得客户区无效, 进行一次重绘
}void CDlg::OnPaint()
{CPaintDC dc(this);if(m_needDraw==false)return;CPen pen;pen.CreatePen(PS_SOLID,10, RGB(0, 0, 0));Dc.SelectObject(pen);Dc.MoveTo(0, 0);Dc.LineTo(20, 20);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58703.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊一聊过度设计!

文章目录 什么是过度设计?过度设计的坏处如何避免过度设计充分理解问题本身保持简单小步快跑征求其他人的意见 总结 新手程序员在做设计时,因为缺乏经验,很容易写出欠设计的代码,但有一些经验的程序员,尤其是在刚学习过…

毕业5年了还不知道Android热修复?

/ 今日科技快讯 / 近日,谷歌抢在微软之前发布了ChatGPT竞品、自家人工智能聊天机器人Bard,但市场反应并不好。谷歌员工们纷纷批评包括首席执行官桑德尔皮查伊在内的公司领导层,认为公司本周宣布推出Bard的方式过于“仓促”、简直是“一团…

输出国际象棋棋盘

##1、程序分析 国际象棋是8*8的,i(07)代表行,j(07)代表列。当ij为奇数的时候,是黑色格子,反之,白色格子。 ##2、程序实现 方法一:两重循环 (1)程序: for i in range(8…

java简单实现中国象棋

java简单实现中国象棋 可以实现简单的人机对战功能,棋子移动会插入关键帧,可以悔棋等功能 运行效果 import java.awt.Canvas; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import ja…

Qt实现中国象棋:(七)悔棋

一、下棋步骤的保存 在设置保存下棋步骤之前,先定义一个bool类型的变量player用于判定是哪一方下子,设定playertrue时是红方下棋,playerfalse时是黑方下棋。 1:要想保存下棋的步骤,必须先弄明白需要保存的信息。一个下棋步骤需要…

三种版本的中国象棋

一.图片资源: 二.图片存放位置: 三.三种不同版本的中国象棋源代码 三种源代码运行之前都需要 点击项目-属性 找到这个地方,把字符集改成“使用多字节字符集”: 一.版本1:中国象棋简洁版(部分特效无…

Pygame实战:中国象棋人机对抗赛今开战、谁占上风?要不要来一盘试试?

🌳导语 哈喽!哈喽!我是木木子!今日游戏更新——中国象棋上线啦! 中国象棋是一种古老的棋类游戏,大约有两千年的历史。 是中华文明非物质文化经典产物,艺术价值泛属于整个人类文明进化史的一个…

Java实现中国象棋(人机对战)

目录 简介 成品视频 实现思路 界面实现分为了三块 棋盘抽象类 按钮组抽象类 棋子绘制接口 棋盘界面实现 棋子的实现 按钮组的实现 监听工厂和监听类 棋盘绘制类的实现 开始游戏实现 停止游戏实现 游戏抽象类 游戏实现类 可走路线和吃棋判断实现 车(ju) 炮 …

Java国际象棋 棋子的走法和吃法

------ Oracle中文开发者社区 ------ 如果你想要学习编程,关注本博客,持续获得技术支持,持续获得技术咨询 java开发企业官方账号 Oracle中国官方账号 Java中国管理部 全网粉丝30万 华为云享专家 阿里专家博主 CSDN内容合伙人 CSDN原力计划作者 51CTO专家博主 CSDN博客V账号 …

Java 中国象棋

实现一个小游戏需要知道从哪里下手,一步步实现和完善,对于一个中国象棋的小游戏,我们可以按这样的顺序展开: 界面按钮加棋子实现棋子的移动判断胜负按钮“开始游戏”和“重新开始”的实现加规则轮次悔棋背景 及 提示 一、界面 …

简单的象棋开发

我们需要准备的知识是c语言基础和easyx图形: easyx官网&#xff1a; https://easyx.cn/ 首先头文件少不了: #include<stdio.h>(c语言的头文件) #include<graphics.h>&#xff08;easyx的&#xff09; #include<mmsystem.h>&#xff08;音乐播放的&#x…

中国象棋C++实现

使用C语言开发中国象棋的小游戏 Chess.cpp // includes #include<iostream> #include<graphics.h> using namespace std;// 使用到的 WCHAR 字符 class CKind{ public:WCHAR ROOKS *(_T("车"));WCHAR KNIGHTS *_T("马");WCHAR ELEPHANTS …

用C++实现中国象棋

项目介绍 最近学习到了STL库&#xff0c;了解到一些很实用的容器&#xff0c;同时我也是个象棋爱好者&#xff0c;想着能不能做个象棋的游戏小程序出来&#xff0c;运用一下所学到的知识点&#xff0c;于是动手做了这个项目&#xff0c;花了两天左右的时间基本完成&#xff0c;…

C++中国象棋

ssdut c的大作业&#xff0c;在控制台的界面实现人人对弈&#xff0c;比较适合初学&#xff0c;自己设计了一些简单算法&#xff0c;两百多行完成。 以下正文&#xff1a; 完成中国象棋游戏&#xff0c;实现如下功能&#xff1a; 1.实现人与人之间象棋的对弈。 2.每次走子之…

Java版本实现中国象棋

预览效果 中国象棋 游戏介绍&#xff1a;中国象棋是起源于中国的一种棋&#xff0c;属于二人对抗性游戏的一种&#xff0c;在中国有着悠久的历史&#xff0c;由于用具简单&#xff0c;趣味性强&#xff0c;成为流行极为广泛的棋艺活动。阿巴阿巴阿巴 代码结构&#xff1a;Butto…

数影周报:小米汽车供应商被罚100万,1688延迟下线“1688买家旺旺”

本周看点&#xff1a;小米汽车供应商被罚100万&#xff1b;特斯拉将在硅谷招聘AI 人才&#xff1b;阳光出行等25款 App涉违规收集使用个人信息等&#xff1b;1688延迟于2月8日下线“1688买家旺旺”&#xff1b;微蚁科技完成数千万元B轮融资...... 数据安全那些事 小米汽车供应商…

Coggle 30 Days of ML (23年7月)任务二:数据可视化

Coggle 30 Days of ML (23年7月&#xff09;任务二&#xff1a;数据可视化 任务二&#xff1a;对数据集字符进行可视化&#xff0c;统计标签和字符分布 说明&#xff1a;在这个任务中&#xff0c;需要使用Pandas库对数据集的字符进行可视化&#xff0c;并统计数据集中的标签和…

阿里云服务器ECS是什么?详细介绍

阿里云服务器ECS是什么&#xff1f;云服务器和传统的物理服务器有什么区别&#xff1f;云服务器有哪些优势&#xff1f;云服务器可以什么&#xff1f;云服务器架构及云服务器包含哪些功能组件&#xff1f;阿里云百科来详细说下什么是云服务器ECS&#xff1a; 目录 阿里云服务…

使用Chrome修改user agent模拟微信内置浏览器

很多时候&#xff0c;我们需要模拟微信内置浏览器&#xff0c;今天教大家用 chrome 简单模拟。如图设置&#xff1a; F12或者右键审查元素进入开发者模式&#xff0c;点击Emulation&#xff0c;然后点击Network&#xff0c;把Spoof user agent改成Other&#xff0c;并把下面…

数据分析案例-足球运动员分析

目录 加载数据 查看数据 数据详细 ​缺值处理 异常值处理 重复值处理 运动员身高和体重分布 左脚右脚使用数量 俱乐部球员评分分析 足球运动员数是否与出生日期相关 身高与体重是否具有相关性 加载数据 #加载足球运动员数据 import numpy as np import pandas as pd impor…