當用以下函數加載一張位圖時,當窗口發生重繪更改大小時,位圖將失真:
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP2);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
pDC->SetStretchBltMode(COLORONCOLOR); //設置在指定設備內容中的伸展模式。解決失真問題。
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
SetStretchBltMode函數設置在指定設備內容中的伸展模式。
int SetStretchBltMode(
HDC hdc, // DC的HANDLE
int iStretchMode // 位圖伸展模式
);
Hdc:輸入,設備內容的HANDLE
iStretchMode:輸入,指定的伸展模式,參數可以下面值之一:
值 |
描述 |
BLACKONWHITE |
執行一個布爾AND操作在要刪除的存在的圖素上。如果位圖是一個單色位圖,這個模式保留黑色的像素為白色的像素。 |
COLORONCOLOR |
刪除像素,這個模式刪除所有待刪除的像素行,而不保留他們的信息。 |
HALFTONE |
從源矩形映射像素到指定的目標矩形。目標和源矩形的平均顏色是相似的。 在設置HALFTON伸展模式之后,應用程序必須調用SetBrushOrgEx函數來設置刷源。如果該調用失敗了,刷子將不對齊。 This option is not supported on Windows 95/98/Me. |
STRETCH_ANDSCANS |
Same as BLACKONWHITE. |
STRETCH_DELETESCANS |
Same as COLORONCOLOR. |
STRETCH_HALFTONE |
Same as HALFTONE. |
STRETCH_ORSCANS |
Same as WHITEONBLACK. |
WHITEONBLACK |
執行一個布爾或操作,使用待刪除的存在的像素的顏色。如果位圖是一個單色的位圖,這個模式將保留白色的像素為黑色像素。 |
返回值:
如果函數成功,返回先前的伸展模式
如果失敗,返回0
WINDOWS NT/2000/XP:使用GetLastError可以得到更多的信息,下面是其中之一:
值 |
意義 |
ERROR_INVALID_PARAMETER |
一到多個參數無效 |
備注:
伸展模式定義了程序調用StretchBlt函數的時候怎么樣在顯示設備上用存在的像素合並位圖行或列。
BLACKONWHITE (STRETCH_ANDSCANS)和WHITEONBLACK (STRETCH_ORSCANS)典型的用來保留單色位圖的前景像素。COLORONCOLOR (STRETCH_DELETESCANS)模式通常用來保留彩色位圖中的顏色。
HALFTONE相對較慢,並要求更多的源圖象處理,但提供較高的圖像質量。同樣SetBrushOrgEx也不惜是HALFTON模式以免刷子不對齊。 另外,伸展模式也依賴於設備驅動器的能力。