从零开始开发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

相关文章

windows下安装Nginx全过程

《windows下安装Nginx全过程》文章介绍了HTTP和反向代理服务器的概念,包括正向代理和反向代理的区别,并详细描述了如何安装和配置Nginx作为反向代理服务器... 目录概念代理正向代理反向代理安装基本属性nginx.conf查询结构属性使用运行重启停止总结概念是一个高性能的HTTP和反向代理we

Agent开发核心技术解析以及现代Agent架构设计

《Agent开发核心技术解析以及现代Agent架构设计》在人工智能领域,Agent并非一个全新的概念,但在大模型时代,它被赋予了全新的生命力,简单来说,Agent是一个能够自主感知环境、理解任务、制定... 目录一、回归本源:到底什么是Agent?二、核心链路拆解:Agent的"大脑"与"四肢"1. 规划模

SpringBoot+Vue3整合SSE实现实时消息推送功能

《SpringBoot+Vue3整合SSE实现实时消息推送功能》在日常开发中,我们经常需要实现实时消息推送的功能,这篇文章将基于SpringBoot和Vue3来简单实现一个入门级的例子,下面小编就和大... 目录前言先大概介绍下SSE后端实现(SpringBoot)前端实现(vue3)1. 数据类型定义2.

Python+wxPython开发一个文件属性比对工具

《Python+wxPython开发一个文件属性比对工具》在日常的文件管理工作中,我们经常会遇到同一个文件存在多个版本,或者需要验证备份文件与源文件是否一致,下面我们就来看看如何使用wxPython模... 目录引言项目背景与需求应用场景核心需求运行结果技术选型程序设计界面布局核心功能模块关键代码解析文件大

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

在C#中调用Windows防火墙界面的常见方式

《在C#中调用Windows防火墙界面的常见方式》在C#中调用Windows防火墙界面(基础设置或高级安全设置),可以使用进程启动(Process.Start)或Win32API来实现,所以本文给大家... 目录引言1. 直接启动防火墙界面(1) 打开基本防火墙设置(firewall.cpl)(2) 打开高

基于Python实现局域网内Windows桌面文件传输

《基于Python实现局域网内Windows桌面文件传输》这篇文章介绍了如何使用Python实现一个局域网文件传输系统,包括发送端和接收端的代码示例,发送端和接收端都需要在同一局域网内运行,并且确保防... 目录发送端代码 (sender.py)接收端代码 (receiver.py)图形界面版本 (可选)使

linux实现对.jar文件的配置文件进行修改

《linux实现对.jar文件的配置文件进行修改》文章讲述了如何使用Linux系统修改.jar文件的配置文件,包括进入文件夹、编辑文件、保存并退出编辑器,以及重新启动项目... 目录linux对.jar文件的配置文件进行修改第一步第二步 第三步第四步总结linux对.jar文件的配置文件进行修改第一步进

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql