2015-10-09 79 views
1

我正在尋找一種方式這一GDI代碼是如何從一個設備上下文得到一個位圖...獲取圖像/位圖或gdiplus圖形對象(GDI +)

void CMFCDlg::OnPaint() 
{ 
    CDC dc(this); // Device Context for painting 
    CBitmap backgroundBmp; 

    // Get Client Area 
    CRect clientRect; 
    GetClientRect(&clientRect); 

    // Create memory DC 
    CDC memDC; 
    memDC.CreateCompatibleDC(&dc); 

    // Create compatible bitmap 
    backgroundBmp.CreateCompatibleBitmap(&memDC, clientRect.Width(), clientRect.Height()); 

    // Copy Blt Bits from DC to Bitmap 
    CBitmap* pOldBmp = dc.SelectObject(&backgroundBmp); 
    memDC.BitBlt(0, 0, clientRect.Width(), clientRect.Height(), &dc, 0, 0, SRCCOPY); 
    dc.SelectObject(pOldBmp); 

    // Release the memory DC 
    memDC.DeleteDC(); 
} 

。 ..可以在GDI +中完成,以接收GDI +圖像或位圖。

我正在尋找一些方法來做到這一點接近這一草案:

void CMFCDlg::OnPaint() 
{ 
    CDC dc(this); // Device Context for painting 
    Bitmap backgroundBmp; 

    // Get Client Area 
    CRect clientRect; 
    GetClientRect(&clientRect); 

    // Get graphics object from device context 
    Graphics gr(dc); 

    // Somehow create a compatible GDI+ bitmap 
    backgroundBmp = gr.?????? 
} 

我只看到涉及GDI對象和資源,後來轉換爲:GDI +對象的代碼。但是他們都沒有爲我工作,我覺得有一種(簡單的)其他方式可以用更舒適的GDI +環境來實現。

回答

3

您只能將GDI +繪製到設備上下文中。但是你可以使用內存設備上下文,然後繪製到DC或保存到文件:

CClientDC dc(this); 

CDC memdc; 
memdc.CreateCompatibleDC(&dc); 
CBitmap bitmap; 
bitmap.CreateCompatibleBitmap(&dc, 100, 100); 
CBitmap *oldbitmap = (CBitmap*)memdc.SelectObject(&bitmap); 

Gdiplus::Graphics graphics_memdc(memdc); 
Gdiplus::Pen pen(Gdiplus::Color(255, 0, 128, 255), 5); 
Gdiplus::Rect rect(10, 10, 80, 80); 
graphics_memdc.DrawRectangle(&pen, rect); 

現在提請dc

dc.BitBlt(0, 0, 100, 100, &memdc, 0, 0, SRCCOPY); 
memdc.SelectObject(oldbitmap); 

或使用CImagememdc保存到一個文件

CImage cimage; 
cimage.Create(100, 100, 32); 
HDC imageHDC = cimage.GetDC(); 
::BitBlt(imageHDC, 0, 0, 100, 100, memdc.GetSafeHdc(), 0, 0, SRCCOPY); 
cimage.Save(L"c:\\test\\fileName.jpg", GUID_NULL); 
cimage.ReleaseDC(); 
+0

這似乎很好地工作!我發現,如果設備上下文的內容是使用32bpp呈現繪製的,則這仍然不起作用。但我問了一個[單獨的問題](http://stackoverflow.com/questions/33058788/how-to-get-a-32bpp-bitmap-image-from-a-gdi-device-context),謝謝爲貢獻。 – Vinzenz