从零开始开发3D游戏引擎 - 在QtWidget中进行Direct3D11渲染,并捕捉Windows消息

本文主要是介绍从零开始开发3D游戏引擎 - 在QtWidget中进行Direct3D11渲染,并捕捉Windows消息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DirectX 渲染

创建一个继承QWidget的类,重写paintEvent,resizeEvent
但是仅仅这样还不够,画面会一直闪烁,需要重写以下函数
virtual QPaintEngine paintEngine() const { return NULL; }*
并设置窗口属性
this->setAttribute(Qt::WA_PaintOnScreen, true);
this->setAttribute(Qt::WA_NativeWindow, true);

捕捉Windows的消息

重写nativeEventFilter,继承 public QAbstractNativeEventFilter 接口
并砸application里面install

QApplication a(argc, argv);
BugattiEngine w;
w.show();
a.installNativeEventFilter(&w);
a.installNativeEventFilter(w.GetRenderWidget());
#pragma once
#include <qwidget.h>
#include "Render/D3DX11Entry.h"
class RenderWidget :public QWidget, public QAbstractNativeEventFilter
{
public:RenderWidget(QWidget* parent = nullptr);virtual ~RenderWidget();D3DX11Entry d3d11_entry;QWidget* main_window;HWND hwnd;bool has_init;virtual QPaintEngine* paintEngine() const { return NULL; }void Init(UINT width = 800, UINT height = 600);
protected://virtual void resizeEvent(QResizeEvent* evt);virtual void paintEvent(QPaintEvent* evt); virtual void timerEvent(QTimerEvent *event);virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *) Q_DECL_OVERRIDE;
};RenderWidget::RenderWidget(QWidget* parent) :QWidget(parent)
, d3d11_entry((HWND)this->winId())
, has_init(false)
{hwnd = (HWND)this->winId();this->setAttribute(Qt::WA_PaintOnScreen, true);this->setAttribute(Qt::WA_NativeWindow, true);startTimer(1000);main_window = parentWidget()->parentWidget();
}RenderWidget::~RenderWidget()
{d3d11_entry.CleanupDevice();
}void RenderWidget::Init(UINT width, UINT height)
{setFixedSize(width, height);d3d11_entry.SetSize(width, height);d3d11_entry.InitDevice();
}//QPainter painter(this);
//painter.drawLine(80, 100, 650, 500);
void RenderWidget::paintEvent(QPaintEvent * event)
{d3d11_entry.Render();update();
}void RenderWidget::timerEvent(QTimerEvent * event)
{main_window->setWindowTitle("FPS = " + QString::number(d3d11_entry.fps));
}bool RenderWidget::nativeEventFilter(const QByteArray &eventType, void *message, long *)
{if (eventType == "windows_generic_MSG" || eventType == "windows_dispatcher_MSG"){MSG* pMsg = reinterpret_cast<MSG*>(message);if (pMsg->message == WM_KEYDOWN){qDebug() << "RenderWidget windows system message WM_KEYDOWN";}}return false;
}

这篇关于从零开始开发3D游戏引擎 - 在QtWidget中进行Direct3D11渲染,并捕捉Windows消息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应