Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将CoreWindow作为函数参数传递时出错_C++_Windows_Uwp_Windows Runtime_Directx - Fatal编程技术网

C++ 将CoreWindow作为函数参数传递时出错

C++ 将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

我是UWP和WinRT新手,我已经知道DirectX11和Win32,我对学习UWP和WinRT非常感兴趣

DXMainResources是一个使用Diret3D和Direct2D的类,创建资源时最重要的是窗口(CoreWindow),但是,当将窗口作为函数参数传递时,会出现许多错误,例如:

C2065错误“bEnableDepthStencilBuffer”:未声明的标识符 错误C2065“窗口”:未声明的标识符 错误C2065“窗口”:未声明的标识符

面对这些错误,请删除CoreWindow窗口参数,程序将进行编译,但窗口作为参数是必需的,因为我需要其高度和宽度来创建交换链和深度模具视图的纹理

是否有方法将窗口作为参数传递

我使用的是DirectX 11.3接口,我使用的WinRT版本是2.0.201026.4

#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;