VC 實現拉伸位圖 筆記

        本文爲本人實際開發中遇到的實際問題,然後經過一番努力後(在網上找相關資料,問高手等方式)終於將問題解決了,爲了備忘,所以有此文的存在。

當然,希望能給被同樣問題困擾的朋友帶來幫助,代碼隨便拿去用(如果有用!)。


方法一:

比較簡單,侷限性很大(不能在同一次操作中對拉伸後的位圖繼續畫線等操作)。

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;
}


發佈了4 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章