📄 mydib.cpp
字号:
//MYDIB.CPP BMP 拳老阑 免仿窍绰 努贰胶
#include "stdafx.h"
#include "mydib.h"
//积己磊 拳老疙阑 林绢辑 努贰胶啊 父甸绢瘤搁辑 捞固瘤甫 啊瘤绊
//乐霸 茄促.
CMyDib::CMyDib(LPSTR filename)
{
//拳老疙阑 m_strFileName俊 扁废茄促.
lstrcpy((LPSTR)m_strFileName,(LPSTR)filename);
//捞固瘤 器牢磐客 滚欺甫 null肺 汲沥茄促.
szDib=NULL;
lpDib=NULL;
m_palDIB=NULL;
//迫饭飘甫 null肺 汲沥茄促.
szPal=NULL;
//bmp 拳老阑 肺靛矫挪促.
if(!bLoadBmpFile())
{
AfxMessageBox(m_strMessageTemp);
ExitProcess(1);
}
}
//积己磊 拳老疙阑 林绢辑 努贰胶啊 父甸绢瘤搁辑 捞固瘤甫 啊瘤绊
//乐霸 茄促.
CMyDib::CMyDib()
{
//拳老疙阑 m_strFileName俊 扁废茄促.
// lstrcpy((LPSTR)m_strFileName,(LPSTR)filename);
//捞固瘤 器牢磐客 滚欺甫 null肺 汲沥茄促.
szDib=NULL;
lpDib=NULL;
m_palDIB=NULL;
//迫饭飘甫 null肺 汲沥茄促.
szPal=NULL;
//bmp 拳老阑 肺靛矫挪促.
/* if(!bLoadBmpFile())
{
AfxMessageBox(m_strMessageTemp);
ExitProcess(1);
}*/
}
CMyDib::~CMyDib()
{
if(szDib)
{
::GlobalUnlock(szDib);
::GlobalFree(szDib);
}
if(m_palDIB)
delete m_palDIB;
if(szPal)
{
::GlobalUnlock((HGLOBAL) szPal);
::GlobalFree((HGLOBAL) szPal);
}
}
BOOL CMyDib::bLoadBmpFile()
{
HFILE bmpFile;
//拳老阑 楷促.
bmpFile=_lopen((LPSTR)m_strFileName,OF_READ);
if(bmpFile<0)
{
sprintf(m_strMessageTemp,"%s 拳老捞 绝嚼聪促",m_strFileName);
return FALSE;
}
//bmpHeder 备炼眉俊 BMPHEADER 庆歹 沥焊甫 佬绢 柯促.
if(_lread(bmpFile,(LPSTR)&bmpHeader,sizeof(bmpHeader))!=sizeof(bmpHeader))
{
sprintf(m_strMessageTemp,"%s BMPHEADER 甫 佬阑荐 绝嚼聪促!",m_strFileName);
return FALSE;
}
//拳老捞 bmp 老版快俊绰 拳老 贸澜俊 "BM"捞扼绊 汲沥秦乐澜
if (bmpHeader.bfType != DIB_HEADER_MARKER)
{
sprintf(m_strMessageTemp,"%s BMP 拳老捞 酒凑聪促.",m_strFileName);
return FALSE;
}
//捞固瘤 单捞鸥 农府父怒 皋葛府甫 汲沥茄促.
szDib =::GlobalAlloc(GHND,bmpHeader.bfSize);
if(szDib==NULL)
{
sprintf(m_strMessageTemp,"%s 皋葛府啊 何练钦聪促.",m_strFileName);
return FALSE;
}
//捞固瘤 单捞鸥 滚欺甫 牧飘费 且荐 乐档废 lpDip 俊 遏欧茄促.
lpDib=(LPSTR)::GlobalLock(szDib);
UINT len;
//捞固瘤 单捞鸥甫 佬绰促.
if((len=_lread(bmpFile,(LPSTR)lpDib,bmpHeader.bfSize-sizeof(bmpHeader)))!=bmpHeader.bfSize-sizeof(bmpHeader))
{
::GlobalUnlock(szDib);
::GlobalFree(szDib);
szDib=NULL;
lpDib=NULL;
sprintf(m_strMessageTemp,"%s 拳老阑 佬阑荐 绝嚼聪促.",m_strFileName);
return FALSE;
}
bmpInfoHeader = (LPBITMAPINFOHEADER)lpDib;
bmcInfoHeader = (LPBITMAPCOREHEADER)lpDib;
bmpInfo =(LPBITMAPINFO)lpDib;
bmcInfo = (LPBITMAPCOREINFO)lpDib;
bCreatePalette();
_lclose(bmpFile);
return TRUE;
}
BOOL CMyDib::bLoadBmpBuffer(BITMAPFILEHEADER *pBmpFileHeader,HANDLE hDIB)
{
// HFILE bmpFile;
//拳老阑 楷促.
// bmpFile=_lopen((LPSTR)m_strFileName,OF_READ);
/*
if(bmpFile<0)
{
sprintf(m_strMessageTemp,"%s 拳老捞 绝嚼聪促",m_strFileName);
return FALSE;
}
//bmpHeder 备炼眉俊 BMPHEADER 庆歹 沥焊甫 佬绢 柯促.
// if(_lread(bmpFile,(LPSTR)&bmpHeader,sizeof(bmpHeader))!=sizeof(bmpHeader))
{
sprintf(m_strMessageTemp,"%s BMPHEADER 甫 佬阑荐 绝嚼聪促!",m_strFileName);
return FALSE;
}*/
memcpy(&bmpHeader,pBmpFileHeader,sizeof(BITMAPFILEHEADER));
/* //拳老捞 bmp 老版快俊绰 拳老 贸澜俊 "BM"捞扼绊 汲沥秦乐澜
if (bmpHeader.bfType != DIB_HEADER_MARKER)
{
sprintf(m_strMessageTemp,"%s BMP 拳老捞 酒凑聪促.",m_strFileName);
return FALSE;
}*/
//捞固瘤 单捞鸥 农府父怒 皋葛府甫 汲沥茄促.
szDib =::GlobalAlloc(GHND,pBmpFileHeader->bfSize);
if(szDib==NULL)
{
sprintf(m_strMessageTemp,"%s 皋葛府啊 何练钦聪促.",m_strFileName);
return FALSE;
}
//捞固瘤 单捞鸥 滚欺甫 牧飘费 且荐 乐档废 lpDip 俊 遏欧茄促.
lpDib=(LPSTR)::GlobalLock(szDib);
memcpy(lpDib,hDIB,bmpHeader.bfSize-sizeof(bmpHeader));
/* UINT len;
//捞固瘤 单捞鸥甫 佬绰促.
if((len=_lread(bmpFile,(LPSTR)lpDib,bmpHeader.bfSize-sizeof(bmpHeader)))!=bmpHeader.bfSize-sizeof(bmpHeader))
{
::GlobalUnlock(szDib);
::GlobalFree(szDib);
szDib=NULL;
lpDib=NULL;
sprintf(m_strMessageTemp,"%s 拳老阑 佬阑荐 绝嚼聪促.",m_strFileName);
return FALSE;
}*/
bmpInfoHeader = (LPBITMAPINFOHEADER)lpDib;
bmcInfoHeader = (LPBITMAPCOREHEADER)lpDib;
bmpInfo =(LPBITMAPINFO)lpDib;
bmcInfo = (LPBITMAPCOREINFO)lpDib;
bCreatePalette();
// _lclose(bmpFile);
return TRUE;
}
//迫饭飘甫 父电促.
BOOL CMyDib::bCreatePalette()
{
//泅犁 荤侩窍绰 漠扼荐甫 罐绊
m_nColorNums=bGetColorNums();
if(m_nColorNums==0)
return TRUE;
//鞘饭飘 皋葛府甫 犬焊茄促澜
szPal = ::GlobalAlloc(GHND, sizeof(LOGPALETTE)
+ sizeof(PALETTEENTRY)
* m_nColorNums);
if (szPal == NULL)
{
sprintf(m_strMessageTemp,"%s palette 皋葛府啊 何练钦聪促.",m_strFileName);
return FALSE;
}
//lpPal 遏欧窍绊
lpPal = (LPLOGPALETTE) ::GlobalLock((HGLOBAL) szPal);
lpPal->palVersion = PALVERSION;
lpPal->palNumEntries =(WORD)m_nColorNums;
//漠扼荐父怒 迫饭飘甫 漠饭飘 浚飘府俊 持绰促.
for (int i = 0; i < (int)m_nColorNums; i++)
{
if (m_nDibStyle) //win3.0 捞惑滚傈老版快 促澜苞 鞍捞 窍绊
{
lpPal->palPalEntry[i].peRed = bmpInfo->bmiColors[i].rgbRed;
lpPal->palPalEntry[i].peGreen =bmpInfo->bmiColors[i].rgbGreen;
lpPal->palPalEntry[i].peBlue = bmpInfo->bmiColors[i].rgbBlue;
lpPal->palPalEntry[i].peFlags = 0;
}
else //弊寇俊绰 促澜苞 鞍捞 茄促.
{
lpPal->palPalEntry[i].peRed = bmcInfo->bmciColors[i].rgbtRed;
lpPal->palPalEntry[i].peGreen = bmcInfo->bmciColors[i].rgbtGreen;
lpPal->palPalEntry[i].peBlue = bmcInfo->bmciColors[i].rgbtBlue;
lpPal->palPalEntry[i].peFlags = 0;
}
}
// CPalette 备炼眉俊 lpPal甫 傅农矫难辑 迫饭飘甫 父奠聪促.
m_palDIB = new CPalette;
m_palDIB->CreatePalette(lpPal);
return TRUE;
}
//泅犁 厚飘甘狼 漠扼荐甫 茫绰促.
int CMyDib::bGetColorNums()
{
//3.0 滚傈狼 厚飘甘捞搁
if (IS_WIN30_DIB(lpDib))
{
//m_nDibStyle 甫 3.0 厚飘甘 滚傈捞扼绊 汲沥
m_nDibStyle=TRUE;
m_nWidthX=bmpInfoHeader->biWidth;
m_nWidthY=bmpInfoHeader->biHeight;
DWORD dwClrUsed;
//荤侩等 漠扼荐甫 罐酒辑 父距俊 弊巴捞 0捞 酒聪搁
//弊巴捞 泅犁 厚飘甘捞 荤侩窍绰 漠扼荐 捞骨肺 汲沥
dwClrUsed = bmpInfoHeader->biClrUsed;
if (dwClrUsed != 0)
return (int)dwClrUsed;
}
else
{
m_nDibStyle=FALSE;
m_nWidthX=bmcInfoHeader->bcWidth;
m_nWidthY=bmcInfoHeader->bcHeight;
}
WORD wBitCount;
//厚飘 墨款飘甫 罐绰促.
if (IS_WIN30_DIB(lpDib))
wBitCount = bmpInfoHeader->biBitCount;
else
wBitCount = bmcInfoHeader->bcBitCount;
switch (wBitCount)
{
case 1:
return 2;
case 4:
return 16;
case 8:
return 256;
default:
return 0;
}
}
LPSTR CMyDib::bFindDib()
{
return (lpDib + *(LPDWORD)lpDib + bPaletteSize());
}
//迫贰飘 农扁甫 舅酒夯促.
WORD CMyDib::bPaletteSize()
{
//3.0捞惑 滚傈 捞固瘤 捞搁
if (m_nDibStyle)
return (WORD)(m_nColorNums * sizeof(RGBQUAD));
else
return (WORD)(m_nColorNums * sizeof(RGBTRIPLE));
}
//扩档快俊 汲沥登绢乐绰 迫饭飘甫 荤侩茄促.
int CMyDib::SetSystemPalette(HDC hDC)
{
if(m_nColorNums != 0) return FALSE;
//泅犁 飘风漠扼葛靛捞搁 汲沥救窃
if(!::GetDeviceCaps(hDC, RASTERCAPS) && RC_PALETTE) return FALSE;
//泅犁 葛靛啊 割漠扼 葛靛捞哥 迫饭飘浚飘府啊 割俺牢瘤 犬牢
int nSysColors = ::GetDeviceCaps(hDC, NUMCOLORS);
int nPalEntries = ::GetDeviceCaps(hDC, SIZEPALETTE);
if(nPalEntries ==0)
return FALSE;
int nEntries = (nPalEntries == 0) ? nSysColors : nPalEntries;
LPLOGPALETTE pLogPal = (LPLOGPALETTE) new char[2 * sizeof(WORD) +
nEntries * sizeof(PALETTEENTRY)];
pLogPal->palVersion = 0x300;
pLogPal->palNumEntries = nEntries;
//矫胶袍 迫饭飘甫 掘绊
::GetSystemPaletteEntries(hDC, 0, nEntries,
(LPPALETTEENTRY) ((LPBYTE) pLogPal + 2 * sizeof(WORD)));
HPALETTE m_hPalette;
//矫胶袍 迫饭飘甫 汲沥茄促.
m_hPalette = ::CreatePalette(pLogPal);
SelectPalette(hDC, m_hPalette, TRUE);
delete pLogPal;
return TRUE;
}
void CMyDib::PaintImage(int x, int y, HDC hDC)
{
LPSTR lpDIBBits;
BOOL bSuccess=FALSE;
HPALETTE hPal=NULL;
HPALETTE hOldPal=NULL;
if (lpDib == NULL)
return;
//角龙 捞固瘤肺 盒府茄促.
lpDIBBits = bFindDib();
if (m_palDIB != NULL)
{
hPal = (HPALETTE) m_palDIB->m_hObject;
hOldPal = ::SelectPalette(hDC, hPal, TRUE);
RealizePalette(hDC);
}
else
{
if(SetSystemPalette(hDC))
RealizePalette(hDC);
}
int a=::SetStretchBltMode(hDC, COLORONCOLOR);
int b=::SetDIBitsToDevice(hDC, // hDC
x, // DestX
y, // DestY
m_nWidthX, // nDestWidth
m_nWidthY, // nDestHeight
0, // SrcX
0, // SrcY
0, // nStartScan
(WORD)m_nWidthY, // nNumScans
lpDIBBits, // lpBits
bmpInfo, // lpBitsInfo
DIB_RGB_COLORS); // wUsage
if (hOldPal != NULL)
{
::SelectPalette(hDC, hOldPal, TRUE);
}
}
void CMyDib::PaintImage(int x, int y, int cx, int cy,HDC hDC )
{
LPSTR lpDIBBits;
BOOL bSuccess=FALSE;
HPALETTE hPal=NULL;
HPALETTE hOldPal=NULL;
if (lpDib == NULL)
return;
lpDIBBits = bFindDib();
if (m_palDIB != NULL)
{
hPal = (HPALETTE) m_palDIB->m_hObject;
hOldPal = ::SelectPalette(hDC, hPal, TRUE);
RealizePalette(hDC);
}
else
{
if(SetSystemPalette(hDC))
RealizePalette(hDC);
}
int a=::SetStretchBltMode(hDC, COLORONCOLOR);
int b=::StretchDIBits(hDC, // hDC
x, // DestX
y, // DestY
cx, // nDestWidth
cy, // nDestHeight
0, // SrcX
0, // SrcY
m_nWidthX,
m_nWidthY,
lpDIBBits, // lpBits
bmpInfo, // lpBitsInfo
DIB_RGB_COLORS,SRCCOPY); // wUsage
if (hOldPal != NULL)
{
::SelectPalette(hDC, hOldPal, TRUE);
}
}
//捞固瘤甫 历厘茄促.
int CMyDib::SaveImage(LPSTR filename)
{
if(filename!=NULL)
lstrcpy((LPSTR)m_strFileName,(LPSTR)filename);
int OffBits;
HFILE bmpFile;
OffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * m_nColorNums;
bmpFile=_lcreat(m_strFileName,0);
UINT len;
len=_lwrite(bmpFile,(LPSTR)&bmpHeader,sizeof(BITMAPFILEHEADER));
len=_lwrite(bmpFile,(LPSTR)lpDib,bmpHeader.bfSize-sizeof(bmpHeader));
_lclose(bmpFile);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -