Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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++ 语法错误:标识符';TEXTMETRICA';在D3DX10Core中_C++_Directx 11_Direct3d11_Directx 10_Direct3d10 - Fatal编程技术网

C++ 语法错误:标识符';TEXTMETRICA';在D3DX10Core中

C++ 语法错误:标识符';TEXTMETRICA';在D3DX10Core中,c++,directx-11,direct3d11,directx-10,direct3d10,C++,Directx 11,Direct3d11,Directx 10,Direct3d10,我刚刚开始学习D3D,我的代码运行良好,直到我在代码中实现了D3D着色器编译器 我正在使用上的教程。如果我只是将代码从那里复制粘贴到一个新项目上,那么程序编译起来就很好了 然而,与教程不同的是,我将代码放在了不同的类中。当我试图编译我的语句时,它给了我一个错误:语法错误:“TextMetrica”(编译Direct3DRenderer.cpp) 以下是Direct3DRenderer文件: #include "Window.h" #include "Direct3DRenderer.h" #in

我刚刚开始学习D3D,我的代码运行良好,直到我在代码中实现了D3D着色器编译器

我正在使用上的教程。如果我只是将代码从那里复制粘贴到一个新项目上,那么程序编译起来就很好了

然而,与教程不同的是,我将代码放在了不同的类中。当我试图编译我的语句时,它给了我一个错误:语法错误:“TextMetrica”(编译Direct3DRenderer.cpp)

以下是Direct3DRenderer文件:

#include "Window.h"
#include "Direct3DRenderer.h"
#include "Vertex.h"

Renderer::Renderer(HWND hw)
{
    OutputDebugString("Direct3D Initializing\n");

    DXGI_SWAP_CHAIN_DESC scd;
    ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));         // ZERO OUT SCD
    scd.BufferCount = 1;                                    // HOW MANY BACKBUFFERS WE WANT
    scd.OutputWindow = hw;                                  // HANDLE TO THE OUTPUT WINDOW
    scd.Windowed = true;                                    // SHOULD WINDOW BE IN WINDOWED MODE BY DEFAULT
    scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;     // BUFFER FORMAT
    scd.BufferDesc.Width =  800;                            // BUFFER WIDTH
    scd.BufferDesc.Height = 600;                            // BUFFER HEIGHT
    scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;      // USE SWAP CHAIN AS OUTPUT TARGET
    scd.SampleDesc.Count = 4;                               // MSAA COUNT
    scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;     // FLAGS

    if (D3D11CreateDeviceAndSwapChain(
        NULL,
        D3D_DRIVER_TYPE_HARDWARE,
        NULL,
        NULL,
        NULL,
        NULL,
        D3D11_SDK_VERSION,
        &scd,
        &swapchain,
        &dev,
        NULL,
        &context
    ) == SEVERITY_SUCCESS)
    {
        OutputDebugString("SUCCESS\n");
        // Get The Address of BackBuffer
        ID3D11Texture2D* pbuffer;
        swapchain->GetBuffer(0, _uuidof(ID3D11Texture2D), (LPVOID*)& pbuffer);

        // Create a Render Target COM Object from the buffer
        dev->CreateRenderTargetView(pbuffer, NULL, &RenderTarget);
        pbuffer->Release();

        // Set Our RenderTarget as the back buffer
        context->OMSetRenderTargets(1, &RenderTarget, NULL);

        // Create Our Viewport
        viewport.Height = 800;
        viewport.Width = 600;
        viewport.TopLeftX = 0;
        viewport.TopLeftY = 0;

        context->RSSetViewports(1, &viewport);

        InitPipeline();
        InitGraphics();

    }
    else
    {
        OutputDebugString("ERROR\n");
    }
}
Renderer::~Renderer()
{
    OutputDebugString("Direct3D Cleanup Phase Started.\n");

    swapchain->SetFullscreenState(FALSE, NULL);
    swapchain->Release();
    context->Release();
    RenderTarget->Release();
    VS->Release();
    PS->Release();
    dev->Release();

    OutputDebugString("Direct3D Cleanup Phase Completed.\n");
}

