📄 gdiobject.cpp
字号:
#include "gos.h"
#include "gdiobject.h"
BOOL CBitmap::CreateBitmap(LPCTSTR pszFileName,CDC* pCompatile)
{
BYTE aHead[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
PBITMAPFILEHEADER pFile=PBITMAPFILEHEADER(aHead);
PBITMAPINFOHEADER pInfo=PBITMAPINFOHEADER(pFile+1);
DWORD nCTBytes,nSize=sizeof(aHead);
PBYTE pBuffer;
ASSERT(!m_bmp.bmBits);
/*HANDLE hFile = CreateFile(pszFileName,GENERIC_READ,
0,NULL,OPEN_EXISTING,0,NULL);
if(!hFile)return FALSE;
ReadFile(hFile,aHead,nSize,&nSize,NULL);*/
if(pFile->bfType!='MB' || nSize!=sizeof(aHead))
{
//CloseHandle(hFile);
return FALSE;
}
nSize=sizeof(BITMAPFILEHEADER)+pInfo->biSize;
nCTBytes=MAKELONG(pFile->bfOffBitsL,pFile->bfOffBitsH)-nSize;
nSize=MAKELONG(pFile->bfSizeL,pFile->bfSizeH)-nSize;
pBuffer=(PBYTE)malloc(nSize);
if(!pBuffer)
return FALSE;
m_bmp.bmType=0;
m_bmp.bmWidth=pInfo->biWidth;
m_bmp.bmHeight=pInfo->biHeight;
m_bmp.bmBitsPixel=pInfo->biBitCount;
m_bmp.bmBits=pBuffer;
m_bmp.bmClrTable=PRGBQUAD(pBuffer+nSize-nCTBytes);
m_bmp.bmClrUsed=nCTBytes>>2;
if(m_bmp.bmBitsPixel>8 || !m_bmp.bmClrUsed)
m_bmp.bmClrTable=NULL;
if(m_bmp.bmBitsPixel==16 && !pInfo->biCompression)
m_bmp.bmType|=BMP_TYPE555;
if(nCTBytes)
{
nSize-=nCTBytes;
//ReadFile(hFile,pBuffer+nSize-nCTBytes,nCTBytes,&nCTBytes,NULL);
}
//ReadFile(hFile,pBuffer,nSize,&nSize,NULL);
//CloseHandle(hFile);
return TRUE;
}
void CBitmap::CreateBitmap(int nWidth,int nHeight,int nBitCount,PVOID pBits)
{
ASSERT(!m_bmp.bmBits);
m_bmp.bmBits=pBits;
m_bmp.bmBitsPixel=nBitCount;
m_bmp.bmHeight=nHeight;
m_bmp.bmWidth=nWidth;
m_bmp.bmClrTable=NULL;
m_bmp.bmType=0;
}
BOOL CBitmap::CreateBitmap(int nWidth,int nHeight,int nBitCount)
{
DWORD nBytes;
PVOID pBits;
ASSERT(!m_bmp.bmBits);
GETBMPBITSBYTES(nBytes,nWidth,nHeight,nBitCount);
pBits=malloc(nBytes);
if(pBits)
{
m_bmp.bmBits=pBits;
m_bmp.bmBitsPixel=nBitCount;
m_bmp.bmHeight=nHeight;
m_bmp.bmClrTable=NULL;
m_bmp.bmType=BMP_OWNBUFFER;
}
return BOOL(pBits);
}
BOOL CBitmap::CreateBitmap(int nWidth,int nHeight,CBitmap* pCompatible)
{
if((nWidth<0)!=(pCompatible->m_bmp.bmHeight<0))
nWidth=-nWidth;
if((nHeight<0)!=(pCompatible->m_bmp.bmHeight<0))
nHeight=-nHeight;
return CreateBitmap(nWidth,nHeight,int(pCompatible->m_bmp.bmBitsPixel));
}
BOOL CBitmap::CreateBitmap(int nWidth,int nHeight,CDC* pCompatible)
{
return CreateBitmap(nWidth,nHeight,pCompatible->GetCurrentBitmap());
}
BOOL CBitmap::CreateBitmap(PBITMAPFILEHEADER pFile,CDC* pCompatile)
{
PBITMAPINFOHEADER pInfo=PBITMAPINFOHEADER(pFile+1);
DWORD nOffBits;
ASSERT(!m_bmp.bmBits);
if(pFile->bfType!='MB')
return FALSE;
nOffBits=MAKELONG(pFile->bfOffBitsL,pFile->bfOffBitsH);
m_bmp.bmType=0;
m_bmp.bmWidth=pInfo->biWidth;
m_bmp.bmHeight=-pInfo->biHeight;
m_bmp.bmBitsPixel=pInfo->biBitCount;
m_bmp.bmBits=PVOID(DWORD(pFile)+nOffBits);
m_bmp.bmClrTable=PRGBQUAD(DWORD(pInfo)+pInfo->biSize);
m_bmp.bmClrUsed=PRGBQUAD(m_bmp.bmBits)-PRGBQUAD(m_bmp.bmClrTable);
if(m_bmp.bmBitsPixel>8 || !m_bmp.bmClrUsed)
m_bmp.bmClrTable=NULL;
if(m_bmp.bmBitsPixel==16 && !pInfo->biCompression)
m_bmp.bmType=BMP_TYPE555;
if(pCompatile && m_bmp.bmClrTable && m_bmp.bmClrUsed>0)
{
CPalette* pPal=(CPalette*)&m_bmp.bmClrTable;
PRGBQUAD pColor=m_bmp.bmClrTable;
m_bmp.bmClrTable=NULL;
nOffBits=pPal->CreatePalette(pCompatile,pColor,m_bmp.bmClrUsed);
if(nOffBits)
m_bmp.bmClrUsed=-m_bmp.bmClrUsed;
}
return TRUE;
}
void CBitmap::CopyBitmap(CBitmap* pSrcBitmap)
{
int nBytes;
PVOID pData;
ASSERT(!m_bmp.bmBits);
m_bmp=pSrcBitmap->m_bmp;
if(!m_bmp.bmBits)
return;
if(m_bmp.bmType & BMP_OWNBUFFER)
{
nBytes=_msize(m_bmp.bmBits);
pData=malloc(nBytes);
CopyMemory(pData,m_bmp.bmBits,nBytes);
m_bmp.bmBits=pData;
}
if(m_bmp.bmClrUsed<0)
{
nBytes=_msize(m_bmp.bmClrTable);
pData=malloc(nBytes);
CopyMemory(pData,m_bmp.bmClrTable,nBytes);
m_bmp.bmClrTable=PRGBQUAD(pData);
}
}
void CBitmap::DeleteObject()
{
if(m_bmp.bmBits)
{
if(m_bmp.bmType & BMP_OWNBUFFER)
free(m_bmp.bmBits);
if(m_bmp.bmClrUsed<0)
free(m_bmp.bmClrTable);
m_bmp.bmBits=NULL;
}
}
BOOL CPalette::CreatePalette(CDC* pCompatile,CBitmap* pBitmap)
{
const BITMAP& bmp=pBitmap->GetBitmap();
if(!bmp.bmBits || bmp.bmClrUsed<=0)
return FALSE;
return CreatePalette(pCompatile,bmp.bmClrTable,bmp.bmClrUsed);
}
BOOL CPalette::CreatePalette(CDC* pCompatile,PRGBQUAD pColorTable,int nCount)
{
ASSERT(!m_pTable);
m_pTable=(PDWORD)malloc(nCount*sizeof(DWORD));
if(!m_pTable)
return FALSE;
pCompatile->GetRopObj().CopyPalette(m_pTable,PDWORD(pColorTable),nCount);
return TRUE;
}
BOOL CPalette::CreatePalette(CDC* pCompatile,PCOLORREF pColorTable,int nCount)
{
ASSERT(!m_pTable);
m_pTable=(PDWORD)malloc(nCount*sizeof(DWORD));
if(!m_pTable)
return FALSE;
pCompatile->GetRopObj().CopyPalette(m_pTable,PDWORD(pColorTable),-nCount);
return TRUE;
}
BOOL CFont::CreateFont(CCharSet* pCharSet,CFontFace* pFontFace,int nSize)
{
m_pCharSet=pCharSet?pCharSet:g_pDesktop->m_pCharSet;
m_pFontFace=pFontFace?pFontFace:m_pCharSet->GetFontFace();
m_nSize=nSize?nSize:m_pFontFace->GetFontFace().nHeight;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -