// Resize CImage void CreateStretchImage(CImage *pImage,CImage *ResultImage,int StretchHeight,int StretchWidth){ if(pImage->IsDIBSection()){ // 取得 pImage 的 DC CDC* pImageDC1 = CDC::FromHandle(pImage->GetDC()); // Image 因為有自己的 DC, 所以必須使用 FromHandle 取得對應的 DC CBitmap *bitmap1=pImageDC1->GetCurrentBitmap(); BITMAP bmpInfo; bitmap1->GetBitmap(&bmpInfo); // 建立新的 CImage ResultImage->Create(StretchWidth,StretchHeight,bmpInfo.bmBitsPixel); CDC* ResultImageDC = CDC::FromHandle(ResultImage->GetDC()); // 當 Destination 比較小的時候, 會根據 Destination DC 上的 Stretch Blt mode 決定是否要保留被刪除點的資訊 ResultImageDC->SetStretchBltMode(HALFTONE); // 使用最高品質的方式 ::SetBrushOrgEx(ResultImageDC->m_hDC,0,0,NULL); // 調整 Brush 的起點 // 把 pImage 畫到 ResultImage 上面 StretchBlt(*ResultImageDC,0,0,StretchWidth,StretchHeight,*pImageDC1,0,0,pImage->GetWidth(),pImage->GetHeight(),SRCCOPY); // pImage->Draw(*ResultImageDC,0,0,StretchWidth,StretchHeight,0,0,pImage->GetWidth(),pImage->GetHeight()); pImage->ReleaseDC(); ResultImage->ReleaseDC(); } } // 建立指定大小的圖形 // 輸入: 原始圖檔=pBitmap, 指定大小=StretchHeight StretchWidth, 結果圖檔=pResultBmp // Usage: /* CBitmap *StretchBmp=new CBitmap(); CreateStretchBmp(pBitmap,m_ShowHeight,m_ShowWidth,StretchBmp); delete StretchBmp; // 使用完畢,歸還記憶體 */ void reateStretchBmp(CBitmap* pBitmap ,int StretchHeight ,int StretchWidth, CBitmap *pResultBmp){ // 建立顯示螢幕的 DC CDC dcScreen; dcScreen.Attach(::GetDC(NULL)); // 取得原始圖檔的 dc CDC dcMemory; dcMemory.CreateCompatibleDC(&dcScreen); CBitmap *pOldOrgBitmap= dcMemory.SelectObject(pBitmap); // 建立新的結果圖形 (指定大小) pResultBmp->CreateCompatibleBitmap(&dcScreen,StretchWidth,StretchHeight); // 取得結果圖形的 dc CDC dcFixMemory; dcFixMemory.CreateCompatibleDC(&dcScreen); CBitmap *pOldReslutBitmap=dcFixMemory.SelectObject(pResultBmp); // 讓 dcFixMemory 選擇到 "結果bmp", 任何對 dcFixMemory 的動作都會反映到 pResultBmp // 把原始圖形縮放畫到 Memory DC上面 BITMAP bmpInfo; pBitmap->GetBitmap(&bmpInfo); // 取得 原始圖檔的寬度與高度 StretchBlt(dcFixMemory,0,0,StretchWidth,StretchHeight,dcMemory,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY); // Set Back dcMemory.SelectObject(pOldOrgBitmap); dcFixMemory.SelectObject(pOldReslutBitmap); }