C++ 将CoreWindow作为函数参数传递时出错
我是UWP和WinRT新手,我已经知道DirectX11和Win32,我对学习UWP和WinRT非常感兴趣 DXMainResources是一个使用Diret3D和Direct2D的类,创建资源时最重要的是窗口(CoreWindow),但是,当将窗口作为函数参数传递时,会出现许多错误,例如: C2065错误“bEnableDepthStencilBuffer”:未声明的标识符 错误C2065“窗口”:未声明的标识符 错误C2065“窗口”:未声明的标识符 面对这些错误,请删除CoreWindow窗口参数,程序将进行编译,但窗口作为参数是必需的,因为我需要其高度和宽度来创建交换链和深度模具视图的纹理 是否有方法将窗口作为参数传递 我使用的是DirectX 11.3接口,我使用的WinRT版本是2.0.201026.4C++ 将CoreWindow作为函数参数传递时出错,c++,windows,uwp,windows-runtime,directx,C++,Windows,Uwp,Windows Runtime,Directx,我是UWP和WinRT新手,我已经知道DirectX11和Win32,我对学习UWP和WinRT非常感兴趣 DXMainResources是一个使用Diret3D和Direct2D的类,创建资源时最重要的是窗口(CoreWindow),但是,当将窗口作为函数参数传递时,会出现许多错误,例如: C2065错误“bEnableDepthStencilBuffer”:未声明的标识符 错误C2065“窗口”:未声明的标识符 错误C2065“窗口”:未声明的标识符 面对这些错误,请删除CoreWindow
#pragma once
#include "pch.h"
#include <d3d11_3.h>
#include <d2d1_3.h>
#include <dxgi1_4.h>
#include <dwrite_3.h>
#include <array>
using namespace D2D1;
template<class Interface> void TSafeRelease(Interface** ppInterface)
{
if (*ppInterface)
{
(*ppInterface)->Release();
(*ppInterface) = nullptr;
}
}
class DXMainResources
{
public:
DXMainResources()
{
d3dDev = nullptr;
d3dDevContext = nullptr;
d3dRTView = nullptr;
d3dDSView = nullptr;
d2dDev = nullptr;
d2dDevContext = nullptr;
d2dTargetBitmap = nullptr;
dxgiFactory = nullptr;
dxgiDev = nullptr;
dxgiDefaultAdapter = nullptr;
dxgiSwapChain = nullptr;
dwriteFactory = nullptr;
dwriteTextFmt = nullptr;
featureLevel = static_cast<D3D_FEATURE_LEVEL>(0);
dxgiSwapChainFmt = DXGI_FORMAT_UNKNOWN;
dxgiDepthStencilFmt = DXGI_FORMAT_UNKNOWN;
viewPort = D3D11_VIEWPORT();
}
~DXMainResources()
{
}
void CreateResources(CoreWindow const& window, bool bOnlyDirect2D = false, bool bEnableDepthStencilBuffer = true
, DXGI_FORMAT dxgiSwapChainFmt_ = DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT dxgiDepthStencilFmt_ = DXGI_FORMAT_D24_UNORM_S8_UINT
, DXGI_SWAP_EFFECT swapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL)
{
dxgiSwapChainFmt = dxgiSwapChainFmt_;
dxgiDepthStencilFmt = dxgiDepthStencilFmt_;
CoreWindow window_ = window;
std::array<D3D_FEATURE_LEVEL, 9> featureLevels =
{
D3D_FEATURE_LEVEL_12_1,
D3D_FEATURE_LEVEL_12_0,
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_9_3,
D3D_FEATURE_LEVEL_9_2,
D3D_FEATURE_LEVEL_9_1,
};
UINT deviceFlags = D3D11_CREATE_DEVICE_DEBUG | D3D11_CREATE_DEVICE_BGRA_SUPPORT;
HRESULT hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, deviceFlags, featureLevels.data(), static_cast<UINT>(std::size(featureLevels))
, D3D11_SDK_VERSION, reinterpret_cast<ID3D11Device**>(&d3dDev), &featureLevel, nullptr);
hr = d3dDev->QueryInterface(__uuidof(IDXGIDevice3), reinterpret_cast<void**>(&dxgiDev));
hr = dxgiDev->GetAdapter(reinterpret_cast<IDXGIAdapter**>(&dxgiDefaultAdapter));
hr = dxgiDefaultAdapter->GetParent(__uuidof(IDXGIFactory4), reinterpret_cast<void**>(&dxgiFactory));
DXGI_SWAP_CHAIN_DESC1 swapChainDesc;
ZeroMemory(&swapChainDesc, sizeof(DXGI_SWAP_CHAIN_DESC1));
swapChainDesc.BufferCount = 2;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.Format = dxgiSwapChainFmt_;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SwapEffect = swapEffect;
hr = dxgiFactory->CreateSwapChainForCoreWindow(d3dDev, reinterpret_cast<IUnknown*>(window_)
, &swapChainDesc, nullptr, reinterpret_cast<IDXGISwapChain1**>(&dxgiSwapChain));
if (bOnlyDirect2D)
{
IDXGISurface2* dxgiBackBufferSurface = nullptr;
hr = dxgiSwapChain->GetBuffer(0, __uuidof(IDXGISurface2), reinterpret_cast<void**>(&dxgiBackBufferSurface));
D2D1_CREATION_PROPERTIES creationProps = CreationProperties(D2D1_THREADING_MODE_SINGLE_THREADED, D2D1_DEBUG_LEVEL_INFORMATION, D2D1_DEVICE_CONTEXT_OPTIONS_NONE);
D2D1_BITMAP_PROPERTIES1 bmpProps = BitmapProperties1(D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_TARGET
, PixelFormat(dxgiSwapChainFmt_, D2D1_ALPHA_MODE_IGNORE));
hr = D2D1CreateDevice(dxgiDev, creationProps, reinterpret_cast<ID2D1Device**>(&d2dDev));
hr = d2dDev->CreateDeviceContext(creationProps.options, &d2dDevContext);
hr = d2dDevContext->CreateBitmapFromDxgiSurface(dxgiBackBufferSurface, bmpProps, &d2dTargetBitmap);
d2dDevContext->SetTarget(d2dTargetBitmap);
TSafeRelease(&dxgiBackBufferSurface);
}
else
{
IDXGISurface2* dxgiBackBufferSurface = nullptr;
hr = dxgiSwapChain->GetBuffer(0, __uuidof(IDXGISurface2), reinterpret_cast<void**>(&dxgiBackBufferSurface));
D2D1_CREATION_PROPERTIES creationProps = CreationProperties(D2D1_THREADING_MODE_SINGLE_THREADED, D2D1_DEBUG_LEVEL_INFORMATION, D2D1_DEVICE_CONTEXT_OPTIONS_NONE);
D2D1_BITMAP_PROPERTIES1 bmpProps = BitmapProperties1(D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_TARGET
, PixelFormat(dxgiSwapChainFmt_, D2D1_ALPHA_MODE_IGNORE));
hr = D2D1CreateDevice(dxgiDev, creationProps, reinterpret_cast<ID2D1Device**>(&d2dDev));
hr = d2dDev->CreateDeviceContext(creationProps.options, &d2dDevContext);
hr = d2dDevContext->CreateBitmapFromDxgiSurface(dxgiBackBufferSurface, bmpProps, &d2dTargetBitmap);
d2dDevContext->SetTarget(d2dTargetBitmap);
TSafeRelease(&dxgiBackBufferSurface);
d3dDev->GetImmediateContext3(&d3dDevContext);
ID3D11Texture2D1* d3dBackBufferTex = nullptr;
hr = dxgiSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D1), reinterpret_cast<void**>(&d3dBackBufferTex));
hr = d3dDev->CreateRenderTargetView1(d3dBackBufferTex, nullptr, &d3dRTView);
TSafeRelease(&d3dBackBufferTex);
if (bEnableDepthStencilBuffer)
{
ID3D11Texture2D1* d3dDepthStencilTex = nullptr;
D3D11_TEXTURE2D_DESC1 depthStencilTexDesc;
ZeroMemory(&depthStencilTexDesc, sizeof(D3D11_TEXTURE2D_DESC1));
depthStencilTexDesc.ArraySize = 1;
depthStencilTexDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
depthStencilTexDesc.Format = dxgiDepthStencilFmt_;
depthStencilTexDesc.Height = window_.Bounds().Height;
depthStencilTexDesc.MipLevels = 1;
depthStencilTexDesc.SampleDesc.Count = 1;
depthStencilTexDesc.Width = window_.Bounds().Width;
hr = d3dDev->CreateTexture2D1(&depthStencilTexDesc, nullptr, &d3dDepthStencilTex);
hr = d3dDev->CreateDepthStencilView(d3dDepthStencilTex, nullptr, &d3dDSView);
d3dDevContext->OMSetRenderTargets(1, reinterpret_cast<ID3D11RenderTargetView**>(&d3dRTView), d3dDSView);
TSafeRelease(&d3dDepthStencilTex);
}
else
{
d3dDevContext->OMSetRenderTargets(1, reinterpret_cast<ID3D11RenderTargetView**>(&d3dRTView), nullptr);
}
viewPort.Height = window_.Bounds().Height;
viewPort.MaxDepth = 1.0f;
viewPort.Width = window_.Bounds().Width;
d3dDevContext->RSSetViewports(1, &viewPort);
}
hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory3), reinterpret_cast<IUnknown**>(&dwriteFactory));
hr = dwriteFactory->CreateTextFormat(L"Segoe", nullptr, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 11.0f
, L"en-US", reinterpret_cast<IDWriteTextFormat**>(&dwriteTextFmt));
}
ID3D11Device3* GetD3D11Device() const { return d3dDev; }
ID3D11DeviceContext3* GetD3D11DeviceContext() const { return d3dDevContext; }
ID3D11RenderTargetView1* GetD3D11RenderTargetView() const { return d3dRTView; }
ID3D11DepthStencilView* GetD3D11DepthStencilView() const { return d3dDSView; }
ID2D1Device2* GetD2DDevice() const { return d2dDev; }
ID2D1DeviceContext2* GetD2DDeviceContext() const { return d2dDevContext; }
ID2D1Bitmap1* GetD2DTargetBitmap() const { return d2dTargetBitmap; }
IDXGIFactory4* GetDXGIFactory() const { return dxgiFactory; }
IDXGIDevice3* GetDXGIDevice() const { return dxgiDev; }
IDXGIAdapter3* GetDXGIDefaultAdapter() const { return dxgiDefaultAdapter; }
IDXGISwapChain3* GetDXGISwapChain() const { return dxgiSwapChain; }
IDWriteFactory* GetDWriteFactory() const { return dwriteFactory; }
IDWriteTextFormat3* GetDWriteTextFormat() const { return dwriteTextFmt; }
D3D_FEATURE_LEVEL GetD3DDeviceFeatureLevel() { return featureLevel; }
DXGI_FORMAT GetDXGISwapChainFormat() { return dxgiSwapChainFmt; }
DXGI_FORMAT GetDXGIDepthStencilFormat() { return dxgiDepthStencilFmt; }
D3D11_VIEWPORT GetD3D11ViewPort() { return viewPort; }
private:
ID3D11Device3* d3dDev;
ID3D11DeviceContext3* d3dDevContext;
ID3D11RenderTargetView1* d3dRTView;
ID3D11DepthStencilView* d3dDSView;
ID2D1Device2* d2dDev;
ID2D1DeviceContext2* d2dDevContext;
ID2D1Bitmap1* d2dTargetBitmap;
IDXGIFactory4* dxgiFactory;
IDXGIDevice3* dxgiDev;
IDXGIAdapter3* dxgiDefaultAdapter;
IDXGISwapChain3* dxgiSwapChain;
IDWriteFactory* dwriteFactory;
IDWriteTextFormat3* dwriteTextFmt;
D3D_FEATURE_LEVEL featureLevel;
DXGI_FORMAT dxgiSwapChainFmt;
DXGI_FORMAT dxgiDepthStencilFmt;
D3D11_VIEWPORT viewPort;
};
#pragma一次
#包括“pch.h”
#包括
#包括
#包括
#包括
#包括
使用名称空间D2D1;
模板void TSafeRelease(接口**p接口)
{
如果(*p接口)
{
(*p接口)->Release();
(*p接口)=空PTR;
}
}
类资源
{
公众:
DXMainResources()
{
d3dDev=空PTR;
d3dDevContext=nullptr;
d3dRTView=空PTR;
d3dDSView=nullptr;
d2dDev=空PTR;
d2dDevContext=nullptr;
d2dTargetBitmap=nullptr;
dxgiFactory=nullptr;
dxgiDev=nullptr;
dxgiDefaultAdapter=nullptr;
dxgiSwapChain=nullptr;
dwriteFactory=nullptr;
dwriteTextFmt=nullptr;
featureLevel=静态施法(0);
dxgiSwapChainFmt=DXGI_格式_未知;
dxgiDepthStencilFmt=DXGI_格式_未知;
viewPort=D3D11_viewPort();
}
~DXMainResources()
{
}
void CreateResources(corefown const&window,bool bOnlyDirect2D=false,bool bEnableDepthStencilBuffer=true
,DXGI_格式dxgiSwapChainFmt_=DXGI_格式B8G8R8A8_UNORM,DXGI_格式dxgiDepthStencilFmt_=DXGI_格式D24_UNORM
,DXGI_SWAP_EFFECT swapEffect=DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL)
{
dxgiSwapChainFmt=dxgiSwapChainFmt;
dxgiDepthStencilFmt=dxgiDepthStencilFmt;
CoreWindow窗口=窗口;
std::阵列特性级别=
{
D3D_功能_级别_12_1,
D3D_功能_级别_12_0,
D3D_特征_等级_11_1,
D3D_特征_等级_11_0,
D3D_功能_级别_10_1,
D3D_功能_级别_10_0,
D3D_功能_级别_9_3,
D3D_功能_级别_9_2,
D3D_功能_级别_9_1,
};
UINT deviceFlags=D3D11_创建_设备_调试| D3D11_创建_设备_BGRA_支持;
HRESULT hr=D3D11CreateDevice(nullptr、D3D_驱动程序_类型_硬件、nullptr、deviceFlags、FeatureLevel.data()、静态_转换(标准::大小(FeatureLevel))
,D3D11_SDK_VERSION,reinterpret_cast(&d3dDev),&featureLevel,nullptr);
hr=d3dDev->查询接口(IDXGIDevice3),重新解释cast(&dxgiDev));
hr=dxgiDev->GetAdapter(重新解释强制转换(&dxgiDefaultAdapter));
hr=dxgiDefaultAdapter->GetParent(uuuidof(IDXGIFactory4),重新解释cast(&dxgiFactory));
DXGI交换链描述交换链;
零内存(&swapChainDesc,sizeof(DXGI_SWAP_CHAIN_DESC1));
swapChainDesc.BufferCount=2;
swapChainDesc.BufferUsage=DXGI\u USAGE\u RENDER\u TARGET\u输出;
swapChainDesc.Format=dxgiSwapChainFmt;
swapChainDesc.SampleDesc.Count=1;
swapChainDesc.SwapEffect=SwapEffect;
hr=dxgiFactory->CreateSwapChainForCoreWindow(d3dDev,重新解释(窗口)
、和swapChainDesc、nullptr、重新解释铸造(&dxgiSwapChain));
如果(bOnlyDirect2D)
{
IDXGISurface2*dxgiBackBufferSurface=nullptr;
hr=dxgiSwapChain->GetBuffer(0,u uuidof(IDXGISurface2),重新解释强制转换(&dxgiBackBufferSurface));
D2D1\创建\属性creationProps=创建属性(D2D1\线程化\模式\单线程化,D2D1\调试\级别\信息,D2D1\设备\上下文\选项\无);
D2D1_位图_属性1 bmpProps=位图属性1(D2D1_位图_选项_无法| D2D1_位图_选项_目标
,像素格式(dxgiSwapChainFmt,D2D1α模式忽略);
hr=D2D1CreateDevice(dxgiDev、creationProps、reinterpret_cast(&d2dDev));
hr=d2dDev->CreateDeviceContext(creationProps.options和d2dDevContext);
hr=d2dDevContext->CreateBitmapFromDxgiSurface(dxgiBackBufferSurface、bmpProps和d2dTargetBitmap);
d2dDevContext->SetTarget(d2dTargetBitmap);
TSafeRelease(&dxgiBackBufferSurface);
}
其他的
{
IDXGISurface2*dxgiBackBufferSurface=nullptr;
hr=dxgiSwapChain->GetBuffer(0,u uuidof(IDXGISurface2),重新解释强制转换(&dxgiBackBufferSurface));
D2D1\创建\属性creationProps=创建属性(D2D1\线程化\模式\单线程化,D2D1\调试\级别\信息,D2D1\设备\上下文\选项\无);
D2D1_位图_属性1 bmpProps=位图属性1(D2D1_位图_选项_无法| D2D1_位图_选项_目标
,像素格式(dxgiSwapChainFmt,D2D1α模式忽略);
hr=D2D1CreateDevice(dxgiDev、creationProps、reinterpret_cast(&d2dDev));
hr=d2dDev->CreateDeviceContext(creationProps.options和d2dDevContext);
hr=d2dDevContext->CreateBitmapFromDxgiSurface(dxgiBackBufferSurface、bmpProps和d2dTargetBitmap);
d2dDevContext->SetTarget(d2dTargetBitmap);
TSafeRelease(&dxgiBackBufferSurface);
d3dDev->GetImmediateContext 3(&d3dDevContext);
ID3D11Texture2D1*d3dBackBufferTex=nullptr;
hr=dxgiSwapChain->GetBuffer(0,uu
#include <winrt/Windows.UI.Core.h>
using namespace winrt::Windows::UI::Core;