生活随笔
收集整理的這篇文章主要介紹了
GDI C++ 位图的绘制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在GDI有一個特點: 就是所有的圖片繪制,都是通過DC來完成的。DC之間是可以相互傳遞的。
??????????????????????????????????????????????兩個DC之中的圖形? 通過DC--->DC? 來相互傳遞信息。
???????? 無論?????????????????
??????????? ??????????? 位圖--->屏幕
??????????????????????? 位圖--->位圖
??????????????????????? 屏幕---->位圖
??????????????????????? 屏幕----->屏幕
????????他們所使用的都是DC-->DC之間的傳遞。
???????
?其關鍵點便是:
如何獲得各自的DC
?
??????? 對于屏幕:
????????????????????????? 直接使用GetDC()??? ReleaseDC() 便可
????????????????????????? ::GetDC() 返回的是CDC*?
??????????????????????
??????? 對于圖片:
??????????????????????? CBitmap? 不支持DC
??????????????????????? CImage?? 獲得DC
[cpp]?view plaincopyprint?
CImage?img;?? img.Load(imageFilePath);?? ?? CDC?*pDC;?? pDC=CDC::FromHandle(img.GetDC());?? ?? ?? ?? ?? img.ReleaseDC();??
?????
??????????????????????注意:
??????????????????????????????? ::GetDC()?返回的是CDC*?
?????????????????????????????????而CImage::GetDC()?返回的HDC
?
對圖像進行操作
?
???????????::GetDC() 所獲得的是屏幕的DC, 使用此DC ,可以對屏幕進行繪圖。
?
???????????如果我們想在某一個位圖的基礎上,再次繪圖的話,便不能簡單的使用::GetDC()了,因為它只是負責在屏幕上繪圖。
?????????? 那怎么辦呢?
?????????? 既然所有的繪圖都是在DC上進行繪圖,所以我們必須把這個位圖選擇進DC,這樣對DC操作,就相當直接對位圖進行操作
?????????? pDC->SelectObject(&bmp):
?????????? // use pDC to draw orthers in the bmp
?
構造內存DC
?????????? 一般我們為了避免閃爍等現象,需要構造內存DC ,然后再DC上進行繪制,繪制完畢后,通過DC之間的傳遞,將圖像再繪制到屏幕中去。
?????????? CDC memDC; 只是創建了一個CDC對象,還沒有創建DC資源
????????????memDC.CreateCompatibleDC(pDC);?? 才是真正創建DC資源。
?????????? 創建兼容DC是關鍵,其關鍵之處在于要創建的DC與哪個現有的DC兼容。
???????????因為內存DC只是個中介,它必須要將其DC中的圖像傳遞到其它DC中(目的DC),才會體現其價值。
?????????? 而DC 與 DC之間可以傳遞信息的前提是:兩DC是兼容的。
?????????? 據此可知:?內存DC要兼容目的DC
如下例:
[cpp]?view plaincopyprint?
CBitmap?bmp;?? bmp.LoadBitmap(IDI_BITMAP);?? ?? CDC?memDC;?? memDC.CreateCompatibleDC(pDC);?? memDC.SelectObject(&bmp);?? ?? pDC->BitBlt(0,0,nWidth,nHeight,&memDC,0,0,SRCCOPY);??
?
?
DC--->DC的傳遞
下面針對各種情況一一給出示例:
?
1 位圖--->屏幕
[cpp]?view plaincopyprint?
?? ?? ?? CBitmap?bmp;?? BITMAP?bm;?? CDC?memDC;?? ?? CDC?*pDC=GetDC();?? ?? ?? bmp.LoadBitmap(IDB_BITMAP);?? bmp.GetBitmap(&bm);?? ?? ?? memDC.CreateCompatibleDC(pDC);?? CBitmap*?pOldBmp=(CBitmap?*)memDC.SelectObject(&bmp);?? ?? ?? pDC->SetStretchBltMode(COLORONCOLOR);?? pDC->StretchBlt(0,0,100,100,&memDC,bm.bmWidth,bm.bmHeight,SRCCOPY);?? ?? memDC.SelectObject(pOldBmp);?? ?? ?? ReleaseDC(pDC);??
?
2
位圖到位圖1-----二者都是CBitmap類對象
[cpp]?view plaincopyprint?
?? ?? ?? ?? ?? ?? CBitmap?destBmp;?? CBitmap?sourceBmp;?? BITMAP?bm;?? ?? ?? CDC??sourceDC;?? CDC??destDC;?? ?? ?? CDC?*pDC=GetDC();?? ?? ?? sourceBmp.LoadBitmap(IDB_BITMAP);?? sourceBmp.GetBitmap(&bm);?? ?? ?? sourceDC.CreateCompatibleDC(pDC);?? sourceDC.SelectObject(&sourceBmp);?? ?? ?? destBmp.CreateCompatibleBitmap(pDC,bm.bmWidth,bm.bmHeight);?? ?? destDC.CreateCompatibleDC(pDC);?? destDC.SelectObject(&destBmp);?? ?? ?? destDC.SetStretchBltMode(HALFTONE);?? destDC.StretchBlt(0,0,bm.bmWidth,bm.bmHeight,&sourceDC,0,0,100,100,SRCCOPY);?? ?? ReleaseDC(pDC);??
位圖到位圖2---源位圖為CImage類
?
[cpp]?view plaincopyprint?
?? ?? ?? ?? CImage?sourceImage;?? CBitmap?destBmp;?? CDC?destDC;?? ?? sourceImage.Load(imageFile);?? ?? ?? ?? CDC?*pDC=CDC::FromHandle(sourceImage.GetDC());?? ?? destDC.CreateCompatibleDC(pDC);?? destDC.SelectObject(&destBmp);?? ?? ::SetStretchBltMode(destDC.m_hDC,HALFTONE);?? ::SetBrushOrgEx(destDC.m_hDC,0,0,NULL);?? ?? ?? sourceImage.StretchBlt(&destDC,CRect(0,0,100,100),CRect(0,0,100,100),SRCCOPY);?? ?? ?? sourceImage.ReleaseDC();??
?
3?屏幕到位圖??????????
[cpp]?view plaincopyprint?
?? ?? CBitmap?destBmp;?? CDC??destDC;?? ?? ?? CDC?*pDC=GetDC();?? ?? ?? destBmp.CreateCompatibleBitmap(pDC,100,100);?? ?? destDC.CreateCompatibleDC(pDC);?? destDC.SelectObject(&destBmp);?? ?? ?? destDC.SetStretchBltMode(HALFTONE);?? destDC.StretchBlt(0,0,100,100,pDC,0,0,100,100,SRCCOPY);?? ?? ReleaseDC(pDC);?
總結
以上是生活随笔為你收集整理的GDI C++ 位图的绘制的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。