?? fade.c
字號:
// History: Date Author Reason
// 5/24/95 GGB Created
//****************************************************************************
BOOL GetFileName (LPSTR szFileName)
{
OPENFILENAME of;
DWORD flags;
static char szTitle[30]; // Dialog Box title
static char szTemplate[20]; // Dialog Box template
static char szFile[256]; // File name
static char szFileTitle[256]; // Title
static char szDrive[5]; // Drive
static char szDir[256]; // Directory
static char szFname[10]; // Filename
static char szExt[4]; // Extension
char *szFilter[] = // Filter
{
"Bitmaps",
"*.bmp;*.dib;*.rle",
""
};
// Initialize the OPENFILENAME members
szFile[0] = '\0';
flags = OFN_HIDEREADONLY;
of.lStructSize = sizeof (OPENFILENAME);
of.hwndOwner = GetFocus ();
of.hInstance = hInst;
of.lpstrFilter = szFilter[0];
of.lpstrCustomFilter = NULL;
of.nMaxCustFilter = 0L;
of.nFilterIndex = 1L;
of.lpstrFile = szFile;
of.nMaxFile = sizeof (szFile);
of.lpstrFileTitle = szFileTitle;
of.nMaxFileTitle = sizeof (szFileTitle);
of.lpstrInitialDir = NULL;
of.lpstrTitle = NULL;
of.Flags = flags;
of.nFileOffset = 0;
of.nFileExtension = 0;
of.lpstrDefExt = NULL;
of.lpfnHook = NULL;
of.lpTemplateName = NULL;
// Call the GetOpenFilename function
if (GetOpenFileName (&of))
{
lstrcpy (szFileName, of.lpstrFile);
return TRUE;
}
else
return FALSE;
}
/****************************************************************************
* *
* FUNCTION :OpenDIB(LPSTR szFile) *
* *
* PURPOSE :Open a DIB file and create a MEMORY DIB, a memory handle *
* containing BITMAPINFO, palette data and the bits. *
* *
* RETURNS :A handle to the DIB. *
* *
* Taken from the ShowDIB 32 bit sample *
* *
****************************************************************************/
HANDLE OpenDIB (LPSTR szFile)
{
HFILE fh;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
DWORD dwLen = 0;
DWORD dwBits;
HANDLE hdib;
HANDLE h;
OFSTRUCT of;
/* Open the file and read the DIB information */
fh = OpenFile(szFile, &of, (UINT)OF_READ);
if (fh == -1)
return NULL;
hdib = ReadDibBitmapInfo(fh);
if (!hdib)
return NULL;
DibInfo(hdib,&bi);
/* Calculate the memory needed to hold the DIB */
dwBits = bi.biSizeImage;
dwLen = bi.biSize + (DWORD)PaletteSize ((LPSTR)&bi) + dwBits;
/* Try to increase the size of the bitmap info. buffer to hold the DIB */
h = GlobalReAlloc(hdib, dwLen, GHND);
if (!h){
GlobalFree(hdib);
hdib = NULL;
}
else
hdib = h;
/* Read in the bits */
if (hdib){
lpbi = (VOID FAR *)GlobalLock(hdib);
_lread(fh, (LPSTR)lpbi + (WORD)lpbi->biSize + PaletteSize((LPSTR)lpbi), dwBits);
GlobalUnlock(hdib);
}
_lclose(fh);
return hdib;
}
/****************************************************************************
* *
* FUNCTION : DibInfo(HANDLE hbi,LPBITMAPINFOHEADER lpbi) *
* *
* PURPOSE : Retrieves the DIB info associated with a CF_DIB *
* format memory block. *
* *
* RETURNS : TRUE - if successful. *
* FALSE - otherwise *
* *
* Taken from the ShowDIB 32 bit sample *
* *
****************************************************************************/
BOOL DibInfo (
HANDLE hbi,
LPBITMAPINFOHEADER lpbi)
{
if (hbi){
*lpbi = *(LPBITMAPINFOHEADER)GlobalLock (hbi);
/* fill in the default fields */
if (lpbi->biSize != sizeof (BITMAPCOREHEADER)){
if (lpbi->biSizeImage == 0L)
lpbi->biSizeImage = WIDTHBYTES(lpbi->biWidth*lpbi->biBitCount) * lpbi->biHeight;
if (lpbi->biClrUsed == 0L)
lpbi->biClrUsed = DIBNumColors ((LPSTR)lpbi);
}
GlobalUnlock (hbi);
return TRUE;
}
return FALSE;
}
/****************************************************************************
* *
* FUNCTION : ReadDibBitmapInfo(int fh) *
* *
* PURPOSE : Will read a file in DIB format and return a global HANDLE *
* to it's BITMAPINFO. This function will work with both *
* "old" (BITMAPCOREHEADER) and "new" (BITMAPINFOHEADER) *
* bitmap formats, but will always return a "new" BITMAPINFO *
* *
* RETURNS : A handle to the BITMAPINFO of the DIB in the file. *
* *
* Taken from the ShowDIB 32 bit sample *
* *
****************************************************************************/
HANDLE ReadDibBitmapInfo (INT fh)
{
DWORD off;
HANDLE hbi = NULL;
INT size;
INT i;
WORD nNumColors;
RGBQUAD FAR *pRgb;
BITMAPINFOHEADER bi;
BITMAPCOREHEADER bc;
LPBITMAPINFOHEADER lpbi;
BITMAPFILEHEADER bf;
DWORD dwWidth = 0;
DWORD dwHeight = 0;
WORD wPlanes, wBitCount;
if (fh == -1)
return NULL;
#ifdef FIXDWORDALIGNMENT
/* Reset file pointer and read file header */
off = _llseek(fh, 0L, (UINT)SEEK_CUR);
if ((SIZEOF_BITMAPFILEHEADER_PACKED) != _lread(fh, (LPSTR)&bf, (UINT)sizeof (SIZEOF_BITMAPFILEHEADER_PACKED)))
return FALSE;
#else
ReadBitMapFileHeaderandConvertToDwordAlign(fh, &bf, &off);
/* at this point we have read the file into bf*/
#endif
/* Do we have a RC HEADER? */
if (!ISDIB (bf.bfType)) {
bf.bfOffBits = 0L;
_llseek(fh, off, (UINT)SEEK_SET); /*seek back to beginning of file*/
}
if (sizeof (bi) != _lread(fh, (LPSTR)&bi, (UINT)sizeof(bi)))
return FALSE;
nNumColors = DIBNumColors ((LPSTR)&bi);
/* Check the nature (BITMAPINFO or BITMAPCORE) of the info. block
* and extract the field information accordingly. If a BITMAPCOREHEADER,
* transfer it's field information to a BITMAPINFOHEADER-style block
*/
switch (size = (INT)bi.biSize){
case sizeof (BITMAPINFOHEADER):
break;
case sizeof (BITMAPCOREHEADER):
bc = *(BITMAPCOREHEADER*)&bi;
dwWidth = (DWORD)bc.bcWidth;
dwHeight = (DWORD)bc.bcHeight;
wPlanes = bc.bcPlanes;
wBitCount = bc.bcBitCount;
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = dwWidth;
bi.biHeight = dwHeight;
bi.biPlanes = wPlanes;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = nNumColors;
bi.biClrImportant = nNumColors;
_llseek(fh, (LONG)sizeof (BITMAPCOREHEADER) - sizeof (BITMAPINFOHEADER), (UINT)SEEK_CUR);
break;
default:
/* Not a DIB! */
return NULL;
}
/* Fill in some default values if they are zero */
if (bi.biSizeImage == 0){
bi.biSizeImage = WIDTHBYTES ((DWORD)bi.biWidth * bi.biBitCount)
* bi.biHeight;
}
if (bi.biClrUsed == 0)
bi.biClrUsed = DIBNumColors((LPSTR)&bi);
/* Allocate for the BITMAPINFO structure and the color table. */
hbi = GlobalAlloc (GHND, (LONG)bi.biSize + nNumColors * sizeof(RGBQUAD));
if (!hbi)
return NULL;
lpbi = (VOID FAR *)GlobalLock (hbi);
*lpbi = bi;
/* Get a pointer to the color table */
pRgb = (RGBQUAD FAR *)((LPSTR)lpbi + bi.biSize);
if (nNumColors){
if (size == sizeof(BITMAPCOREHEADER)){
/* Convert a old color table (3 byte RGBTRIPLEs) to a new
* color table (4 byte RGBQUADs)
*/
_lread(fh, (LPSTR)pRgb, (UINT)nNumColors * sizeof(RGBTRIPLE));
for (i = nNumColors - 1; i >= 0; i--){
RGBQUAD rgb;
rgb.rgbRed = ((RGBTRIPLE FAR *)pRgb)[i].rgbtRed;
rgb.rgbBlue = ((RGBTRIPLE FAR *)pRgb)[i].rgbtBlue;
rgb.rgbGreen = ((RGBTRIPLE FAR *)pRgb)[i].rgbtGreen;
rgb.rgbReserved = (BYTE)0;
pRgb[i] = rgb;
}
}
else
_lread(fh, (LPSTR)pRgb, (UINT)nNumColors * sizeof(RGBQUAD));
}
if (bf.bfOffBits != 0L){
_llseek(fh, off + bf.bfOffBits, (UINT)SEEK_SET);
}
GlobalUnlock(hbi);
return hbi;
}
/****************************************************************************
* *
* FUNCTION : ReadBitMapFileHeaderandConvertToDwordAlign(HFILE fh, LPBITMAPFILEHEADER pbf)
* *
* PURPOSE : read file header (which is packed) and convert into unpacked BITMAPFILEHEADER strucutre
* *
* RETURNS : VOID
* *
* Taken from the ShowDIB 32 bit sample *
* *
****************************************************************************/
VOID ReadBitMapFileHeaderandConvertToDwordAlign(HFILE fh, LPBITMAPFILEHEADER pbf, LPDWORD lpdwoff)
{
DWORD off;
off = _llseek(fh, 0L, (UINT) SEEK_CUR);
*lpdwoff = off;
/* BITMAPFILEHEADER STRUCUTURE is as follows
* BITMAPFILEHEADER
* WORD bfType
> .... < add WORD if packed here!
* DWORD bfSize
* WORD bfReserved1
* WORD bfReserved2
* DWORD bfOffBits
* This is the packed format, unpacked adds a WORD after bfType
*/
/* read in bfType*/
_lread(fh, (LPSTR) &pbf->bfType, sizeof(WORD));
/* read in last 3 dwords*/
_lread(fh, (LPSTR) &pbf->bfSize, sizeof(DWORD) * 3);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -