?? bmpproc.cpp
字號(hào):
* # 如果本身類中不存在位圖,函數(shù)將返回FALSE
*
************************************************************************/
BOOL CBmpProc::CopyTranCenter(CBmpProc& souBmp,
CRect* crArea,
COLORREF crColour,
int mode)
{
if (!IsValid())
return FALSE;
ASSERT(m_pInfo);
ASSERT(m_pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER));
if (!souBmp.IsValid())
return FALSE;
ASSERT(souBmp.m_pInfo);
ASSERT(souBmp.m_pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER));
CRect rect(Rect());
if (crArea)
rect = *crArea;
// 矩形坐標(biāo)規(guī)范化
rect.NormalizeRect();
if ((rect.Width()==0)||(rect.Height()==0))
return FALSE;
// 復(fù)制源圖
CDC compDC;
CBitmap *pOldBmp;
// 創(chuàng)建與當(dāng)前顯示設(shè)備兼容的內(nèi)存設(shè)備描述表
compDC.CreateCompatibleDC(NULL);
pOldBmp = compDC.SelectObject((CBitmap*)this);
// 復(fù)制指定尺寸的源位圖到目標(biāo)位圖
souBmp.DrawTranCenter(compDC, &rect, crColour, mode);
compDC.SelectObject(pOldBmp);
return TRUE;
}
/*************************************************************************
*
* CopyTranTile()
*
* 參數(shù)說明:
*
* CBmpProc& souBmp - 源位圖目標(biāo)
* CRect* crArea - 平鋪的范圍(缺省值為NULL)
* COLORREF crColour - 要濾掉或保留的顏色(缺省值是白色)
* int mode - 如果是0則將不拷貝指定的顏色,如果是1則保留指定
* 的顏色(缺省值為0)
*
* 返回值:
*
* BOOL - 如果成功返回TRUE,否則返回FALSE
*
* 描述:
*
* 將源位圖透明的平鋪到本類的指定矩形中
*
* 如果入口參數(shù)crArea設(shè)為NULL,則平鋪矩形等于本身類中圖像的尺寸。
* 該函數(shù)不會(huì)拉伸或壓縮源位圖圖像。
*
* 注:# 本身類中原來必需已存在位圖,且調(diào)用之后的位圖不會(huì)被刪除
* # 如果源位圖類是空的,則返回FALSE
* # 如果本身類中不存在位圖,函數(shù)將返回FALSE
*
************************************************************************/
BOOL CBmpProc::CopyTranTile(CBmpProc& souBmp,
CRect* crArea,
COLORREF crColour,
int mode)
{
// 運(yùn)行環(huán)境檢測
if (!IsValid())
return FALSE;
ASSERT(m_pInfo);
ASSERT(m_pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER));
if (!souBmp.IsValid())
return FALSE;
ASSERT(souBmp.m_pInfo);
ASSERT(souBmp.m_pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER));
// 缺省情況下鋪設(shè)范圍就是本身位圖的尺寸
CRect rect(Rect());
if (crArea)
rect = *crArea; // 另外指定尺寸
// 矩形坐標(biāo)規(guī)范化
rect.NormalizeRect();
if ((rect.Width()==0)||(rect.Height()==0))
return FALSE;
// 復(fù)制源圖
CDC compDC;
CBitmap *pOldBmp;
// 創(chuàng)建與當(dāng)前顯示設(shè)備兼容的內(nèi)存設(shè)備描述表
compDC.CreateCompatibleDC(NULL);
pOldBmp = compDC.SelectObject((CBitmap*)this);
// 復(fù)制指定尺寸的源位圖到目標(biāo)位圖
souBmp.DrawTranTile(compDC, &rect, crColour, mode);
compDC.SelectObject(pOldBmp);
return TRUE;
}
/*************************************************************************
*
* LoadFromClipboard()
*
* 參數(shù)說明:無
*
*
* 返回值:
*
* BOOL - 如果成功返回TRUE,否則返回FALSE
*
* 描述:
*
* 讀取剪貼板中的DIB位圖到類中
*
* 如果函數(shù)成功,則類中原來的位圖(如果有的話)將被刪除
*
************************************************************************/
BOOL CBmpProc::LoadFromClipboard()
{
// 檢查剪貼板的有效性
if (!PasteAvailable())
return FALSE;
// 打開剪貼板
if (::OpenClipboard(NULL))
{
// 獲取剪貼板中的DIB數(shù)據(jù)
HANDLE h = ::GetClipboardData(CF_DIB);
if (!h)
{
CloseClipboard();
return FALSE;
}
LPSTR lpDIB = (LPSTR)CreateMemoryBlockFromHandle(h);
if (!lpDIB)
{ // 讀入的剪貼板數(shù)據(jù)句柄不需要釋放,系統(tǒng)會(huì)自動(dòng)釋放
CloseClipboard();
return FALSE;
}
CloseClipboard();
// 檢查DIB信息塊的有效性
if (*((DWORD*)lpDIB) != sizeof(BITMAPINFOHEADER))
{
::free((void*)lpDIB);
return FALSE;
}
// 復(fù)制信息塊
ASSERT(CalculateDIBInfoSize((LPBITMAPINFOHEADER)lpDIB) >= sizeof(BITMAPINFOHEADER));
LPBITMAPINFO pInfo = (LPBITMAPINFO)CreateMemoryBlockFromAddress(
(LPVOID)lpDIB, CalculateDIBInfoSize((LPBITMAPINFOHEADER)lpDIB));
if (!pInfo)
{
::free((void*)lpDIB);
return FALSE;
}
// 計(jì)算位數(shù)據(jù)首地址
LPSTR pBits = (LPSTR)FindDIBBits(lpDIB);
ASSERT(pBits);
// 制作DDB位圖
HBITMAP hBmp;
HWND hWnd = ::GetDesktopWindow();
ASSERT(hWnd);
HDC hDC = ::GetDC(hWnd);
hBmp = ::CreateDIBitmap(hDC, // 創(chuàng)建DDB位圖。(將DIB位數(shù)據(jù)
(BITMAPINFOHEADER *)pInfo, // 轉(zhuǎn)換為DDB位數(shù)據(jù))
CBM_INIT, pBits,
(BITMAPINFO *)pInfo,
DIB_RGB_COLORS);
::ReleaseDC(hWnd, hDC);
// 創(chuàng)建完邏輯位圖后,從剪貼板中讀取的數(shù)據(jù)已無用,釋放
::free((void*)lpDIB);
if (hBmp) // 成功
{
// 刪除原來的圖像,并且設(shè)置新的位圖
if (!ClearAndSetData(IT_CLIP,0,(LPCTSTR)"",pInfo,hBmp))
{
::free((void*)pInfo);
::DeleteObject(hBmp);
return FALSE;
}
return TRUE;
}
else // 失敗
{
::free((void*)pInfo);
return FALSE;
}
}
return FALSE;
}
/*************************************************************************
*
* LoadFromFile()
*
* 參數(shù)說明:
*
* LPCTSTR lpszPathName - 待讀入的位圖文件名稱(路徑)
*
* 返回值:
*
* BOOL - 如果成功返回TRUE,否則返回FALSE
*
* 描述:
*
* 讀取指定位圖文件到類中
*
* 如果函數(shù)成功,則類中原來的位圖(如果有的話)將被刪除
* 如果入口參數(shù)指定的文件不存在或不是一個(gè)位圖文件,則函數(shù)返回FALSE
*
************************************************************************/
BOOL CBmpProc::LoadFromFile(LPCTSTR lpszPathName)
{
CFile file;
LPBITMAPINFO lpbi;
LPSTR pBits;
HBITMAP hBmp;
if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite))
return FALSE;
// 判斷文件是否是有效的BMP文件
if (IsValidBmpFile(file) == FALSE)
{
file.Close();
return FALSE;
}
// 讀取BMP文件信息
if ((lpbi=GetBmpFileInfo(file)) == NULL)
{
file.Close();
return FALSE;
}
// 本類不支持壓縮位圖,所以如果是壓縮位圖則返回FALSE
if ((lpbi->bmiHeader.biCompression==BI_RLE4)||(lpbi->bmiHeader.biCompression==BI_RLE8))
{
::free((void*)lpbi);
file.Close();
return FALSE;
}
// 提取BMP位數(shù)據(jù)
if ((pBits=GetBmpFileBits(file)) == NULL)
{
::free((void*)lpbi);
file.Close();
return FALSE;
}
HWND hWnd = ::GetDesktopWindow();
ASSERT(hWnd);
HDC hDC = ::GetDC(hWnd);
hBmp = ::CreateDIBitmap(hDC, // 創(chuàng)建DDB位圖。(將DIB位數(shù)據(jù)
(BITMAPINFOHEADER *)lpbi, // 轉(zhuǎn)換為DDB位數(shù)據(jù))
CBM_INIT, pBits,
(BITMAPINFO *)lpbi,
DIB_RGB_COLORS);
::ReleaseDC(hWnd, hDC);
// 創(chuàng)建完邏輯位圖后,從文件中讀取的位數(shù)據(jù)已無用,釋放
::free((void*)pBits);
file.Close();
if (hBmp) // 成功
{
// 刪除原來的圖像,并且設(shè)置新的位圖
if (!ClearAndSetData(IT_DISKFILE,0,lpszPathName,lpbi,hBmp))
{
::free((void*)lpbi);
::DeleteObject(hBmp);
return FALSE;
}
return TRUE;
}
else // 失敗
{
::free((void*)lpbi);
return FALSE;
}
}
/*************************************************************************
*
* LoadFromResourceID()
*
* 參數(shù)說明:
*
* UINT uID - 待讀入的位圖資源名稱(標(biāo)識(shí)值)
* HINSTANCE hInstance - 位圖資源所在實(shí)例的句柄(如果它被設(shè)為NULL,則
* 函數(shù)將該值設(shè)為當(dāng)前應(yīng)用程序進(jìn)程)
*
* 返回值:
*
* BOOL - 如果成功返回TRUE,否則返回FALSE
*
* 描述:
*
* 讀取指定位圖資源到類中
*
* 如果函數(shù)成功,則類中原來的位圖(如果有的話)將被刪除
*
************************************************************************/
BOOL CBmpProc::LoadFromResourceID(UINT uID, HINSTANCE hInst)
{
return LoadFromResourceName((LPCTSTR)MAKEINTRESOURCE(uID), hInst);
}
/*************************************************************************
*
* LoadFromResourceName()
*
* 參數(shù)說明:
*
* LPCTSTR lpResourceName - 待讀入的位圖資源名稱(字符串)
* HINSTANCE hInstance - 位圖資源所在實(shí)例的句柄(如果它被設(shè)為NULL,則
* 函數(shù)將該值設(shè)為當(dāng)前應(yīng)用程序進(jìn)程)
*
* 返回值:
*
* BOOL - 如果成功返回TRUE,否則返回FALSE
*
* 描述:
*
* 讀取指定位圖資源到類中
*
* 如果函數(shù)成功,則類中原來的位圖(如果有的話)將被刪除
*
************************************************************************/
BOOL CBmpProc::LoadFromResourceName(LPCTSTR lpResourceName,
HINSTANCE hInstance)
{
HINSTANCE hInst = hInstance;
HBITMAP hBmp = NULL;
//如果入口參數(shù)hInstance是NULL,則函數(shù)將用當(dāng)前應(yīng)用程序進(jìn)程的實(shí)例句柄
if (hInst == NULL)
hInst = ::AfxGetResourceHandle();
ASSERT(hInst);
HRSRC hSrc = ::FindResource(hInst, lpResourceName, RT_BITMAP);
BOOL bSuccess = FALSE;
if (!hSrc)
return bSuccess;
// 由LoadResource()函數(shù)讀入的資源目標(biāo)不需要顯示的刪除它,Windows
// 系統(tǒng)會(huì)自動(dòng)刪除。LockResource()鎖定的資源目標(biāo)也不需要顯示的解鎖
HGLOBAL hResData = LoadResource(hInst, hSrc);
if (hResData)
{
LPVOID lpResData = LockResource(hResData);
if (lpResData)
{
// 如果是有效的DIB資源,則資源的首位應(yīng)該是BITMAPINFOHEADER
// 結(jié)構(gòu)
ASSERT(*((DWORD*)lpResData) == sizeof(BITMAPINFOHEADER));
LPSTR pBits = FindDIBBits((LPSTR)lpResData);
ASSERT(pBits > (LPSTR)lpResData);
HWND hWnd = ::GetDesktopWindow();
ASSERT(hWnd);
HDC hDC = ::GetDC(hWnd);
hBmp = CreateDIBitmap(hDC, // 創(chuàng)建DDB位圖。(將DIB位數(shù)據(jù)
(BITMAPINFOHEADER *)lpResData, // 轉(zhuǎn)換為DDB位數(shù)據(jù))
CBM_INIT, pBits,
(BITMAPINFO *)lpResData,
DIB_RGB_COLORS);
::ReleaseDC(hWnd, hDC);
if (hBmp) // 成功
{
DWORD dwInfoSize = (DWORD)((LPSTR)pBits-(LPSTR)lpResData);
ASSERT(dwInfoSize > (DWORD)(sizeof(BITMAPFILEHEADER)));
LPBITMAPINFO lpbi = (LPBITMAPINFO)CreateMemoryBlockFromAddress(
(LPVOID)NULL, dwInfoSize);
if (lpbi)
{
// 復(fù)制位圖信息塊,因?yàn)閘pResData所指的內(nèi)存不是運(yùn)行時(shí)態(tài)庫
// 函數(shù)分配的內(nèi)存塊,所以未用CreateMemoryBlockFromAddress()
// 的復(fù)制功能
::memcpy((void*)lpbi, (const void*)lpResData, dwInfoSize);
}
else
{
::DeleteObject(hBmp);
return FALSE;
}
if ((((DWORD)lpResourceName)>>16) == 0)
{// 如果指定資源時(shí)使用的是標(biāo)識(shí),則串指針的高16位是0
// 刪除原來的圖像,并且設(shè)置新的位圖
if (!ClearAndSetData(IT_RESOURCE,(DWORD)lpResourceName,(LPCTSTR)"",lpbi,hBmp))
{
::free((void*)lpbi);
::DeleteObject(hBmp);
return FALSE;
}
}
else
{
// 刪除原來的圖像,并且設(shè)置新的位圖
if (!ClearAndSetData(IT_RESOURCE,0, lpResourceName,lpbi,hBmp))
{
::free((void*)lpbi);
::DeleteObject(hBmp);
return FALSE;
}
}
bSuccess = TRUE;
}
}
}
return bSuccess;
}
/*************************************************************************
*
* LoadFromObject()
*
* 參數(shù)說明:
*
* CBmpProc& souBmp - 源位圖目標(biāo)
* CRect *pSouRect - 復(fù)制矩形
*
* 返回值:
*
* BOOL - 如果成功返回TRUE,否則返回FALSE
*
* 描述:
*
* 讀取源位圖目標(biāo)中指定區(qū)域(矩形)的圖像到類中
*
* 如果入
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -