2014-12-25 65 views
2

我有Direct2D位圖縮放問題。我使用example從文件中加載了一個位圖,然後我想自己縮放位圖(適合查看保存比例,添加陰影效果...),但Direct2D自動縮放位圖(例如,在調整窗口大小時),我不知道如何以防止這種行爲。如何防止或關閉位圖的direct2d「自動縮放」?

例如,在位圖加載到一個小窗口(CView)後,它會正確填充整個窗口(根據OnDraw),並且當我最大化它時,D2D拉伸我的位圖並丟失位圖質量,最終位圖大大超出窗口的邊界儘管我的OnDraw方法。

void CWDCView::OnDraw(CDC* /*pDC*/) 
{ 
    CWDCDoc* pDoc = GetDocument(); 
    ASSERT_VALID(pDoc); 
    if (!pDoc) return; 

    HRESULT hr = S_OK; 

    ID2D1DeviceContext *deviceContext; 
    pRenderTarget->QueryInterface(&deviceContext); //ID2D1HwndRenderTarget* pRenderTarget 

    RECT rc = {0,0,0,0}; 
    GetClientRect(&rc); 

    deviceContext->BeginDraw(); 

    deviceContext->Clear(D2D1::ColorF(D2D1::ColorF(0xC8D2E1, 1.0f))); 

    D2D1_RECT_F rect={0,0,rc.right,rc.bottom}; 
    deviceContext->DrawBitmap(m_pBitmap,rect); //ID2D1Bitmap *m_pBitmap 

    deviceContext->EndDraw(); 

    if (hr == D2DERR_RECREATE_TARGET) 
    { 
     hr = S_OK; 
     ReleaseDeviceResources(); 
    } 

    SafeRelease(&deviceContext); 
} 

那麼如何防止或關閉這種「自動縮放」呢?

我想補充一點。如果像這樣繪製位圖deviceContext->DrawBitmap(m_pBitmap); /*without rect*/它只繪製位圖的一部分而不將它安裝到窗口中,但是最大化它時仍然拉伸它。

回答

1

渲染目標不能自動調整大小。在你的情況下,你正在改變窗口的大小,但這不會導致「附加」渲染目標大小的變化。

你應該處理您的窗口的大小調整事件,然後你有兩種可能性:

  1. 與新的大小重新創建您的渲染目標。
  2. 使用ID2D1HwndRenderTarget::ResizeIDXGISwapChain::ResizeBuffers

此外,您可以檢查:

+0

謝謝您的回答! ID2D1HwndRenderTarget :: Resize解決了這個問題。 – Craftsmann