本文爲本人實際開發中遇到的實際問題,然後經過一番努力後(在網上找相關資料,問高手等方式)終於將問題解決了,爲了備忘,所以有此文的存在。
當然,希望能給被同樣問題困擾的朋友帶來幫助,代碼隨便拿去用(如果有用!)。
方法一:
比較簡單,侷限性很大(不能在同一次操作中對拉伸後的位圖繼續畫線等操作)。
CRect rectMain;
GetClientRect(&rectMain);
//創建位圖對象
CBitmap bitmap;
if (!bitmap.m_hObject)
{
bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP1));
}
//定義位圖變量
HBITMAP hBmp, pOldbkbmp;
BITMAP bmpInfo;
bitmap.GetObject(sizeof(bmpInfo), &bmpInfo);//將位圖對象的圖片放入到位圖變量中
CDC dcBuffer;
dcBuffer.CreateCompatibleDC(&dc);//創建系統兼容DC
pOldbkbmp = (HBITMAP)dcBuffer.SelectObject(bitmap);//將位圖變量選入到內存環境
dc.StretchBlt(rectMain.left, rectMain.top, rectMain.Width(), rectMain.Height(), &MemeDc, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);
方法二:
CRect rectMain;
GetClientRect(&rectMain);
//創建位圖對象
CBitmap bitmap;
if (!bitmap.m_hObject)
{
bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP1));
}
//定義位圖變量
HBITMAP hBmp, pOldbkbmp;
BITMAP bmpInfo;
bitmap.GetObject(sizeof(bmpInfo), &bmpInfo);//將位圖對象的圖片放入到位圖變量中
CDC dcBuffer;
dcBuffer.CreateCompatibleDC(&dc);//創建系統兼容DC
pOldbkbmp = (HBITMAP)dcBuffer.SelectObject(bitmap);//將位圖變量選入到內存環境
ResizeBitmap(bitmap, rectMain.Width() - bmpInfo.bmWidth, rectMain.Height() - bmpInfo.bmHeight, hBmp);
pOldbkbmp = (HBITMAP)dcBuffer.SelectObject(hBmp);
//在拉伸後位圖上畫線
CPen penTemp;
penTemp.CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
dcBuffer.SelectObject(&penTemp);
dcBuffer.MoveTo(rectMain.left + 10, rectMain.top + 10);
dcBuffer.LineTo(rectMain.left + 200, rectMain.top + 10);
dc.BitBlt(rectMain.left, rectMain.top, rectMain.Width(), rectMain.Height(), &dcBuffer, 0, 0, SRCCOPY);
dcBuffer.SelectObject(pOldbkbmp);
dcBuffer.DeleteDC();
HBITMAP CMyStatusBar::ResizeBitmap(HBITMAP hbitmap, int addwidth, int addheight, HBITMAP &hBmp)
{
LPSTR lpBmpData = NULL;
BITMAP Bitmap;
GetObject(hbitmap, sizeof(BITMAP), &Bitmap);
long width = Bitmap.bmWidth;
long height = Bitmap.bmHeight;
//prepare the bitmap attributes
BITMAPINFOHEADERbi;
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
bi.biSizeImage = ((Bitmap.bmWidth * 32 + 31)& ~31) / 8 * Bitmap.bmHeight;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
HANDLE
hDib;
hDib = GlobalAlloc(GHND, bi.biSizeImage + 40);
LPBITMAPINFOHEADERlpbi = NULL;
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
HDC hDC;
hDC = ::GetDC(NULL);
GetDIBits(hDC, hbitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + 40, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);
lpBmpData = (char*)lpbi;
BITMAPINFOHEADER bij;
bij.biSize = sizeof(BITMAPINFOHEADER);
bij.biWidth = Bitmap.bmWidth + addwidth;
bij.biHeight = Bitmap.bmHeight + addheight;
bij.biPlanes = 1;
bij.biBitCount = 32;
bij.biCompression = BI_RGB;
bij.biSizeImage = ((bij.biWidth * 32 + 31)& ~31) / 8 * bij.biHeight;
bij.biXPelsPerMeter = 0;
bij.biYPelsPerMeter = 0;
bij.biClrUsed = 0;
bij.biClrImportant = 0;
HANDLE
hDibj;
hDibj = GlobalAlloc(GHND, bij.biSizeImage + 40);
LPBITMAPINFOHEADERlpbij;
lpbij = (LPBITMAPINFOHEADER)GlobalLock(hDibj);
*lpbij = bij;
CDC * pDC = CWnd::GetDesktopWindow()->GetDC();
hBmp = CreateDIBSection(pDC->GetSafeHdc(), (BITMAPINFO *)lpbij, DIB_RGB_COLORS, (void**)(lpbij), NULL, 0);
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap *pSave = dcMem.SelectObject(CBitmap::FromHandle(hBmp));
::SetStretchBltMode(dcMem.GetSafeHdc(), COLORONCOLOR);
StretchDIBits(dcMem.GetSafeHdc(), 0, 0, bij.biWidth, bij.biHeight,
0, 0, Bitmap.bmWidth, Bitmap.bmHeight,
(lpBmpData + 40), (BITMAPINFO*)lpbi, DIB_RGB_COLORS, SRCCOPY);
dcMem.SelectObject(pSave);
hDibj = GlobalFree(hDibj);
hDib = GlobalFree(hDib);
CWnd::GetDesktopWindow()->ReleaseDC(pDC);
return hBmp;
}