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