2012-04-08 7 views
4

Я пытаюсь нарисовать растровое изображение 128x128 на окне с Direct2D. Однако ничего не отображается, и EndDraw() не возвращает никаких ошибок.Direct2D отказывается рисовать растровое изображение на окне, не работает

Это мой WM_PAINT код:

case WM_PAINT: 
     D2D1_RECT_F testd2dbuttonrect; 

     mainwRT->BeginDraw(); 
     mainwRT->SetTransform(D2D1::Matrix3x2F::Identity()); 

     testd2dbutton.pd2drectgm->GetRect(&testd2dbuttonrect); 
     mainwRT->FillRectangle(&testd2dbuttonrect, pSolidBrush); 

     //This is where I'm trying to draw my bitmap 
     mainwRT->FillRectangle(D2D1::RectF(0.0f,0.0f,127.0f,127.0f), pBgndBrush); 

     errmsg = mainwRT->EndDraw(); 
     if(!SUCCEEDED(errmsg)) 
      printf("EndDraw() error: %d\r\n", errmsg); 
     break; 

Я подозреваю, что это может быть потому, что данные растровый я загружен из Visual Studio ресурса мусор, но у меня нет никакого способа знать, так как ничего не удается, и дает Сообщения об ошибках. Это код, который я использовал для загрузки ID2D1Bitmap из ресурса:

int LoadBitmapFromResource(IWICImagingFactory *pImageFactory, ID2D1RenderTarget *pRT, int resID, ID2D1Bitmap **ppD2DBitmap) 
{ 
    int errmsg; 

    HBITMAP hbitmap; 
    WICBitmapAlphaChannelOption wicalpha; 
    IWICBitmap *pwicbitmap; 
    IWICBitmapSource *pconvertedwicbitmap; 
    IWICFormatConverter *pConverter; 

    ID2D1Factory *d2dfactory; 
    D2D1_BITMAP_PROPERTIES d2dbp; 
    D2D1_PIXEL_FORMAT d2dpf; 
    FLOAT dpiX; 
    FLOAT dpiY; 

    hbitmap = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCEW(resID)); 
    wicalpha = WICBitmapUseAlpha; 

    errmsg = pImageFactory->CreateBitmapFromHBITMAP(hbitmap, NULL, wicalpha, &pwicbitmap); 
    if(!SUCCEEDED(errmsg)) 
    { 
     printf("LoadBitmapFromResource::CreateBitmapFromHBITMAP() error: %x\r\n", errmsg); 
     return errmsg; 
    } 

    errmsg = pImageFactory->CreateFormatConverter(&pConverter); 
    if(!SUCCEEDED(errmsg)) 
    { 
     printf("LoadBitmapFromResource::CreateFormatConverter() error: %x\r\n", errmsg); 
     return errmsg; 
    } 

    d2dpf.format = DXGI_FORMAT_B8G8R8A8_UNORM; 
    d2dpf.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED; 
    pRT->GetFactory(&d2dfactory); 
    d2dfactory->GetDesktopDpi(&dpiX, &dpiY); 
    d2dbp.pixelFormat = d2dpf; 
    d2dbp.dpiX = dpiX; 
    d2dbp.dpiY = dpiY; 

    pConverter->Initialize(pwicbitmap, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, NULL, 0.0f, WICBitmapPaletteTypeMedianCut); 
    if(!SUCCEEDED(errmsg)) 
    { 
     printf("LoadBitmapFromResource::Initialize() error: %x\r\n", errmsg); 
     return errmsg; 
    } 

    errmsg = WICConvertBitmapSource(GUID_WICPixelFormat32bppPBGRA, pwicbitmap, &pconvertedwicbitmap); 
    if(!SUCCEEDED(errmsg)) 
    { 
     printf("LoadBitmapFromResource::WICConvertBitmapSource() error: %x\r\n", errmsg); 
     return errmsg; 
    } 

    errmsg = pRT->CreateBitmapFromWicBitmap(pconvertedwicbitmap, &d2dbp, ppD2DBitmap); 
    if(!SUCCEEDED(errmsg)) 
    { 
     printf("LoadBitmapFromResource::CreateBitmapFromWicBitmap() error: %x\r\n", errmsg); 
     return errmsg; 
    } 

    pConverter->Release(); 
    pwicbitmap->Release(); 
    DeleteObject(hbitmap); 

    return 0; 
} 

Я использую C++ с родной WinAPI в Visual Studio 2010.

+0

Я не знаю, DirectX, но в графике, когда вы ничего не видите вообще, вполне возможно, что у вас есть «двойник буфера ", и вы не меняете буфер. Это так? – Shahbaz

+0

@Shahbaz Я не думаю, что это так ... Я рисую еще один сплошной цветной прямоугольник, который хорошо выглядит. Я думаю, Direct2D позаботится об этом, так как предполагается, что он будет использоваться для настольных интерфейсов, а не для сложного графического рендеринга, для которого используется Direct3D. – Joshua

ответ

0

Путь к отладить это использовать различные блокировки API вызовов получить указатель на данные изображения, затем проверить данные изображения, либо через отладчик, либо printf, чтобы проверить, что данные - это то, что вы ожидаете.

Существуют разные вызовы Lock для HBITMAP и поверхности D2D, но та же идея может быть использована. Вы должны сузить место, где вы получаете плохие данные.

1

Я думаю, вам все равно придется использовать классический BeginPaint() в WM_PAINT, а затем выполнить рендеринг D2D, а затем вызвать EndPaint(). Это то, что делает мой код, и я думаю, что это то, что делают gizmos образца кода MSDN.

+0

Образцы MSDN, которые я изучил, не используют BeginPaint/EndPaint. Вместо этого они просто вызывают ValidateRect после рисования окна с помощью Direct2D. –

1

У меня была такая же проблема, когда загрузка растрового изображения из ресурса и D2D возникла при запуске CreateBitmapFromWicBitmap. Помогли моему коллеге, ключевой вопрос - использовать WICBitmapIgnoreAlpha, поскольку у Bitmap нет Alpha (по крайней мере мой BITMAP в ресурсе не имеет Alpha).

И даже вам не нужно конвертер, только простой код

hbitmap = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(resID)); 
if (hbitmap==0) 
{ 
    SafeRelease(&pImageFactory); 
    return nullptr; 
} 

hr = pImageFactory->CreateBitmapFromHBITMAP(hbitmap, NULL, wicalpha, &pwicbitmap); 
if(!SUCCEEDED(hr)) 
{ 
    DeleteObject(hbitmap); 
    SafeRelease(&pImageFactory); 
    return nullptr; 
} 
ID2D1Bitmap* ppD2DBitmap=nullptr; 
hr = pRT->CreateBitmapFromWicBitmap(pwicbitmap, &ppD2DBitmap);