橫坐標:往右遞增
縱坐標:往下遞減
當原點坐標為(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析構函數會做的