最近在做一個圖片編輯的軟體,我用的圖資源為png圖,使用了CImage類來顯示圖片,在使用雙快取的時候,顯示的圖片顏色不對,在網上找了很多資源都是說GDI不支持透明色,需要使用GDI+,不太清楚GDI+怎么實作雙快取?
uj5u.com熱心網友回復:
效果與GDI的實作不相上下,代碼如下:/*C++ code*/
RECT rc;
GetClientRect(g_hwnd,&rc);
Bitmap bmp(int(rc.right),int(rc.bottom));
Graphics bmpGraphics(&bmp);
bmpGraphics.SetSmoothingMode(SmoothingModeAntiAlias);
/*Drawing on bitmap*/
SolidBrush bkBrush(Color(0,0,0));
bmpGraphics.FillRectangle(&bkBrush,0,0,rc.right,rc.bottom);
/*Drawing on DC*/
Graphics graphics(hdc);
/*Important! Create a CacheBitmap object for quick drawing*/
CachedBitmap cachedBmp(&bmp,&graphics);
graphics.DrawCachedBitmap(&cachedBmp,0,0);
以上的繪制代碼最區別于網路上其他GDI+實作的一處就是,在最后添加了一個CacheBitmap物件用于快速繪制。
CacheBitmap是一個包含了bmp全部象素,并且針對graphics所關聯的DC做過特別優化的位圖物件。這點可以從其構造引數上看到。
關于雙緩沖的實作還有一點十分關鍵,雖然它不屬于雙緩沖實作的核心。如果繪制需要經常的重繪背景,則需要自己攔截WM_ERASEBKGND訊息,并在處理函式中什么也不做,即此訊息發生時不重畫背景,背景的重畫在WM_PAINT中全權控制。
如,WM_ERASEBKGND訊息處理的實作
void OnEraseBkGnd(HDC hdc)
{
//do nothing
}
附:GDI的雙緩沖實作
RECT rc;
GetClientRect(hwnd,&rc);
HDC hMemDc = CreateCompatibleDC(hdc);
HBITMAP hBmp = CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDc,hBmp);
//在此使用hMemDc進行 GDI 繪制
BitBlt(hdc,0,0,rc.right,rc.bottom,hMemDc,0,0,SRCCOPY);
SelectObject(hMemDc,hOldBmp);
DeleteObject(hBmp);
DeleteObject(hMemDc);
uj5u.com熱心網友回復:
以上方法出錯了 但是不知道錯在哪里?void CGdiPlusView::OnDraw(CDC* /*pDC*/)
{
CGdiPlusDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CClientDC dc(this);
RECT rc;
rc.right = 3000;
rc.left = 0;
rc.top = 0;
rc.bottom = 2000;
Bitmap bmp(int(rc.right),int(rc.bottom));
Graphics bmpGraphics(&bmp);
bmpGraphics.SetSmoothingMode(SmoothingModeAntiAlias);
SolidBrush bkBrush(Color(0,0,0));
bmpGraphics.FillRectangle(&bkBrush,0,0,rc.right,rc.bottom);
Graphics graphics(dc.GetSafeHdc());
iamge_bg.Draw(graphics.GetHDC(), 200,200, iamge_bg.GetWidth(), iamge_bg.GetHeight());
image.Draw(graphics.GetHDC(), 200,200, image.GetWidth(), image.GetHeight());
CachedBitmap cachedBmp(&bmp,&graphics);
graphics.DrawCachedBitmap(&cachedBmp,0,0);
}
CImage image;
CImage iamge_bg;
不使用雙快取的時候 是可以畫出兩張圖的。但是 現在在畫第二張圖的時候出錯了。我使用的MFC是單檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/117225.html
標籤:基礎類
下一篇:串口通信