void Renderer::InitPipeline()
{
    // Compile Shaders from file
    D3DX11CompileFromFile("shaders.shader", 0, 0, "VShader", "vs_4_0", 0, 0, 0, &compiled_vs, 0, 0);
    D3DX11CompileFromFile("shaders.shader", 0, 0, "PShader", "ps_4_0", 0, 0, 0, &compiled_ps, 0, 0);

    // Convert Compiled Shaders to COM Shader Objects
    dev->CreateVertexShader(compiled_vs->GetBufferPointer(), compiled_vs->GetBufferSize(), NULL, &VS);
    dev->CreatePixelShader(compiled_ps->GetBufferPointer(), compiled_ps->GetBufferSize(), NULL, &PS);

    // Sets the shaders to the device / Activates the shader
    context->VSSetShader(VS, 0, 0);
    context->PSSetShader(PS, 0, 0);

    // Create the Input Layout
    D3D11_INPUT_ELEMENT_DESC VertexElementDesc[] = {
        {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
        {"COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}
    };

    dev->CreateInputLayout(VertexElementDesc, 2, compiled_vs->GetBufferPointer(), compiled_vs->GetBufferSize(), &InputLayout);
    context->IASetInputLayout(InputLayout);
}

void Renderer::InitGraphics() {
    // Create Buffer so we can duplicate data from system memory to graphics memory
    ZeroMemory(&VBufferDesc, sizeof(VBufferDesc));

    VBufferDesc.ByteWidth = sizeof(Vertex) * 3;
    VBufferDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
    VBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    VBufferDesc.Usage = D3D11_USAGE_DYNAMIC;

    dev->CreateBuffer(&VBufferDesc, NULL, &VBuffer);

    Vertex OurVertices[] =
    {
        {0.0f, 0.5f, 0.0f,      D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f)},
        {0.45f, -0.5, 0.0f,     D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f)},
        {-0.45f, -0.5f, 0.0f,   D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f)}
    };

    // we need to map to avoid issues
    D3D11_MAPPED_SUBRESOURCE mapRes;

    context->Map(VBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &mapRes);
    memcpy(mapRes.pData, OurVertices, sizeof(OurVertices));
    context->Unmap(VBuffer, NULL);
}

void Renderer::RenderFrame()
{
    context->ClearRenderTargetView(RenderTarget, D3DXCOLOR(0.2, 0.4, 0.6, 1.0));

    // We can do the rendering here

    UINT stride = sizeof(Vertex);
    UINT offset = 0;
    context->IASetVertexBuffers(0, 1, &VBuffer, &stride, &offset);
    context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    context->Draw(3, 0);

    // Swap Buffer
    swapchain->Present(0, 0);

}

TEXTMETRICA标识符错误实际上在D3DX10Core.h中。我偷看了一下定义,那个文件似乎给了我错误。此标识符的定义应在gdi文件中


我已将include路径和lib路径添加到directx(2010年6月)SDK中,并尝试在项目的“添加依赖项”中指定d3dx10.lib、d3dx11.lib和“所有配置”设置。我是新来的,所以我不知道我做错了什么。如果需要更多的代码,请对此进行评论。

请记住,大多数DirectX 11的Internet教程都有点过时。特别是,您实际上并不需要传统的DirectX SDK。看,还有

如果使用VS 2015/2017/2019,而您仍然希望使用传统的DirectX SDK,那么您必须以特定的方式设置include/lib路径,否则您将遇到问题。有关的详细信息

欢迎您使用这些较旧的教程,并附带一些注意事项,但您也应该查看一些更“现代”的教程


更新:使用传统D3DX9、D3DX10和D3DX11实用程序库的另一个选项是使用NuGet软件包。这将除去与现代Windows SDK和VisualC++工具集混合的许多怪癖。它还包括具有简单并行许可证的可再发行二进制文件,而不必使用传统的DXSETUP。也就是说,二进制文件本身仍然非常古老,有已知的bug,并且不再受支持,所以。请参阅。

@AdrianMole-在Unicode构建中使用
A
函数和结构完全可以。只是
TEXTMETRIC
没有明确的
W
A
限定符会导致通过typedef假定TEXTMETRICW或TEXTMETRICA。可能的解决方案是OP只需要在所有其他头文件之前包含
。与OP当前文件顶部引用的
“Window.h”
不一样。@选择Window.h包含windows.h。如果您能提供,我可以帮您解决。@selbie确实-我的错误(阳光太热)。谢谢。我在2010年6月下载了DirectX Sdk,它包含了我需要的所有内容。如果需要的话,我会阅读其他的博客文章。我已经有了libs和stuff的所有设置,现在已经渲染了一个三角形来检查它是否工作。一定要给我教程文档,因为我使用的文档需要高级会员资格才能继续前进。我一定会使用您提供的DirectX工具包指南。