?? dibprcs.cpp
字號:
/*************************************************************************
* 文件DIBPrcs.cpp用來存放有關(guān)DIB的操作函數(shù)
* 文件頭存放在GlobalApi.h中
*************************************************************************
*/
#include "GlobalApi.h"
#include "stdafx.h"
#include "cdib.h"
/*************************************************************************
*
* \函數(shù)名稱:
* GetSystemPalette()
*
* \輸入?yún)?shù):
* 無
*
* \返回值:
* HPALETTE - 系統(tǒng)調(diào)色板句柄
*
* \說明:
* 該函數(shù)獲得當(dāng)前正在使用的系統(tǒng)調(diào)色板的句柄
*
*************************************************************************
*/
HPALETTE GetSystemPalette()
{
// 設(shè)備上下文
HDC hDC;
// 聲明調(diào)色板句柄、指針等臨時變量
static HPALETTE hPal = NULL;
HANDLE hLogPal;
LPLOGPALETTE lpLogPal;
// 當(dāng)前系統(tǒng)調(diào)色板的顏色數(shù)
int nColors;
// 獲得當(dāng)前系統(tǒng)設(shè)備上下文
hDC = GetDC(NULL);
if (!hDC)
return NULL;
// 獲得當(dāng)前系統(tǒng)調(diào)色板的顏色數(shù)目
nColors = ( 1 << (GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES)));
// 給調(diào)色板分配內(nèi)存
hLogPal = GlobalAlloc(GHND, sizeof(LOGPALETTE) + nColors *
sizeof(PALETTEENTRY));
if (!hLogPal)
return NULL;
// 得到調(diào)色板內(nèi)存指針
lpLogPal = (LPLOGPALETTE)GlobalLock(hLogPal);
// 設(shè)置調(diào)色板信息
lpLogPal->palVersion = 0x300;
lpLogPal->palNumEntries = nColors;
// 將系統(tǒng)的調(diào)色板拷貝到當(dāng)前的邏輯調(diào)色板中
GetSystemPaletteEntries(hDC, 0, nColors,
(LPPALETTEENTRY)(lpLogPal->palPalEntry));
// 創(chuàng)建Windows調(diào)色板
hPal = CreatePalette(lpLogPal);
// 釋放已分配內(nèi)存并刪除臨時對象
GlobalUnlock(hLogPal);
GlobalFree(hLogPal);
ReleaseDC(NULL, hDC);
// 返回
return hPal;
}
/*************************************************************************
*
* \函數(shù)名稱:
* CopyPalette
*
* \輸入?yún)?shù):
* HPALETTE hPalSrc - 需要拷貝的源調(diào)色板句柄
*
* \返回值:
* HPALETTE - 如果操作成功,則返回拷貝的調(diào)色板句柄
*
* \說明:
* 該函數(shù)將創(chuàng)建一個新的調(diào)色板,并從指定的調(diào)色板拷貝調(diào)色板內(nèi)容
*
*************************************************************************
*/
HPALETTE CopyPalette(HPALETTE hPalSrc)
{
// 調(diào)色板指針,臨時變量
PLOGPALETTE plogPal;
// 聲明一個調(diào)色板句柄和一個臨時句柄
HPALETTE hPalette;
HANDLE hTemp;
// 調(diào)色板表項數(shù)
int iNumEntries=0;
// 獲取調(diào)色板中的表項數(shù)
iNumEntries = GetPaletteEntries(hPalSrc, 0, iNumEntries, NULL);
if (iNumEntries == 0)
return (HPALETTE) NULL;
// 分配調(diào)色板內(nèi)存,得到句柄
hTemp = GlobalAlloc(GHND, sizeof(DWORD) + sizeof(PALETTEENTRY)*iNumEntries);
if (! hTemp)
return (HPALETTE) NULL;
// 得到調(diào)色板的指針
plogPal = (PLOGPALETTE)GlobalLock(hTemp);
if (! plogPal)
return (HPALETTE) NULL;
// 設(shè)置調(diào)色板的信息
plogPal->palVersion = 0x300;
plogPal->palNumEntries = (WORD) iNumEntries;
// 獲取邏輯調(diào)色板中指定范圍的調(diào)色板表項
GetPaletteEntries(hPalSrc, 0, iNumEntries, plogPal->palPalEntry);
// 創(chuàng)建一個Windows調(diào)色板
hPalette = CreatePalette(plogPal);
// 釋放以分配的內(nèi)存
GlobalUnlock( hTemp );
GlobalFree ( hTemp );
return hPalette;
}
/*************************************************************************
*
* \函數(shù)名稱:
* ReadDIB
*
* \輸入?yún)?shù):
* CFile* pFile - 需要打開的DIB文件
* LPBITMAPINFOHEADER* pLpBMIH - DIB信息頭指針的指針
* LPBYTE* pLpImage - DIB位圖數(shù)據(jù)塊指針的指針
*
* \返回值:
* BOOL - 如果操作成功,則返回TRUE
*
* \說明:
* 該函數(shù)將指定文件中的DIB文件載入,其中信息頭和調(diào)色板放在*pLpBMIH中
* 圖象數(shù)據(jù)存放到*pLpImage中。
*
*************************************************************************
*/
BOOL ReadDIB(CFile* pFile, LPBITMAPINFOHEADER* pLpBMIH, LPBYTE* pLpImage)
{
// 臨時存放信息的變量
int nCount, nSize;
BITMAPFILEHEADER bmfh;
// 信息頭指針
//LPBITMAPINFOHEADER lpBMIH;
// DIB圖象數(shù)據(jù)指針
//LPBYTE lpImage;
// 進行讀操作
try
{
// 讀取文件頭
nCount = pFile->Read((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));
if(nCount != sizeof(BITMAPFILEHEADER)) {
throw new CException;
}
// 如果文件類型部位"BM",則返回并進行相應(yīng)錯誤處理
if(bmfh.bfType != 0x4d42) {
throw new CException;
}
// 計算信息頭加上調(diào)色板的大小,并分配相應(yīng)的內(nèi)存
nSize = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);
*pLpBMIH = (LPBITMAPINFOHEADER) new char[nSize];
// 讀取信息頭和調(diào)色板
nCount = pFile->Read(*pLpBMIH, nSize);
// 計算圖象數(shù)據(jù)大小并設(shè)置調(diào)色板指針
if((*pLpBMIH)->biSize != sizeof(BITMAPINFOHEADER)) {
TRACE("Not a valid Windows bitmap -- probably an OS/2 bitmap\n");
throw new CException;
}
// 如果圖象數(shù)據(jù)內(nèi)存大小為0,則重新計算
if((*pLpBMIH)->biSizeImage == 0) {
DWORD dwBytes = ((DWORD) (*pLpBMIH)->biWidth * (*pLpBMIH)->biBitCount) / 32;
if(((DWORD) (*pLpBMIH)->biWidth * (*pLpBMIH)->biBitCount) % 32) {
dwBytes++;
}
dwBytes *= 4;
(*pLpBMIH)->biSizeImage = dwBytes * (*pLpBMIH)->biHeight;
}
// 分配圖象數(shù)據(jù)內(nèi)存,并從文件中讀取圖象數(shù)據(jù)
*pLpImage = (LPBYTE) new char[(*pLpBMIH)->biSizeImage];
nCount = pFile->Read((*pLpImage), (*pLpBMIH)->biSizeImage);
}
// 錯誤處理
catch(CException* pe)
{
AfxMessageBox("Read error");
pe->Delete();
return FALSE;
}
// 將指針賦值
// 返回
return TRUE;
}
/*************************************************************************
*
* \函數(shù)名稱:
* MakeDIBPalette()
*
* \輸入?yún)?shù):
* LPVOID lpvColorTable - 顏色表指針
* LPBITMAPINFOHEADER lpBMIH - DIB信息頭指針
*
* \返回值:
* HPALETTE - 如果成功,則調(diào)色板句柄
*
* \說明:
* 該函數(shù)將讀取顏色表,并創(chuàng)建一個Windows調(diào)色板,并返回此調(diào)色板的句柄
*
************************************************************************
*/
HPALETTE MakeDIBPalette(LPVOID lpvColorTable, LPBITMAPINFOHEADER lpBMIH)
{
// 調(diào)色板句柄
HPALETTE hPalette = NULL;
// 顏色表顏色數(shù)
int nColorTableEntries;
// 設(shè)置DIB中的調(diào)色板指針
// lpvColorTable = (LPBYTE) lpBMIH + sizeof(BITMAPINFOHEADER);
// 計算調(diào)色板的表項數(shù)
if(lpBMIH->biClrUsed == 0) {
switch(lpBMIH->biBitCount) {
case 1:
nColorTableEntries = 2;
break;
case 4:
nColorTableEntries = 16;
break;
case 8:
nColorTableEntries = 256;
break;
case 16:
case 24:
case 32:
nColorTableEntries = 0;
break;
default:
break;
}
}
// 否則調(diào)色板的表項數(shù)就是用到的顏色數(shù)目
else {
nColorTableEntries = lpBMIH->biClrUsed;
}
ASSERT((nColorTableEntries >= 0) && (nColorTableEntries <= 256));
// 如果不存在調(diào)色板,則返回FALSE
if(nColorTableEntries == 0) return FALSE;
// 給邏輯調(diào)色板分配內(nèi)存
LPLOGPALETTE pLogPal = (LPLOGPALETTE) new char[2 * sizeof(WORD) +
nColorTableEntries * sizeof(PALETTEENTRY)];
// 設(shè)置邏輯調(diào)色板的信息
pLogPal->palVersion = 0x300;
pLogPal->palNumEntries = nColorTableEntries;
// 拷貝DIB中的顏色表到邏輯調(diào)色板
LPRGBQUAD pDibQuad = (LPRGBQUAD) lpvColorTable;
for(int i = 0; i < nColorTableEntries; i++) {
pLogPal->palPalEntry[i].peRed = pDibQuad->rgbRed;
pLogPal->palPalEntry[i].peGreen = pDibQuad->rgbGreen;
pLogPal->palPalEntry[i].peBlue = pDibQuad->rgbBlue;
pLogPal->palPalEntry[i].peFlags = 0;
pDibQuad++;
}
// 創(chuàng)建邏輯調(diào)色板
hPalette = ::CreatePalette(pLogPal);
// 刪除臨時變量
delete pLogPal;
// 返回調(diào)色板句柄
return hPalette;
}
/*************************************************************************
*
* \函數(shù)名稱:
* PaintDIB()
*
* \輸入?yún)?shù):
* CDC* pDC - 指向?qū)⒁邮誅IB圖象的設(shè)備上下文指針
* LPBITMAPINFOHEADER lpBMIH - DIB信息頭指針
* LPBYTE lpImage; - DIB位圖數(shù)據(jù)塊地址
* CPoint origin - 顯示DIB的邏輯坐標(biāo)
* CSize size - 顯示矩形的寬度和高度
* HPALETTE hPalette - 指向DIB的調(diào)色板句柄
*
* \返回值:
* BOOL - 如果成功,則返回TRUE
*
* \說明:
* 該函數(shù)將DIB圖象進行顯示
*
************************************************************************
*/
BOOL PaintDIB(CDC* pDC, LPBITMAPINFOHEADER lpBMIH, LPBYTE lpImage, CPoint origin, CSize size, HPALETTE hPalette)
{
if(lpBMIH == NULL) return FALSE;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -