MFC演示双缓冲绘图算法

news2025/2/4 21:50:28

VC6新建一个单文档工程;

先添加一个小球类;

头文件和cpp文件如下;

#if !defined(AFX_SPHERE_H__835B2B85_5B12_4409_AEC0_9C5062625DDE__INCLUDED_)
#define AFX_SPHERE_H__835B2B85_5B12_4409_AEC0_9C5062625DDE__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CSphere  
{
public:
	CSphere(void);
	virtual ~CSphere();
	void SetParameter(int R,CPoint CenterPoint);
	void Draw(CDC* pDC);
public:
	int R;
	CPoint CenterPoint;

};

#endif // !defined(AFX_SPHERE_H__835B2B85_5B12_4409_AEC0_9C5062625DDE__INCLUDED_)
#include "stdafx.h"
#include "dbf.h"
#include "Sphere.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//
// Construction/Destruction
//

CSphere::CSphere()
{

}

CSphere::~CSphere()
{

}

void CSphere::SetParameter(int R, CPoint CenterPoint) {
    this->R = R;
    this->CenterPoint = CenterPoint;
}

void CSphere::Draw(CDC* pDC) {
    CPoint TopLet(CenterPoint.x - R, CenterPoint.y - R);
    CPoint BottomRight(CenterPoint.x + R, CenterPoint.y + R);
    CRect Square(TopLet, BottomRight);
    pDC->Ellipse(Square);
}

 

在视类的头文件包含 #include "Sphere.h",

为视类添加如下成员变量,

protected:
    int nWidth, nHeight;
    CSphere sphere;
    CPoint direction;
    BOOL bPlay;

在视类的构造函数中初始化,

CDbfView::CDbfView()
{
	// TODO: add construction code here
	bPlay = TRUE;
    sphere.R = GetSystemMetrics(SM_CXFULLSCREEN) / 20;
    sphere.CenterPoint.x = 200, sphere.CenterPoint.y = 200;
    direction.x = 1, direction.y = 1;
}

在类信息窗口右击视类名称,添加成员函数, 

 

 

如下添加一个成员函数,

 

函数体如下,

void CDbfView::DrawObject(CDC *pDC)
{
	sphere.Draw(pDC);
}

添加定时器;从类向导,类名定位到视类,Messages中选中WM_TIMER, 

 

点击 Add Function 添加一个函数,再点击 Edit Code,编辑定时器执行函数如下,

void CDbfView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	sphere.CenterPoint += direction;
	Invalidate(FALSE);
	
	CView::OnTimer(nIDEvent);
}

再为视类添加如下一个成员函数, 

 

void CDbfView::CollisionDetection()
{
	if (sphere.CenterPoint.x - sphere.R < 0)
        direction.x = 1;
    if (sphere.CenterPoint.x + sphere.R > nWidth)
        direction.x = -1;
    if (sphere.CenterPoint.y - sphere.R < 0)
        direction.y = 1;
    if (sphere.CenterPoint.y + sphere.R > nHeight)
        direction.y = -1;
}

再为视类添加如下一个成员函数, 

 

void CDbfView::DoubleBuffer(CDC *pDC)
{
    CRect rect;
    GetClientRect(&rect);
    nWidth = rect.Width(), nHeight = rect.Height();
    CDC memDC;
    memDC.CreateCompatibleDC(pDC);
    CBitmap NewBitmap, *poldBitmap;
    NewBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
    memDC.FillSolidRect(rect, RGB(0, 0, 0));
    poldBitmap = memDC.SelectObject(&NewBitmap);
    DrawObject(&memDC);
    CollisionDetection();
    pDC->BitBlt(0, 0, nWidth, nHeight, &memDC, 0, 0, SRCCOPY);
    memDC.SelectObject(poldBitmap);
    NewBitmap.DeleteObject();
    memDC.DeleteDC();
}

然后再OnDraw()函数中调用DoubleBuffer()函数,

void CDbfView::OnDraw(CDC* pDC)
{
    CDbfDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    DoubleBuffer(pDC);
} 

这个双缓冲绘图程序是来自一些教程,去掉它的界面部分,只演示动画小球;bPlay是控制是否开始动画,直接设为TRUE,一直动画;如果不使用双缓冲,动画的小球会闪烁,使用了就不会;

看一下到此启动程序;

 

        只是画了小球,没有动画;

因为定时器还没启动;

在视类的构造函数或者PreCreateWindow成员函数中增加 SetTimer(1, 10, 0);这句是启动定时器的;定时器也没启动;

那么MFC视类不能在以上地方启动定时器;添加一个菜单,从菜单单击函数启动定时器,

void CDbfView::OnMenuitem32771() 
{
	// TODO: Add your command handler code here
	SetTimer(1, 10, 0);	
}

 运行程序,单击菜单,然后小球开始不闪烁运动;由于加了CollisionDetection函数,碰到边会弹回;

         

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL-DQL-基本查询

数据库操作DQL语句 DQL DQL英文全称Data Query Language&#xff08;数据查询语言&#xff09;&#xff0c;用来查询数据库表中的记录关键词&#xff1a;SELECT语法 基本查询条件查询&#xff08;where&#xff09;分组查询&#xff08;group by&#xff09;排序查询&#xff0…

智能办公解决方案——电子标签

智能电子办公标签概要&#xff1a; 电子会议桌牌它外形美观大方&#xff0c;完全取代了传统塑料、纸质或铜制桌牌&#xff0c;是会议桌面显示设备的一大创新&#xff0c;与传统桌牌相比&#xff0c;具有信息化程度高、可反复使用的特点&#xff0c;是现代信息化会议的理想工具…

小物体检测、分割论文

文章目录 2023CaraNet: Context Axial Reverse Attention Network for Segmentation of Small Medical Objects 2023 CaraNet: Context Axial Reverse Attention Network for Segmentation of Small Medical Objects 摘要&#xff1a; 目的&#xff1a;准确、可靠地分割医学图…

Ubuntu 考虑采用新的 “统一默认安装 (unified default install)”

导读Ubuntu安装程序中的 “最小化安装” (Minimal installation) 是该发行版多年来最受欢迎的功能之一。 当用户选择 Ubuntu 的 “最小化安装” 选项时&#xff0c;可以在安装更少的预装应用程序情况下&#xff0c;获得完整、功能齐全的 Ubuntu 系统。 但这个功能可能要被砍掉…

【CSDN新星计划】初阶牛C/C++赛道——顺序程序设计(C语句②)

目录 3.2 最基本的语句——赋值语句 3.2 最基本的语句——赋值语句 在C程序中最常用的语句是:赋值语句和输入输出语句。其中最基本的是赋值语句程序中的计算功能大部分是由赋值语句实现的,几乎每一个有实用价值的程序都包括赋值语句。有的程序中的大部分语句都是赋值语句。先介…

进程间通信之命名管道

进程间通信之命名管道 命名管道1.命名管道概念2.创建一个命名管道2.1用命名管道实现通信2.2用命名管道实现server&client通信 命名管道 1.命名管道概念 管道应用的一个限制就是只能在具有共同祖先&#xff08;具有亲缘关系&#xff09;的进程间通信&#xff0c;这种通信可…

高并发的哲学原理(十)-- 理论无限容量:站在地球表面

前面两篇文章每一篇都花了我五十个小时以上&#xff0c;写的我是欲仙欲死&#xff0c;本文我们来务点虚&#xff0c;上上价值。 我们将从微服务架构讲起&#xff0c;一步一步追根溯源&#xff0c;找寻“分布式数据库”在另一个维度的投影&#xff0c;探寻基建、应用、服务、组织…

Java:运算符、位运算 的运算规则与用法详解

目录 运算符Math数学函数与常量类型转换强制类型转换自增和自减运算符关系运算符三元运算符 位运算& 与| 或^ 异或~ 按位取反<< >> 左移 右移运算符优先级 运算符 Math数学函数与常量 import java.lang.Math.*; public class Test{public static void main(S…

java项目之智能仓储系统(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的智能仓储系统。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&…

十八、网页端在移动端的像素

一、简介 -1. 在不同的屏幕&#xff0c;单位像素的大小是不同的&#xff0c;像素越小&#xff0c;屏幕越清晰。 手机端的像素就是宽度和高度&#xff0c;如iphone6 4.7寸 750 x 1334。 -2. 手机的像素点 远远小于 计算机的像素点。 问题&#xff1a;一个宽度为900px的网页在i…

探索AI图像安全,助力可信AI发展

探索AI图像安全&#xff0c;助力可信AI发展 0. 前言1. 人工智能发展与安全挑战1.1 人工智能及其发展1.2 人工智能安全挑战 2. WAIC 2023 多模态基础大模型的可信 AI2.1 WAIC 2023 专题论坛2.2 走进合合信息 3. AI 图像安全3.1 图像篡改检测3.2 生成式图像鉴别3.3 OCR 对抗攻击技…

这所211保护一志愿,但复试太难了,考八门课!

一、学校及专业介绍 华中师范大学&#xff08;Central China Normal University&#xff09;&#xff0c;简称“华中师大”&#xff0c;位于湖北省武汉市&#xff0c;是中华人民共和国教育部直属重点综合性师范大学&#xff0c;位列国家“双一流”、“211工程”、“985工程优势…

C++ 在线刷题网站

文章目录 1. 前言2. 效果展示3. 框架4. common4.1 工具类4.2 日志 5. 编译5.1 前言5.2 正文5.3 PathUtil5.4 Compile 6. 运行6.1 限制进程资源6.2 Run 7. 执行7.1 json7.2 Start 参数7.3 FileUtil7.4 Start 8. 启动服务8.1 安装 httplib8.2 compile_server.cpp 9. 测试 compile…

前端学习记录~2023.7.15~CSS杂记 Day7

前言一、介绍 CSS 布局1、正常布局流2、display 属性3、弹性盒子&#xff08;1&#xff09;设置 display&#xff1a;flex&#xff08;2&#xff09;设置 flex 属性 4、Grid 布局&#xff08;1&#xff09;设置 display&#xff1a;grid&#xff08;2&#xff09;在网格内放置元…

吴恩达教授深度学习--神经风格转换算法

什么是神经风格迁移&#xff1f; 假设你有一张内容图片C&#xff08;Content&#xff09;和一张具有独特风格S&#xff08;Style&#xff09;的图片&#xff0c;神经风格迁移可以让这两张图片结合&#xff0c;让原始图片具有图片S的风格。所以神经风格迁移可以解决的问题是&am…

Kafka 入门到起飞系列 - 磁盘存储 -零拷贝

Redis 是 在内存存储数据的&#xff0c;数据读取时不要经过磁盘的IO&#xff0c;只需要内存的操作&#xff0c;这也是redis访问速度快的原因 Kafka背道而驰&#xff0c;Kafka 是在磁盘存储数据的&#xff0c;发送过来的数据交给Kafka后会落盘&#xff0c;消费者读取数据时&…

【C++11】function包装器和bind包装器的简单使用

function function 包装器一些场景下模板的低效性包装器 function 修复问题包装成员函数的注意事项一道例题function包装器的意义 bind 包装器bind 包装器介绍bind 包装器可调整传参顺序bind 包装器可绑定固定参数bind 包装器的意义 C11提供了多个包装器&#xff08;wrapper,也…

BYOVD!干掉EDR/XDR/AVs进程工具

工具介绍 利用gmer驱动程序有效地禁止使用或杀死EDR和AV&#xff0c;它可以流畅地绕过HVCI&#xff1b;该样本来自 loldrivers&#xff1a;https://www.loldrivers.io/drivers/7ce8fb06-46eb-4f4f-90d5-5518a6561f15/ 关注【Hack分享吧】公众号&#xff0c;回复关键字【230614…

docker安装mariadb,并在宿主机连接docker中启动的mariadb

这篇文章主要介绍怎么在docker中安装一个mariadb数据库&#xff0c;然后在我们的电脑本机上连接虚拟机上docker运行的mariadb数据库。 首先&#xff0c;需要安装一个虚拟机软件&#xff0c;通过虚拟机软件安装一个linux操作系统&#xff0c;本篇文章安装的是ubuntu&#xff0c…

一、基础-3、MySQL卸载

1.、停止MySQL服务 winR 打开运行&#xff0c;输入 services.msc 点击 "确定" 调出系统服务。 2. 卸载MySQL相关组件 打开控制面板 ---> 卸载程序 ---> 卸载MySQL相关所有组件。 3. 删除MySQL安装目录 4. 删除MySQL数据目录 数据存放目录是在 C:\ProgramDat…