4

Direct2D を使用して 128x128 ビットマップをウィンドウに描画しようとしています。ただし、何も表示されEndDraw()ず、エラーも返されません。

これは私の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;
}

Visual Studio 2010 のネイティブ WinAPI で C++ を使用しています。

4

3 に答える 3

1

WM_PAINT で従来の BeginPaint() を使用し、D2D レンダリングを実行してから、EndPaint() を呼び出す必要があると思います。それが私のコードが行うことであり、MSDN サンプル コード ギズモも同様であると思います。

于 2012-04-10T18:38:00.643 に答える
1

リソースからビットマップをロードするときに同じ問題が発生し、CreateBitmapFromWicBitmap を実行すると D2D に問題が発生しました。同僚の助けを借りて、重要な問題は WICBitmapIgnoreAlpha を使用することです。ビットマップにはアルファがありません (少なくとも、リソース内の私の BITMAP にはアルファがありません)。

そして、コンバーターは必要ありません。次のような単純なコードだけです

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 );
于 2013-07-26T22:56:11.177 に答える
0

これをデバッグする方法は、さまざまなAPIロック呼び出しを使用して画像データへのポインターを取得し、デバッガーまたはprintfを介して画像データをチェックして、データが期待どおりであることを確認することです。

HBITMAPとD2Dサーフェスで使用できるロック呼び出しは異なりますが、同じアイデアを使用できます。悪いデータを取得している場所を絞り込むことができるはずです。

于 2012-04-08T13:46:43.947 に答える