古詩詞大全網 - 四字成語 - VC++中為什麽BitBlt()函數畫不出來剛學VC++,菜鳥中菜鳥,希望各位大大幫幫忙!

VC++中為什麽BitBlt()函數畫不出來剛學VC++,菜鳥中菜鳥,希望各位大大幫幫忙!

映射模式:MM_ANISOTROPIC

橫坐標:往右遞增

縱坐標:往下遞減

當原點坐標為(0,0)時,

Y坐標如果為正,就跑到窗口上邊去了,畫的任何東西都是在窗口外面。

-------------------------------------------------------------------------------------

內存DC設置了映射模式,設備DC沒有設置映射模式。當BitBlt時,需要使用內存DC的每壹個點畫到設備DC的對應點中,由於兩個DC的映射模式不同,所以無法正確對應每壹個點。例如坐標為100,50的點,對於內存DC和設備DC而言,不是同壹個坐標點。

正確的邏輯和序列是:

設置設備DC的映射模式,

創建內存DC,

畫圖,

把內存DC中的圖片COPY到設備DC中:

盡量使用BitBlt,不要使用StretchBlt進行COPY。原因是:

1)StretchBlt進行拉伸需要使用算法,執行速度肯定沒BitBlt快

2)StretchBlt的拉伸會使圖形失真,仔細看下壹幅800*600的圖片,用StretchBlt拉伸至全屏後,和用Windows自帶的圖片查看器進行拉伸後比對,就會發現StretchBlt很傻的。

3)圖片拉伸算法有幾個需要考量的指標:第壹是盡可能使圖片不失真第二是盡可能提高算法的執行速度。壹和二之間是此消彼長的關系。要保真就失速度!StretchBlt不如壹些專業圖像軟件做的拉伸效果就是因為StretchBlt並不是專業的圖像處理函數,主要為了提高該函數的執行速度,因此會失真。要想不失真,自己寫圖像算法。

因此,基本上沒有什麽理由使用StretchBlt。

附上源代碼:

//以下為設置坐標映射

pDC->SetMapMode(MM_ANISOTROPIC); //X、Y單位長度都自定義的映射模式

pDC->SetWindowOrg(0,0);//設置窗口左上角的坐標為

pDC->SetWindowExt(500,50);//設置窗口度量

pDC->SetViewportOrg(0,0);

pDC->SetViewportExt(rect.right,rect.bottom);

mDC.CreateCompatibleDC(pDC);

//創建壹副關於屏幕DC的圖畫

CBitmap MemBitmap;

MemBitmap.CreateCompatibleBitmap(pDC,500, 50); //註意內存位圖的大小尺寸設置

//保留以前內存,並將這幅圖選入到內存DC中

CBitmap *pOldBitmap=mDC.SelectObject(&MemBitmap);

//以下為畫直線

CPen PenWave(PS_SOLID,5,RGB(255,0,255));//創建紫色的畫筆PenWave

mDC.SelectObject(PenWave);

mDC.MoveTo(0,0);

mDC.LineTo(50,50);

//下面將內存DC上所繪內容壹次性拷貝到當前DC

pDC->BitBlt(0,0,500, 50,&mDC,0,0,SRCCOPY);

//資源回收

mDC.SelectObject(pOldBitmap);

//MemBitmap.DeleteObject();這行沒必要,CBitmap析構函數會做的