在Windows Metro下使用DirectX绘制位图

在Windows Metro下使用DirectX绘制位图,directx,windows-8,microsoft-metro,Directx,Windows 8,Microsoft Metro,我正在尝试使用DirectX创建并绘制位图,然后使用该位图绘制屏幕。我有下面的测试代码,这些代码是我从许多来源拼凑而成的。我似乎能够创建没有错误的位图,我尝试用红色填充它。然而,当我使用位图绘制屏幕时,我只得到一个黑色矩形。谁能告诉我我可能做错了什么?请注意,这是作为Windows 8 Metro应用程序运行的,如果这有区别的话 请注意,格式化程序似乎正在删除我的尖括号,我不知道如何阻止它这样做。“device”变量属于ID3D11Device类,“context”变量属于ID3D11Devic

我正在尝试使用DirectX创建并绘制位图,然后使用该位图绘制屏幕。我有下面的测试代码,这些代码是我从许多来源拼凑而成的。我似乎能够创建没有错误的位图,我尝试用红色填充它。然而,当我使用位图绘制屏幕时,我只得到一个黑色矩形。谁能告诉我我可能做错了什么?请注意,这是作为Windows 8 Metro应用程序运行的,如果这有区别的话

请注意,格式化程序似乎正在删除我的尖括号,我不知道如何阻止它这样做。“device”变量属于ID3D11Device类,“context”变量属于ID3D11DeviceContext类,d2dContext变量属于ID2D1DeviceContext类,dgixDevice变量属于IDXGIDevice类,而“d2dDevice”则属于ID2D1Device类

void PaintTestBitmap(GRectF& rect)
{
    HRESULT   hr;
    UINT      creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;

    D3D_FEATURE_LEVEL featureLevels[] = 
    {
        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
    };

    ComPtr<ID3D11Device>        device;
    ComPtr<ID3D11DeviceContext> context;
    ComPtr<ID2D1DeviceContext>  d2dContext;

    hr    = D3D11CreateDevice(  NULL,
                                D3D_DRIVER_TYPE_HARDWARE,
                                NULL,
                                creationFlags,
                                featureLevels,
                                ARRAYSIZE(featureLevels),
                                D3D11_SDK_VERSION,
                                &device,
                                NULL,
                                &context);

    if (SUCCEEDED(hr))
    {
        ComPtr<IDXGIDevice> dxgiDevice;
        device.As(&dxgiDevice);

        // create D2D device context
        ComPtr<ID2D1Device> d2dDevice;
        hr = D2D1CreateDevice(dxgiDevice.Get(), NULL, &d2dDevice);

        if (SUCCEEDED(hr))
        {
            hr = d2dDevice->CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE, &d2dContext);

            if (SUCCEEDED(hr))
            {
                ID2D1Bitmap1 *pBitmap;
                D2D1_SIZE_U  size = { rect.m_width, rect.m_height };
                D2D1_BITMAP_PROPERTIES1 properties = {{ DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED }, 96, 96, D2D1_BITMAP_OPTIONS_TARGET, 0 };

                hr = d2dContext->CreateBitmap(size, (const void *) 0, 0, &properties, &pBitmap);
                if (SUCCEEDED(hr))
                {
                    d2dContext->SetTarget(pBitmap);
                    d2dContext->BeginDraw();    
                    d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::Red));     // Clear the bitmap to Red
                    d2dContext->EndDraw();

                    // If I now use pBitmap to paint to the screen, I get a black rectange
                    // rather than the red one I was expecting
                }
            }
        }
    }
}
void PaintTestBitmap(GRectF&rect)
{
HRESULT-hr;
UINT creationFlags=D3D11\u创建设备\u BGRA\u支持;
D3D_功能_级别功能级别[]=
{
D3D_特征_等级_11_1,
D3D_特征_等级_11_0,
D3D_功能_级别_10_1,
D3D_功能_级别_10_0,
D3D_功能_级别_9_3,
D3D_功能_级别_9_2,
D3D_功能_级别_9_1
};
ComPtr装置;
ComPtr语境;
ComPtr d2dContext;
hr=D3D11CreateDevice(空,
D3D_驱动器_类型_硬件,
无效的
creationFlags,
功能级别,
阵列化(功能级别),
D3D11_SDK_版本,
&装置,
无效的
&上下文);
如果(成功(hr))
{
ComPtr-dxgiDevice;
设备组件(&dxgDevice);
//创建D2D设备上下文
ComPtr-d2dDevice;
hr=D2D1CreateDevice(dxgiDevice.Get(),NULL,&d2dDevice);
如果(成功(hr))
{
hr=d2dDevice->CreateDeviceContext(D2D1\u设备\u上下文\u选项\u无,&d2dContext);
如果(成功(hr))
{
ID2D1Bitmap1*pBitmap;
D2D1_SIZE_SIZE={rect.m_width,rect.m_height};
D2D1_位图_属性1属性={{DXGI_格式{R8G8B8A8_UNORM,D2D1_ALPHA_模式{U预乘},96,96,D2D1_位图_选项{U目标,0};
hr=d2dContext->CreateBitmap(大小,(常量void*)0、0、属性和pBitmap);
如果(成功(hr))
{
d2dContext->SetTarget(pBitmap);
d2dContext->BeginDraw();
d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::Red));//将位图清除为红色
d2dContext->EndDraw();
//如果我现在使用pBitmap绘制屏幕,我会得到一个黑色的矩形
//而不是我期待的红色
}
}
}
}
}
请注意,我对DirectX和Metro风格的应用程序都相当陌生


谢谢

您可能忘记的是您没有在上下文中绘制位图

你可以尝试的是

 hr = d2dContext->CreateBitmap(size, (const void *) 0, 0, &properties, &pBitmap);
            if (SUCCEEDED(hr))
            {
                ID2D1Image *pImage = nullptr;
                d2dContext->GetTarget(&image);

                d2dContext->SetTarget(pBitmap);
                d2dContext->BeginDraw();    
                d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::Red));     // Clear the bitmap to Red
                d2dContext->SetTarget(pImage);
                d2dContext->DrawBitmap(pBitmap);
                d2dContext->EndDraw();


            }

您要做的是存储渲染目标,然后绘制位图,最后将您的上下文设置为正确的渲染目标,并让它在上面绘制您的位图

快速浏览即可。我会研究位图格式,因为我相信D2D更喜欢BGRA,并且你如何渲染到屏幕可能会影响你的结果。谢谢你的反馈。我尝试将像素格式更改为DXGI_格式_B8G8R8A8_UNORM(带alpha和不带alpha),但仍然得到相同的结果。您知道如何使用DirectX写入位图的任何示例吗?谢谢你可以看看这个样品:或者你可以看看其他D2D样品