2012-04-08 38 views
4

我試圖用Direct2D在窗口上繪製128x128位圖。然而,什麼也沒有顯示,並且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; 
} 

我在Visual Studio 2010

+0

我不知道的DirectX,但在圖形,當你看不到任何東西的話,那有可能是你有「雙緩衝區「啓用,你不交換緩衝區。是這樣嗎? – Shahbaz 2012-04-08 11:31:12

+0

@Shahbaz我不認爲是這樣的......我正在繪製另一個純色矩形,顯示出來很好。我認爲Direct2D會照顧它,因爲它應該用於桌面界面,而不是使用Direct3D的複雜圖形渲染。 – Joshua 2012-04-08 12:25:41

回答

0

的方式使用C++與本地WinAPI的調試,這是使用各種AP​​I鎖調用獲取指向圖像數據的指針,然後通過調試器或printf檢查圖像數據,以驗證數據是否符合您的期望。

HBITMAP和D2D表面有不同的鎖定呼叫,但可以使用相同的想法。您應該能夠縮小收到錯誤數據的位置。

1

我認爲你仍然需要在WM_PAINT中使用經典的BeginPaint(),然後進行D2D渲染,然後調用EndPaint()。這就是我的代碼所做的,我認爲這正是MSDN示例代碼小玩意兒所做的。

+0

我研究過的MSDN示例不使用BeginPaint/EndPaint。相反,他們只需在用Direct2D繪製窗口後調用ValidateRect。 – 2014-01-06 13:44:08

1

我在從資源加載位圖和運行CreateBitmapFromWicBitmap時遇到問題的D2D時遇到了同樣的問題。幫助我的同事,關鍵問題是使用WICBitmapIgnoreAlpha作爲位圖沒有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);