/*---------------------------------
DIBFILE.C -- DIB File Functions
---------------------------------*/
#include "StdAfx.h"
#include "DibFile.h"
bool compare_nocase(const Tstring& first, const Tstring& second)
{
if(lstrcmpi(first.c_str(),second.c_str())<0)
return true;
else
return false;
}
bool operator<(const Tstring& lhs,const Tstring& rhs)
{
return compare_nocase(lhs,rhs);
}
//////////////////////////////////
FileDialog::FileDialog()
{
m_ofn.lStructSize = sizeof (OPENFILENAME) ;
m_ofn.hwndOwner = NULL ;
m_ofn.hInstance = NULL ;
m_ofn.lpstrFilter = NULL ;
m_ofn.lpstrCustomFilter = NULL ;
m_ofn.nMaxCustFilter = 0 ;
m_ofn.nFilterIndex = 0 ;
m_ofn.lpstrFile = NULL ;// Set in Open and Close functions
m_ofn.nMaxFile = MAX_PATH ;
m_ofn.lpstrFileTitle = NULL ;// Set in Open and Close functions
m_ofn.nMaxFileTitle = MAX_PATH ;
m_ofn.lpstrInitialDir = NULL ;
m_ofn.lpstrTitle = NULL ;
m_ofn.Flags = 0 ;// Set in Open and Close functions
m_ofn.nFileOffset = 0 ;
m_ofn.nFileExtension = 0 ;
m_ofn.lpstrDefExt = NULL ;//TEXT("JPG")ppend this extension to the file name if the user fails to type an extension
m_ofn.lCustData = 0 ;
m_ofn.lpfnHook = NULL ;
m_ofn.lpTemplateName = NULL ;
}
BOOL FileDialog::GetFileOpenName(HWND hwnd,PTSTR pstrFileName,PTSTR pstrTitleName,LPCTSTR szFilter)
{
if(NULL==pstrFileName)
return FALSE;
LPCTSTR lpstrDefExt;
if(NULL!=szFilter)
{
lpstrDefExt=_tcschr(szFilter+_tcslen(szFilter)+1,'.');
if(NULL!=lpstrDefExt)
m_ofn.lpstrDefExt=lpstrDefExt+1;
}
m_ofn.hwndOwner = hwnd ;
m_ofn.lpstrFile = pstrFileName ;
m_ofn.lpstrFileTitle = pstrTitleName ;
m_ofn.lpstrFilter = szFilter ;
m_ofn.Flags = 0 ;
return GetOpenFileName (&m_ofn) ;
}
BOOL FileDialog::GetFileSaveName(HWND hwnd,PTSTR pstrFileName,PTSTR pstrTitleName,LPCTSTR szFilter)
{
if(NULL==pstrFileName)
return FALSE;
LPCTSTR lpstrDefExt;
if(NULL!=szFilter)
{
lpstrDefExt=_tcschr(szFilter+_tcslen(szFilter)+1,'.');
if(NULL!=lpstrDefExt)
m_ofn.lpstrDefExt=lpstrDefExt+1;
}
m_ofn.hwndOwner = hwnd ;
m_ofn.lpstrFile = pstrFileName ;
m_ofn.lpstrFileTitle = pstrTitleName ;
m_ofn.lpstrFilter = szFilter ;
m_ofn.Flags = OFN_OVERWRITEPROMPT ;
return GetSaveFileName (&m_ofn) ;
}
//////////////////////////////////////////
ColorDialog::ColorDialog()
{
m_cc.lStructSize=sizeof(CHOOSECOLOR);
m_cc.hwndOwner=NULL;
m_cc.hInstance=NULL;
m_cc.rgbResult=RGB(0,0,0);
m_cc.lpCustColors=NULL;
m_cc.Flags=CC_ANYCOLOR|CC_RGBINIT|CC_FULLOPEN;
m_cc.lCustData=NULL;
m_cc.lpfnHook=NULL;
m_cc.lpTemplateName=NULL;
}
BOOL ColorDialog::GetColorRef(HWND hwnd,COLORREF* prgbRet,COLORREF *lpCustColors)//lpCustColors个数为16个
{
if(NULL==prgbRet)
return FALSE;
m_cc.hwndOwner=hwnd;
m_cc.rgbResult=*prgbRet;
m_cc.lpCustColors=lpCustColors;
if(ChooseColor(&m_cc))
{
*prgbRet=m_cc.rgbResult;
return TRUE;
}
else
return FALSE;
}
//////////////////////////////////////////
BITMAPFILEHEADER * DibLoadImage (LPCTSTR pstrFileName)
{
BOOL bSuccess ;
DWORD dwFileSize, dwHighSize, dwBytesRead ;
HANDLE hFile ;
BITMAPFILEHEADER * pbmfh ;
hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ;
if (hFile == INVALID_HANDLE_VALUE)
return NULL ;
dwFileSize = GetFileSize (hFile, &dwHighSize) ;
if (dwHighSize)
{
CloseHandle (hFile) ;
return NULL ;
}
pbmfh = (BITMAPFILEHEADER *)malloc (dwFileSize) ;
if (!pbmfh)
{
CloseHandle (hFile) ;
return NULL ;
}
bSuccess = ReadFile (hFile, pbmfh, dwFileSize, &dwBytesRead, NULL) ;
CloseHandle (hFile) ;
if (!bSuccess || (dwBytesRead != dwFileSize)
|| (pbmfh->bfType != * (WORD *) "BM")
|| (pbmfh->bfSize != dwFileSize))
{
free (pbmfh) ;
return NULL ;
}
return pbmfh ;
}
BOOL DibSaveImage (LPCTSTR pstrFileName, BITMAPFILEHEADER * pbmfh)
{
BOOL bSuccess ;
DWORD dwBytesWritten ;
HANDLE hFile ;
hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;
if (hFile == INVALID_HANDLE_VALUE)
return FALSE ;
bSuccess = WriteFile (hFile, pbmfh, pbmfh->bfSize, &dwBytesWritten, NULL) ;
CloseHandle (hFile) ;
if (!bSuccess || (dwBytesWritten != pbmfh->bfSize))
{
DeleteFile (pstrFileName) ;
return FALSE ;
}
return TRUE ;
}
BITMAPFILEHEADER * DDBToDIB (HDC hdc, HBITMAP hBitmap,int BitCount)
{
BITMAP bm;
int iOffset, iSizeImage ;
BYTE *pBits;
BITMAPFILEHEADER *pbfh;
BITMAPINFO *pbi;
if(NULL==hBitmap)
return NULL;
GetObject(hBitmap,sizeof(BITMAP),&bm);
switch(BitCount)
{
case 1:
case 4:
case 8:
iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*(1<<BitCount);
break;
case 16:
case 24:
case 32:
iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
break;
default:
return NULL;
}
iSizeImage=(((bm.bmWidth*BitCount+31)/32)*4)*bm.bmHeight;
pbfh=(BITMAPFILEHEADER *)malloc(iOffset+iSizeImage);
if(NULL==pbfh)
return NULL;
pBits=(BYTE *)pbfh+iOffset;
pbi=(BITMAPINFO *)(pbfh+1);
pbfh->bfType=0x4D42;
pbfh->bfSize=iOffset+iSizeImage;
pbfh->bfReserved1=0;
pbfh->bfReserved2=0;
pbfh->bfOffBits=iOffset;
pbi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pbi->bmiHeader.biWidth=bm.bmWidth;
pbi->bmiHeader.biHeight=bm.bmHeight;
pbi->bmiHeader.biPlanes=1;
pbi->bmiHeader.biBitCount=BitCount;
pbi->bmiHeader.biCompression=BI_RGB;
pbi->bmiHeader.biSizeImage=iSizeImage;
pbi->bmiHeader.biXPelsPerMeter=0;
pbi->bmiHeader.biYPelsPerMeter=0;
if(BitCount<16)
{
pbi->bmiHeader.biClrUsed=pbi->bmiHeader.biClrImportant=(1<<BitCount);
}
else
{
pbi->bmiHeader.biClrUsed=pbi->bmiHeader.biClrImportant=0;
}
GetDIBits(hdc,hBitmap,0,bm.bmHeight,pBits,pbi,DIB_RGB_COLORS);
return pbfh;
}
HBITMAP CreateBitmapObjectFromDibFile (HDC hdc, LPCTSTR szFileName)
{
BITMAPFILEHEADER * pbmfh ;
BOOL bSuccess ;
DWORD dwFileSize, dwHighSize, dwBytesRead ;
HANDLE hFile ;
HBITMAP hBitmap ;
hFile = CreateFile (szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ;
if (hFile == INVALID_HANDLE_VALUE)
return NULL ;
dwFileSize = GetFileSize (hFile, &dwHighSize) ;
if (dwHighSize)
{
CloseHandle (hFile) ;
return NULL ;
}
pbmfh = (BITMAPFILEHEADER *)malloc (dwFileSize) ;
if (!pbmfh)
{
CloseHandle (hFile) ;
return NULL ;
}
bSuccess = ReadFile (hFile, pbmfh, dwFileSize, &dwBytesRead, NULL) ;
CloseHandle (hFile) ;
if (!bSuccess || (dwBytesRead != dwFileSize)
|| (pbmfh->bfType != * (WORD *) "BM")
|| (pbmfh->bfSize != dwFileSize))
{
free (pbmfh) ;
return NULL ;
}
hBitmap = CreateDIBitmap (hdc,
(BITMAPINFOHEADER *) (pbmfh + 1),
CBM_INIT,
(BYTE *) pbmfh + pbmfh->bfOffBits,
(BITMAPINFO *) (pbmfh + 1),
DIB_RGB_COLORS) ;
free (pbmfh) ;
return hBitmap ;
}
HBITMAP CreateDibSectionFromDibFile (LPCTSTR szFileName)
{
BITMAPFILEHEADER bmfh ;
BITMAPINFO * pbmi ;
BYTE * pBits ;
BOOL bSuccess ;
DWORD dwInfoSize, dwBytesRead ;
HANDLE hFile ;
HBITMAP hBitmap ;
hFile = CreateFile (szFileName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL) ;
if (hFile == INVALID_HANDLE_VALUE)
return NULL ;
bSuccess = ReadFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER),
&dwBytesRead, NULL) ;
if (!bSuccess || (dwBytesRead != sizeof (BITMAPFILEHEADER))
|| (bmfh.bfType != * (WORD *) "BM"))
- 1
- 2
- 3
- 4
- 5
- 6
前往页