⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_16821.htm

📁 一些关于vc的问答
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<br>内容:LPSTR FindDIBBits(LPSTR lpDIB); 你用这个函数吧!给点分吧!谢谢<BR>/*&nbsp;&nbsp;&nbsp;&nbsp;PortTool v2.2&nbsp;&nbsp;&nbsp;&nbsp; dibutil.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ <BR><BR>#include "stdafx.h" <BR><BR>/* DIB constants */ <BR>#define PALVERSION&nbsp;&nbsp; 0x300 <BR><BR>/* DIB macros */ <BR>#define IS_WIN30_DIB(lpbi)&nbsp;&nbsp;((*(LPDWORD)(lpbi)) == sizeof(BITMAPINFOHEADER)) <BR>#define RECTWIDTH(lpRect)&nbsp;&nbsp;&nbsp;&nbsp; ((lpRect)-&gt;right - (lpRect)-&gt;left) <BR>#define RECTHEIGHT(lpRect)&nbsp;&nbsp;&nbsp;&nbsp;((lpRect)-&gt;bottom - (lpRect)-&gt;top) <BR><BR>/* Handle to a DIB */ <BR>#define HDIB HANDLE <BR><BR><BR>/* Print Area selection */ <BR>#define PW_WINDOW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 <BR>#define PW_CLIENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2 <BR><BR><BR>/* Print Options selection */ <BR>#define PW_BESTFIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 <BR>#define PW_STRETCHTOPAGE 2 <BR>#define PW_SCALE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 <BR><BR>/* DIB Macros*/ <BR><BR>// WIDTHBYTES performs DWORD-aligning of DIB scanlines.&nbsp;&nbsp;The "bits" <BR>// parameter is the bit count for the scanline (biWidth * biBitCount), <BR>// and this macro returns the number of DWORD-aligned bytes needed&nbsp;&nbsp;<BR>// to hold those bits. <BR><BR>#define WIDTHBYTES(bits)&nbsp;&nbsp;&nbsp;&nbsp;(((bits) + 31) / 32 * 4) <BR><BR>/* Error constants */ <BR>enum { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_MIN = 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // All error #s &gt;= this value <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_NOT_DIB = 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Tried to load a file, NOT a DIB! <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_MEMORY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Not enough memory! <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_READ,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Error reading file! <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_LOCK,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Error on a GlobalLock()! <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_OPEN,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Error opening a file! <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_CREATEPAL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Error creating palette. <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_GETDC,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Couldn't get a DC. <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_CREATEDDB,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Error create a DDB. <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_STRETCHBLT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// StretchBlt() returned failure. <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_STRETCHDIBITS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // StretchDIBits() returned failure. <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_SETDIBITSTODEVICE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // SetDIBitsToDevice() failed. <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_STARTDOC,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Error calling StartDoc(). <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_NOGDIMODULE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Couldn't find GDI module in memory. <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_SETABORTPROC,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Error calling SetAbortProc(). <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_STARTPAGE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Error calling StartPage(). <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_NEWFRAME,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Error calling NEWFRAME escape. <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_ENDPAGE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Error calling EndPage(). <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_ENDDOC,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Error calling EndDoc(). <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_SETDIBITS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Error calling SetDIBits(). <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_FILENOTFOUND,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Error opening file in GetDib() <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_INVALIDHANDLE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Invalid Handle <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_DIBFUNCTION,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Error on call to DIB function <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERR_MAX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// All error #s &lt; this value <BR>&nbsp;&nbsp;&nbsp;&nbsp; }; <BR><BR>/* function prototypes */ <BR>HANDLE&nbsp;&nbsp;AllocRoomForDIB(BITMAPINFOHEADER bi, HBITMAP hBitmap); <BR>HDIB&nbsp;&nbsp;&nbsp;&nbsp;BitmapToDIB(HBITMAP hBitmap, HPALETTE hPal); <BR>HBITMAP DIBToBitmap(HDIB hDIB, HPALETTE hPal); <BR>WORD DIBNumColors(VOID FAR * pv);<BR>WORD PaletteSize(LPSTR lpDIB);<BR>HDIB CreateDIB(DWORD dwWidth, DWORD dwHeight, WORD wBitCount); <BR>LPSTR FindDIBBits(LPSTR lpDIB); <BR>DWORD DIBWidth(LPSTR lpDIB);<BR>DWORD DIBHeight(LPSTR lpDIB);<BR>WORD DIBNumColors(LPSTR lpDIB);<BR>HPALETTE CreateDIBPalette(HDIB hDIB);<BR>HBITMAP DIBToBitmap(HDIB hDIB, HPALETTE hPal);<BR><BR>int PalEntriesOnDevice(HDC hDC);<BR>HPALETTE GetSystemPalette(void);<BR>HDIB ChangeDIBFormat(HDIB hDIB, WORD wBitCount, DWORD dwCompression);<BR>HDIB ChangeBitmapFormat(HBITMAP hBitmap, WORD wBitCount, DWORD dwCompression, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HPALETTE hPal);<BR>BOOL SaveDIB(HDIB hDib, LPSTR lpFileName);&nbsp;&nbsp;<BR>/////////////////////////////////////////////////////<BR>HDIB WINAPI ReadDIBFile(CFile& file);<BR>BOOL WINAPI PaintDIB(HDC&nbsp;&nbsp;&nbsp;&nbsp; hDC,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPRECT&nbsp;&nbsp;lpDCRect,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HDIB&nbsp;&nbsp;&nbsp;&nbsp;hDIB,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPRECT&nbsp;&nbsp;lpDIBRect,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPalette* pPal);<BR>&nbsp;&nbsp;&nbsp;&nbsp;BOOL WINAPI PaintDIBEx(HDC&nbsp;&nbsp;&nbsp;&nbsp; hDC,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPRECT&nbsp;&nbsp;lpDCRect,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HDIB&nbsp;&nbsp;&nbsp;&nbsp;hDIB,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPRECT&nbsp;&nbsp;lpDIBRect,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HPALETTE pPal);<BR>CString StrChange(CString str);<BR>CString StrChangeEnd(CString str);<BR>BOOL WINAPI PaintDIBExEx(HDC&nbsp;&nbsp;&nbsp;&nbsp; hDC,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPRECT&nbsp;&nbsp;lpDCRect,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HDIB&nbsp;&nbsp;&nbsp;&nbsp;hDIB,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//LPRECT&nbsp;&nbsp;lpDIBRect,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HPALETTE pPal);<BR>HPALETTE GetPrintPalette(HDC hDC);<BR><BR>CString ChangeCByteArrayToStr(CByteArray array);<BR>void ChangeStrToCByteArray(CString str,CByteArray array);<BR>BOOL SaveDIBEx(HDIB hDib, CString lpFileName); <BR>//********************************************************************** <BR>// <BR>//&nbsp;&nbsp;dibutil.cpp ( stripped down version from WIN32CAP sample ) <BR>// <BR>//&nbsp;&nbsp;Source file for Device-Independent Bitmap (DIB) API. <BR>// <BR>//&nbsp;&nbsp;Written by Microsoft Product Support Services, Developer Support. <BR>//&nbsp;&nbsp;Copyright (C) 1991-1996 Microsoft Corporation. All rights reserved. <BR>//********************************************************************** <BR><BR>#include "stdafx.h" <BR>#include "dibutil.h" <BR><BR>/**************************************************************************** <BR> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* <BR> *&nbsp;&nbsp;FUNCTION&nbsp;&nbsp; : DibNumColors(VOID FAR * pv)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* <BR> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* <BR> *&nbsp;&nbsp;PURPOSE&nbsp;&nbsp;&nbsp;&nbsp;: Determines the number of colors in the DIB by looking at&nbsp;&nbsp; * <BR> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the BitCount filed in the info block.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* <BR> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* <BR> *&nbsp;&nbsp;RETURNS&nbsp;&nbsp;&nbsp;&nbsp;: The number of colors in the DIB.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * <BR> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* <BR> ****************************************************************************/ <BR>WORD DIBNumColors(VOID FAR * pv) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;INT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bits; <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPBITMAPINFOHEADER&nbsp;&nbsp;lpbi; <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPBITMAPCOREHEADER&nbsp;&nbsp;lpbc; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpbi = ((LPBITMAPINFOHEADER)pv); <BR>&nbsp;&nbsp;&nbsp;&nbsp;lpbc = ((LPBITMAPCOREHEADER)pv); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;With the BITMAPINFO format headers, the size of the palette <BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;is in biClrUsed, whereas in the BITMAPCORE - style headers, it <BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;is dependent on the bits per pixel ( = 2 raised to the power of <BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;bits/pixel). <BR>&nbsp;&nbsp;&nbsp;&nbsp; */ <BR>&nbsp;&nbsp;&nbsp;&nbsp;if (lpbi-&gt;biSize != sizeof(BITMAPCOREHEADER)){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (lpbi-&gt;biClrUsed != 0) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (WORD)lpbi-&gt;biClrUsed; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bits = lpbi-&gt;biBitCount; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bits = lpbc-&gt;bcBitCount; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;switch (bits){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 1: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 2; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 4: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 16; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 8: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 256; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>} <BR><BR>/************************************************************************* <BR> * <BR> * PaletteSize() <BR> * <BR> * Parameter: <BR> * <BR> * LPSTR lpDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- pointer to packed-DIB memory block <BR> * <BR> * Return Value: <BR> * <BR> * WORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - size of the color palette of the DIB <BR> * <BR> * Description: <BR> * <BR> * This function gets the size required to store the DIB's palette by <BR> * multiplying the number of colors by the size of an RGBQUAD (for a <BR> * Windows 3.0-style DIB) or by the size of an RGBTRIPLE (for an OS/2- <BR> * style DIB). <BR> * <BR> ************************************************************************/ <BR><BR>WORD PaletteSize(LPSTR lpDIB) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;// calculate the size required by the palette <BR>&nbsp;&nbsp;&nbsp;&nbsp;if (IS_WIN30_DIB (lpDIB)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (DIBNumColors(lpDIB) * sizeof(RGBQUAD)); <BR>&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (DIBNumColors(lpDIB) * sizeof(RGBTRIPLE)); <BR>} <BR><BR>/************************************************************************* <BR> * <BR> * CreateDIB() <BR> * <BR> * Parameters: <BR> * <BR> * DWORD dwWidth&nbsp;&nbsp;&nbsp;&nbsp;- Width for new bitmap, in pixels <BR> * DWORD dwHeight&nbsp;&nbsp; - Height for new bitmap&nbsp;&nbsp;<BR> * WORD&nbsp;&nbsp;wBitCount&nbsp;&nbsp;- Bit Count for new DIB (1, 4, 8, or 24) <BR> * <BR> * Return Value: <BR> * <BR> * HDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Handle to new DIB <BR> * <BR> * Description: <BR> * <BR> * This function allocates memory for and initializes a new DIB by <BR> * filling in the BITMAPINFOHEADER, allocating memory for the color <BR> * table, and allocating memory for the bitmap bits.&nbsp;&nbsp;As with all <BR> * HDIBs, the header, colortable and bits are all in one contiguous <BR> * memory block.&nbsp;&nbsp;This function is similar to the CreateBitmap()&nbsp;&nbsp;<BR> * Windows API. <BR> * <BR> * The colortable and bitmap bits are left uninitialized (zeroed) in the <BR> * returned HDIB. <BR> * <BR> * <BR> ************************************************************************/ <BR><BR>HDIB CreateDIB(DWORD dwWidth, DWORD dwHeight, WORD wBitCount) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;BITMAPINFOHEADER&nbsp;&nbsp;&nbsp;&nbsp;bi;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // bitmap header <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPBITMAPINFOHEADER&nbsp;&nbsp;lpbi;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // pointer to BITMAPINFOHEADER <BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwLen;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// size of memory block <BR>&nbsp;&nbsp;&nbsp;&nbsp;HDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hDIB; <BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwBytesPerLine; // Number of bytes per scanline <BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Make sure bits per pixel is valid <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (wBitCount &lt;= 1) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wBitCount = 1; <BR>&nbsp;&nbsp;&nbsp;&nbsp;else if (wBitCount &lt;= 4) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wBitCount = 4; <BR>&nbsp;&nbsp;&nbsp;&nbsp;else if (wBitCount &lt;= 8) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wBitCount = 8; <BR>&nbsp;&nbsp;&nbsp;&nbsp;else if (wBitCount &lt;= 24) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wBitCount = 24; <BR>&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wBitCount = 4;&nbsp;&nbsp;// set default value to 4 if parameter is bogus <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// initialize BITMAPINFOHEADER <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biSize = sizeof(BITMAPINFOHEADER); <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biWidth = dwWidth;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // fill in width from parameter <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biHeight = dwHeight;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // fill in height from parameter <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biPlanes = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// must be 1 <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biBitCount = wBitCount;&nbsp;&nbsp;&nbsp;&nbsp;// from parameter <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biCompression = BI_RGB;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biSizeImage = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 0's here mean "default" <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biXPelsPerMeter = 0; <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biYPelsPerMeter = 0; <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biClrUsed = 0; <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biClrImportant = 0; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// calculate size of memory block required to store the DIB.&nbsp;&nbsp;This <BR>&nbsp;&nbsp;&nbsp;&nbsp;// block should be big enough to hold the BITMAPINFOHEADER, the color <BR>&nbsp;&nbsp;&nbsp;&nbsp;// table, and the bits <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;dwBytesPerLine = WIDTHBYTES(wBitCount * dwWidth); <BR>&nbsp;&nbsp;&nbsp;&nbsp;dwLen = bi.biSize + PaletteSize((LPSTR)&bi) + (dwBytesPerLine * dwHeight); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// alloc memory block to store our bitmap <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;hDIB = GlobalAlloc(GHND, dwLen); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// major bummer if we couldn't get memory block <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!hDIB) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// lock memory and get pointer to it <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// use our bitmap info structure to fill in first part of <BR>&nbsp;&nbsp;&nbsp;&nbsp;// our DIB with the BITMAPINFOHEADER <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;*lpbi = bi; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Since we don't know what the colortable and bits should contain, <BR>&nbsp;&nbsp;&nbsp;&nbsp;// just leave these blank.&nbsp;&nbsp;Unlock the DIB and return the HDIB. <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hDIB); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//return handle to the DIB <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return hDIB; <BR>} <BR><BR><BR>/************************************************************************* <BR> * <BR> * FindDIBBits() <BR> * <BR> * Parameter: <BR> * <BR> * LPSTR lpDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- pointer to packed-DIB memory block <BR> * <BR> * Return Value: <BR> * <BR> * LPSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- pointer to the DIB bits <BR> * <BR> * Description: <BR> * <BR> * This function calculates the address of the DIB's bits and returns a <BR> * pointer to the DIB bits. <BR> * <BR> ************************************************************************/ <BR><BR>LPSTR FindDIBBits(LPSTR lpDIB) <BR>{ <BR>&nbsp;&nbsp; return (lpDIB + *(LPDWORD)lpDIB + PaletteSize(lpDIB)); <BR>} <BR><BR><BR>/************************************************************************* <BR> * <BR> * DIBWidth() <BR> * <BR> * Parameter: <BR> * <BR> * LPSTR lpDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- pointer to packed-DIB memory block <BR> * <BR> * Return Value: <BR> * <BR> * DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- width of the DIB <BR> * <BR> * Description: <BR> * <BR> * This function gets the width of the DIB from the BITMAPINFOHEADER <BR> * width field if it is a Windows 3.0-style DIB or from the BITMAPCOREHEADER <BR> * width field if it is an OS/2-style DIB. <BR> * <BR> ************************************************************************/ <BR><BR><BR>DWORD DIBWidth(LPSTR lpDIB) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPBITMAPINFOHEADER&nbsp;&nbsp; lpbmi;&nbsp;&nbsp;// pointer to a Win 3.0-style DIB <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPBITMAPCOREHEADER&nbsp;&nbsp; lpbmc;&nbsp;&nbsp;// pointer to an OS/2-style DIB <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// point to the header (whether Win 3.0 and OS/2) <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpbmi = (LPBITMAPINFOHEADER)lpDIB; <BR>&nbsp;&nbsp;&nbsp;&nbsp;lpbmc = (LPBITMAPCOREHEADER)lpDIB; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// return the DIB width if it is a Win 3.0 DIB <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (lpbmi-&gt;biSize == sizeof(BITMAPINFOHEADER)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return lpbmi-&gt;biWidth; <BR>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;// it is an OS/2 DIB, so return its width <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (DWORD)lpbmc-&gt;bcWidth; <BR>} <BR><BR><BR>/************************************************************************* <BR> * <BR> * DIBHeight() <BR> * <BR> * Parameter: <BR> * <BR> * LPSTR lpDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- pointer to packed-DIB memory block <BR> * <BR> * Return Value: <BR> * <BR> * DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- height of the DIB <BR> * <BR> * Description: <BR> * <BR> * This function gets the height of the DIB from the BITMAPINFOHEADER <BR> * height field if it is a Windows 3.0-style DIB or from the BITMAPCOREHEADER <BR> * height field if it is an OS/2-style DIB. <BR> * <BR> ************************************************************************/ <BR><BR>DWORD DIBHeight(LPSTR lpDIB) <BR>{ <BR>&nbsp;&nbsp; LPBITMAPINFOHEADER&nbsp;&nbsp; lpbmi;&nbsp;&nbsp;// pointer to a Win 3.0-style DIB <BR>&nbsp;&nbsp; LPBITMAPCOREHEADER&nbsp;&nbsp; lpbmc;&nbsp;&nbsp;// pointer to an OS/2-style DIB <BR><BR>&nbsp;&nbsp; // point to the header (whether OS/2 or Win 3.0 <BR><BR>&nbsp;&nbsp; lpbmi = (LPBITMAPINFOHEADER)lpDIB; <BR>&nbsp;&nbsp; lpbmc = (LPBITMAPCOREHEADER)lpDIB; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// return the DIB height if it is a Win 3.0 DIB <BR>&nbsp;&nbsp;&nbsp;&nbsp;if (lpbmi-&gt;biSize == sizeof(BITMAPINFOHEADER)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return lpbmi-&gt;biHeight; <BR>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;// it is an OS/2 DIB, so return its height <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (DWORD)lpbmc-&gt;bcHeight; <BR>} <BR><BR><BR>/************************************************************************* <BR> * <BR> * DIBNumColors() <BR> * <BR> * Parameter: <BR> * <BR> * LPSTR lpDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- pointer to packed-DIB memory block <BR> * <BR> * Return Value: <BR> * <BR> * WORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - number of colors in the color table <BR> * <BR> * Description: <BR> * <BR> * This function calculates the number of colors in the DIB's color table <BR> * by finding the bits per pixel for the DIB (whether Win3.0 or OS/2-style <BR> * DIB). If bits per pixel is 1: colors=2, if 4: colors=16, if 8: colors=256, <BR> * if 24, no colors in color table. <BR> * <BR> ************************************************************************/ <BR><BR>WORD DIBNumColors(LPSTR lpDIB) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;WORD wBitCount;&nbsp;&nbsp;// DIB bit count <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// If this is a Windows-style DIB, the number of colors in the <BR>&nbsp;&nbsp;&nbsp;&nbsp;// color table can be less than the number of bits per pixel <BR>&nbsp;&nbsp;&nbsp;&nbsp;// allows for (i.e. lpbi-&gt;biClrUsed can be set to some value). <BR>&nbsp;&nbsp;&nbsp;&nbsp;// If this is the case, return the appropriate value. <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (IS_WIN30_DIB(lpDIB)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwClrUsed; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwClrUsed = ((LPBITMAPINFOHEADER)lpDIB)-&gt;biClrUsed; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (dwClrUsed) <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (WORD)dwClrUsed; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Calculate the number of colors in the color table based on <BR>&nbsp;&nbsp;&nbsp;&nbsp;// the number of bits per pixel for the DIB. <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;if (IS_WIN30_DIB(lpDIB)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wBitCount = ((LPBITMAPINFOHEADER)lpDIB)-&gt;biBitCount; <BR>&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wBitCount = ((LPBITMAPCOREHEADER)lpDIB)-&gt;bcBitCount; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// return number of colors based on bits per pixel <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;switch (wBitCount) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 1: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 2; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 4: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 16; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 8: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 256; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>} <BR><BR><BR>/************************************************************************* <BR> * <BR> * CreateDIBPalette() <BR> * <BR> * Parameter: <BR> * <BR> * HDIB hDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- specifies the DIB <BR> * <BR> * Return Value: <BR> * <BR> * HPALETTE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - specifies the palette <BR> * <BR> * Description: <BR> * <BR> * This function creates a palette from a DIB by allocating memory for the <BR> * logical palette, reading and storing the colors from the DIB's color table <BR> * into the logical palette, creating a palette from this logical palette, <BR> * and then returning the palette's handle. This allows the DIB to be <BR> * displayed using the best possible colors (important for DIBs with 256 or <BR> * more colors). <BR> * <BR> ************************************************************************/ <BR><BR>HPALETTE CreateDIBPalette(HDIB hDIB) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPLOGPALETTE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPal;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// pointer to a logical palette <BR>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hLogPal = NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// handle to a logical palette <BR>&nbsp;&nbsp;&nbsp;&nbsp;HPALETTE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hPal = NULL;&nbsp;&nbsp;&nbsp;&nbsp;// handle to a palette <BR>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i, wNumColors;&nbsp;&nbsp;// loop index, number of colors in color table <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpbi;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // pointer to packed-DIB <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPBITMAPINFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpbmi;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// pointer to BITMAPINFO structure (Win3.0) <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPBITMAPCOREINFO&nbsp;&nbsp;&nbsp;&nbsp;lpbmc;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// pointer to BITMAPCOREINFO structure (OS/2) <BR>&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bWinStyleDIB;&nbsp;&nbsp; // Win3.0 DIB? <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// if handle to DIB is invalid, return NULL <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!hDIB) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// lock DIB memory block and get a pointer to it <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpbi = (char*) GlobalLock(hDIB); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// get pointer to BITMAPINFO (Win 3.0) <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpbmi = (LPBITMAPINFO)lpbi; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// get pointer to BITMAPCOREINFO (OS/2 1.x) <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpbmc = (LPBITMAPCOREINFO)lpbi; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// get the number of colors in the DIB&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;wNumColors = DIBNumColors(lpbi); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// is this a Win 3.0 DIB? <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;bWinStyleDIB = IS_WIN30_DIB(lpbi); <BR>&nbsp;&nbsp;&nbsp;&nbsp;if (wNumColors) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// allocate memory block for logical palette <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hLogPal = GlobalAlloc(GHND, sizeof(LOGPALETTE) + <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizeof(PALETTEENTRY) * wNumColors); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// if not enough memory, clean up and return NULL <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!hLogPal) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hDIB); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// lock memory block and get pointer to it <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPal = (LPLOGPALETTE)GlobalLock(hLogPal); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// set version and number of palette entries <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPal-&gt;palVersion = PALVERSION; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPal-&gt;palNumEntries = wNumColors; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// store RGB triples (if Win 3.0 DIB) or RGB quads (if OS/2 DIB) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// into palette <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i = 0; i &lt; wNumColors; i++) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (bWinStyleDIB) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPal-&gt;palPalEntry[i].peRed = lpbmi-&gt;bmiColors[i].rgbRed; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPal-&gt;palPalEntry[i].peGreen = lpbmi-&gt;bmiColors[i].rgbGreen; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPal-&gt;palPalEntry[i].peBlue = lpbmi-&gt;bmiColors[i].rgbBlue; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPal-&gt;palPalEntry[i].peFlags = 0; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPal-&gt;palPalEntry[i].peRed = lpbmc-&gt;bmciColors[i].rgbtRed; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPal-&gt;palPalEntry[i].peGreen = lpbmc-&gt;bmciColors[i].rgbtGreen; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPal-&gt;palPalEntry[i].peBlue = lpbmc-&gt;bmciColors[i].rgbtBlue; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpPal-&gt;palPalEntry[i].peFlags = 0; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// create the palette and get handle to it <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hPal = CreatePalette(lpPal); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// if error getting handle to palette, clean up and return NULL <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!hPal) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hLogPal); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalFree(hLogPal); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// clean up&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hLogPal); <BR>&nbsp;&nbsp;&nbsp;&nbsp;GlobalFree(hLogPal); <BR>&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hDIB); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// return handle to DIB's palette <BR>&nbsp;&nbsp;&nbsp;&nbsp;return hPal; <BR>} <BR><BR>/************************************************************************* <BR> * <BR> * DIBToBitmap() <BR> * <BR> * Parameters: <BR> * <BR> * HDIB hDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- specifies the DIB to convert <BR> * <BR> * HPALETTE hPal&nbsp;&nbsp;&nbsp;&nbsp;- specifies the palette to use with the bitmap <BR> * <BR> * Return Value: <BR> * <BR> * HBITMAP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- identifies the device-dependent bitmap <BR> * <BR> * Description: <BR> * <BR> * This function creates a bitmap from a DIB using the specified palette. <BR> * If no palette is specified, default is used. <BR> * <BR> * NOTE: <BR> * <BR> * The bitmap returned from this funciton is always a bitmap compatible <BR> * with the screen (e.g. same bits/pixel and color planes) rather than <BR> * a bitmap with the same attributes as the DIB.&nbsp;&nbsp;This behavior is by <BR> * design, and occurs because this function calls CreateDIBitmap to <BR> * do its work, and CreateDIBitmap always creates a bitmap compatible <BR> * with the hDC parameter passed in (because it in turn calls <BR> * CreateCompatibleBitmap). <BR> * <BR> * So for instance, if your DIB is a monochrome DIB and you call this <BR> * function, you will not get back a monochrome HBITMAP -- you will <BR> * get an HBITMAP compatible with the screen DC, but with only 2 <BR> * colors used in the bitmap. <BR> * <BR> * If your application requires a monochrome HBITMAP returned for a <BR> * monochrome DIB, use the function SetDIBits(). <BR> * <BR> * Also, the DIBpassed in to the function is not destroyed on exit. This <BR> * must be done later, once it is no longer needed. <BR> * <BR> ************************************************************************/ <BR><BR>HBITMAP DIBToBitmap(HDIB hDIB, HPALETTE hPal) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpDIBHdr, lpDIBBits;&nbsp;&nbsp;// pointer to DIB header, pointer to DIB bits <BR>&nbsp;&nbsp;&nbsp;&nbsp;HBITMAP&nbsp;&nbsp;&nbsp;&nbsp; hBitmap;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// handle to device-dependent bitmap <BR>&nbsp;&nbsp;&nbsp;&nbsp;HDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hDC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// handle to DC <BR>&nbsp;&nbsp;&nbsp;&nbsp;HPALETTE&nbsp;&nbsp;&nbsp;&nbsp;hOldPal = NULL;&nbsp;&nbsp;&nbsp;&nbsp;// handle to a palette <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// if invalid handle, return NULL&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!hDIB) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// lock memory block and get a pointer to it <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpDIBHdr = (char*) GlobalLock(hDIB); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// get a pointer to the DIB bits <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpDIBBits = FindDIBBits(lpDIBHdr); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// get a DC&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;hDC = GetDC(NULL); <BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!hDC) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// clean up and return NULL <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hDIB); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// select and realize palette <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (hPal) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hOldPal = SelectPalette(hDC, hPal, FALSE); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;RealizePalette(hDC); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// create bitmap from DIB info. and bits <BR>&nbsp;&nbsp;&nbsp;&nbsp;hBitmap = CreateDIBitmap(hDC, (LPBITMAPINFOHEADER)lpDIBHdr, CBM_INIT, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpDIBBits, (LPBITMAPINFO)lpDIBHdr, DIB_RGB_COLORS); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// restore previous palette <BR>&nbsp;&nbsp;&nbsp;&nbsp;if (hOldPal) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectPalette(hDC, hOldPal, FALSE); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// clean up <BR>&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(NULL, hDC); <BR>&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hDIB); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// return handle to the bitmap <BR>&nbsp;&nbsp;&nbsp;&nbsp;return hBitmap; <BR>} <BR><BR><BR>/************************************************************************* <BR> * <BR> * BitmapToDIB() <BR> * <BR> * Parameters: <BR> * <BR> * HBITMAP hBitmap&nbsp;&nbsp;- specifies the bitmap to convert <BR> * <BR> * HPALETTE hPal&nbsp;&nbsp;&nbsp;&nbsp;- specifies the palette to use with the bitmap <BR> * <BR> * Return Value: <BR> * <BR> * HDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - identifies the device-dependent bitmap <BR> * <BR> * Description: <BR> * <BR> * This function creates a DIB from a bitmap using the specified palette. <BR> * <BR> ************************************************************************/ <BR><BR>HDIB BitmapToDIB(HBITMAP hBitmap, HPALETTE hPal) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;BITMAP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bm;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // bitmap structure <BR>&nbsp;&nbsp;&nbsp;&nbsp;BITMAPINFOHEADER&nbsp;&nbsp;&nbsp;&nbsp;bi;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // bitmap header <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPBITMAPINFOHEADER&nbsp;&nbsp;lpbi;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // pointer to BITMAPINFOHEADER <BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwLen;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// size of memory block <BR>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hDIB, h;&nbsp;&nbsp;&nbsp;&nbsp;// handle to DIB, temp handle <BR>&nbsp;&nbsp;&nbsp;&nbsp;HDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hDC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// handle to DC <BR>&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;biBits;&nbsp;&nbsp;&nbsp;&nbsp; // bits per pixel <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// check if bitmap handle is valid <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!hBitmap) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// fill in BITMAP structure, return NULL if it didn't work <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!GetObject(hBitmap, sizeof(bm), (LPSTR)&bm)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// if no palette is specified, use default palette <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (hPal == NULL) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// calculate bits per pixel <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;biBits = bm.bmPlanes * bm.bmBitsPixel; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// make sure bits per pixel is valid <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (biBits &lt;= 1) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;biBits = 1; <BR>&nbsp;&nbsp;&nbsp;&nbsp;else if (biBits &lt;= 4) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;biBits = 4; <BR>&nbsp;&nbsp;&nbsp;&nbsp;else if (biBits &lt;= 8) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;biBits = 8; <BR>&nbsp;&nbsp;&nbsp;&nbsp;else // if greater than 8-bit, force to 24-bit <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;biBits = 24; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// initialize BITMAPINFOHEADER <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biSize = sizeof(BITMAPINFOHEADER); <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biWidth = bm.bmWidth; <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biHeight = bm.bmHeight; <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biPlanes = 1; <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biBitCount = biBits; <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biCompression = BI_RGB; <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biSizeImage = 0; <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biXPelsPerMeter = 0; <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biYPelsPerMeter = 0; <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biClrUsed = 0; <BR>&nbsp;&nbsp;&nbsp;&nbsp;bi.biClrImportant = 0; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// calculate size of memory block required to store BITMAPINFO <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;dwLen = bi.biSize + PaletteSize((LPSTR)&bi); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// get a DC <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;hDC = GetDC(NULL); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// select and realize our palette <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;hPal = SelectPalette(hDC, hPal, FALSE); <BR>&nbsp;&nbsp;&nbsp;&nbsp;RealizePalette(hDC); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// alloc memory block to store our bitmap <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;hDIB = GlobalAlloc(GHND, dwLen); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// if we couldn't get memory block <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!hDIB) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// clean up and return NULL <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectPalette(hDC, hPal, TRUE); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RealizePalette(hDC); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(NULL, hDC); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// lock memory and get pointer to it <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;/// use our bitmap info. to fill BITMAPINFOHEADER <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;*lpbi = bi; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// call GetDIBits with a NULL lpBits param, so it will calculate the <BR>&nbsp;&nbsp;&nbsp;&nbsp;// biSizeImage field for us&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;GetDIBits(hDC, hBitmap, 0, (UINT)bi.biHeight, NULL, (LPBITMAPINFO)lpbi, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIB_RGB_COLORS); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// get the info. returned by GetDIBits and unlock memory block <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;bi = *lpbi; <BR>&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hDIB); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// if the driver did not fill in the biSizeImage field, make one up&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (bi.biSizeImage == 0) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bi.biSizeImage = WIDTHBYTES((DWORD)bm.bmWidth * biBits) * bm.bmHeight; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// realloc the buffer big enough to hold all the bits <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;dwLen = bi.biSize + PaletteSize((LPSTR)&bi) + bi.biSizeImage; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (h = GlobalReAlloc(hDIB, dwLen, 0)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hDIB = h; <BR>&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// clean up and return NULL <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalFree(hDIB); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hDIB = NULL; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectPalette(hDC, hPal, TRUE); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RealizePalette(hDC); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(NULL, hDC); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// lock memory block and get pointer to it */ <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// call GetDIBits with a NON-NULL lpBits param, and actualy get the <BR>&nbsp;&nbsp;&nbsp;&nbsp;// bits this time <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (GetDIBits(hDC, hBitmap, 0, (UINT)bi.biHeight, (LPSTR)lpbi + <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(WORD)lpbi-&gt;biSize + PaletteSize((LPSTR)lpbi), (LPBITMAPINFO)lpbi, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIB_RGB_COLORS) == 0) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// clean up and return NULL <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hDIB); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hDIB = NULL; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectPalette(hDC, hPal, TRUE); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RealizePalette(hDC); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(NULL, hDC); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;bi = *lpbi; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// clean up&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hDIB); <BR>&nbsp;&nbsp;&nbsp;&nbsp;SelectPalette(hDC, hPal, TRUE); <BR>&nbsp;&nbsp;&nbsp;&nbsp;RealizePalette(hDC); <BR>&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(NULL, hDC); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// return handle to the DIB <BR>&nbsp;&nbsp;&nbsp;&nbsp;return hDIB; <BR>} <BR><BR><BR>/************************************************************************* <BR> * <BR> * PalEntriesOnDevice() <BR> * <BR> * Parameter: <BR> * <BR> * HDC hDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- device context <BR> * <BR> * Return Value: <BR> * <BR> * int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- number of palette entries on device <BR> * <BR> * Description: <BR> * <BR> * This function gets the number of palette entries on the specified device <BR> * <BR> ************************************************************************/ <BR><BR>int PalEntriesOnDevice(HDC hDC) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;int nColors;&nbsp;&nbsp;// number of colors <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Find out the number of colors on this device. <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;nColors = (1 &lt;&lt; (GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES))); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(nColors); <BR>&nbsp;&nbsp;&nbsp;&nbsp;return nColors; <BR>} <BR><BR><BR>/************************************************************************* <BR> * <BR> * GetSystemPalette() <BR> * <BR> * Parameters: <BR> * <BR> * None <BR> * <BR> * Return Value: <BR> * <BR> * HPALETTE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - handle to a copy of the current system palette <BR> * <BR> * Description: <BR> * <BR> * This function returns a handle to a palette which represents the system <BR> * palette.&nbsp;&nbsp;The system RGB values are copied into our logical palette using <BR> * the GetSystemPaletteEntries function.&nbsp;&nbsp; <BR> * <BR> ************************************************************************/ <BR><BR>HPALETTE GetSystemPalette(void) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;HDC hDC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// handle to a DC <BR>&nbsp;&nbsp;&nbsp;&nbsp;static HPALETTE hPal = NULL;&nbsp;&nbsp; // handle to a palette <BR>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE hLogPal;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // handle to a logical palette <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPLOGPALETTE lpLogPal;&nbsp;&nbsp;// pointer to a logical palette <BR>&nbsp;&nbsp;&nbsp;&nbsp;int nColors;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// number of colors <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Find out how many palette entries we want. <BR><BR>&nbsp;&nbsp; hDC = GetDC(NULL); <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!hDC) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;nColors = PalEntriesOnDevice(hDC);&nbsp;&nbsp; // Number of palette entries <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Allocate room for the palette and lock it. <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;hLogPal = GlobalAlloc(GHND, sizeof(LOGPALETTE) + nColors * <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizeof(PALETTEENTRY)); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// if we didn't get a logical palette, return NULL <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!hLogPal) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// get a pointer to the logical palette <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpLogPal = (LPLOGPALETTE)GlobalLock(hLogPal); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// set some important fields <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpLogPal-&gt;palVersion = PALVERSION; <BR>&nbsp;&nbsp;&nbsp;&nbsp;lpLogPal-&gt;palNumEntries = nColors; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Copy the current system palette into our logical palette <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;GetSystemPaletteEntries(hDC, 0, nColors, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(LPPALETTEENTRY)(lpLogPal-&gt;palPalEntry)); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Go ahead and create the palette.&nbsp;&nbsp;Once it's created, <BR>&nbsp;&nbsp;&nbsp;&nbsp;// we no longer need the LOGPALETTE, so free it.&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;hPal = CreatePalette(lpLogPal); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// clean up <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hLogPal); <BR>&nbsp;&nbsp;&nbsp;&nbsp;GlobalFree(hLogPal); <BR>&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(NULL, hDC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return hPal; <BR>} <BR><BR><BR>/************************************************************************* <BR> * <BR> * AllocRoomForDIB() <BR> * <BR> * Parameters: <BR> * <BR> * BITMAPINFOHEADER - bitmap info header stucture <BR> * <BR> * HBITMAP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- handle to the bitmap <BR> * <BR> * Return Value: <BR> * <BR> * HDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - handle to memory block <BR> * <BR> * Description: <BR> * <BR> *&nbsp;&nbsp;This routine takes a BITMAPINOHEADER, and returns a handle to global <BR> *&nbsp;&nbsp;memory which can contain a DIB with that header.&nbsp;&nbsp;It also initializes <BR> *&nbsp;&nbsp;the header portion of the global memory.&nbsp;&nbsp;GetDIBits() is used to determine <BR> *&nbsp;&nbsp;the amount of room for the DIB's bits.&nbsp;&nbsp;The total amount of memory <BR> *&nbsp;&nbsp;needed = sizeof(BITMAPINFOHEADER) + size of color table + size of bits. <BR> * <BR> ************************************************************************/ <BR><BR>HANDLE AllocRoomForDIB(BITMAPINFOHEADER bi, HBITMAP hBitmap) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwLen; <BR>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hDIB; <BR>&nbsp;&nbsp;&nbsp;&nbsp;HDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hDC; <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPBITMAPINFOHEADER&nbsp;&nbsp;lpbi; <BR>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hTemp; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Figure out the size needed to hold the BITMAPINFO structure <BR>&nbsp;&nbsp;&nbsp;&nbsp;// (which includes the BITMAPINFOHEADER and the color table). <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;dwLen = bi.biSize + PaletteSize((LPSTR) &bi); <BR>&nbsp;&nbsp;&nbsp;&nbsp;hDIB&nbsp;&nbsp;= GlobalAlloc(GHND,dwLen); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Check that DIB handle is valid <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!hDIB) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Set up the BITMAPINFOHEADER in the newly allocated global memory, <BR>&nbsp;&nbsp;&nbsp;&nbsp;// then call GetDIBits() with lpBits = NULL to have it fill in the <BR>&nbsp;&nbsp;&nbsp;&nbsp;// biSizeImage field for us. <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpbi&nbsp;&nbsp;= (LPBITMAPINFOHEADER)GlobalLock(hDIB); <BR>&nbsp;&nbsp;&nbsp;&nbsp;*lpbi = bi; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;hDC&nbsp;&nbsp; = GetDC(NULL); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;GetDIBits(hDC, hBitmap, 0, (UINT) bi.biHeight, NULL, (LPBITMAPINFO)lpbi, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIB_RGB_COLORS); <BR>&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(NULL, hDC); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// If the driver did not fill in the biSizeImage field, <BR>&nbsp;&nbsp;&nbsp;&nbsp;// fill it in -- NOTE: this is a bug in the driver! <BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;if (lpbi-&gt;biSizeImage == 0) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpbi-&gt;biSizeImage = WIDTHBYTES((DWORD)lpbi-&gt;biWidth * <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpbi-&gt;biBitCount) * lpbi-&gt;biHeight; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Get the size of the memory block we need <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;dwLen = lpbi-&gt;biSize + PaletteSize((LPSTR) &bi) + lpbi-&gt;biSizeImage; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Unlock the memory block <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hDIB); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// ReAlloc the buffer big enough to hold all the bits&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (hTemp = GlobalReAlloc(hDIB,dwLen,0)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return hTemp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Else free memory block and return failure <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalFree(hDIB); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>} <BR><BR><BR>/************************************************************************* <BR> * <BR> * ChangeDIBFormat() <BR> * <BR> * Parameter: <BR> * <BR> * HDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - handle to packed-DIB in memory <BR> * <BR> * WORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - desired bits per pixel <BR> * <BR> * DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- desired compression format <BR> * <BR> * Return Value: <BR> * <BR> * HDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - handle to the new DIB if successful, else NULL <BR> * <BR> * Description: <BR> * <BR> * This function will convert the bits per pixel and/or the compression <BR> * format of the specified DIB. Note: If the conversion was unsuccessful, <BR> * we return NULL. The original DIB is left alone. Don't use code like the <BR> * following: <BR> * <BR> *&nbsp;&nbsp;&nbsp;&nbsp;hMyDIB = ChangeDIBFormat(hMyDIB, 8, BI_RLE4); <BR> * <BR> * The conversion will fail, but hMyDIB will now be NULL and the original <BR> * DIB will now hang around in memory. We could have returned the old <BR> * DIB, but we wanted to allow the programmer to check whether this <BR> * conversion succeeded or failed. <BR> * <BR> ************************************************************************/ <BR><BR>HDIB ChangeDIBFormat(HDIB hDIB, WORD wBitCount, DWORD dwCompression) <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;HDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hDC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Handle to DC <BR>&nbsp;&nbsp;&nbsp;&nbsp;HBITMAP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hBitmap;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Handle to bitmap <BR>&nbsp;&nbsp;&nbsp;&nbsp;BITMAP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bitmap;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// BITMAP data structure <BR>&nbsp;&nbsp;&nbsp;&nbsp;BITMAPINFOHEADER&nbsp;&nbsp; bi;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Bitmap info header <BR>&nbsp;&nbsp;&nbsp;&nbsp;LPBITMAPINFOHEADER lpbi;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Pointer to bitmap info <BR>&nbsp;&nbsp;&nbsp;&nbsp;HDIB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hNewDIB = NULL;&nbsp;&nbsp;// Handle to new DIB <BR>&nbsp;&nbsp;&nbsp;&nbsp;HPALETTE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hPal, hOldPal;&nbsp;&nbsp; // Handle to palette, prev pal <BR>&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DIBBPP, NewBPP;&nbsp;&nbsp;// DIB bits per pixel, new bpp <BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIBComp, NewComp;// DIB compression, new compression <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Check for a valid DIB handle <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!hDIB) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Get the old DIB's bits per pixel and compression format <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB); <BR>&nbsp;&nbsp;&nbsp;&nbsp;DIBBPP = ((LPBITMAPINFOHEADER)lpbi)-&gt;biBitCount; <BR>&nbsp;&nbsp;&nbsp;&nbsp;DIBComp = ((LPBITMAPINFOHEADER)lpbi)-&gt;biCompression; <BR>&nbsp;&nbsp;&nbsp;&nbsp;GlobalUnlock(hDIB); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Validate wBitCount and dwCompression <BR>&nbsp;&nbsp;&nbsp;&nbsp;// They must match correctly (i.e., BI_RLE4 and 4 BPP or <BR>&nbsp;&nbsp;&nbsp;&nbsp;// BI_RLE8 and 8BPP, etc.) or we return failure <BR>&nbsp;&nbsp;&nbsp;&nbsp;if (wBitCount == 0) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewBPP = DIBBPP; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((dwCompression == BI_RLE4 && NewBPP == 4) || <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(dwCompression == BI_RLE8 && NewBPP == 8) || <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(dwCompression == BI_RGB)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewComp = dwCompression; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;else if (wBitCount == 1 && dwCompression == BI_RGB) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewBPP = wBitCount; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewComp = BI_RGB; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;else if (wBitCount == 4) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewBPP = wBitCount; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (dwCompression == BI_RGB || dwCompression == BI_RLE4) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewComp = dwCompression; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;else if (wBitCount == 8) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewBPP = wBitCount; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (dwCompression == BI_RGB || dwCompression == BI_RLE8) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewComp = dwCompression; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;else if (wBitCount == 24 && dwCompression == BI_RGB) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewBPP = wBitCount; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewComp = BI_RGB; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Save the old DIB's palette <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;hPal = CreateDIBPalette(hDIB); <BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!hPal) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;// Convert old DIB to a bitmap <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;hBitmap = DIBToBitmap(hDIB, hPal); <BR>&nbsp;&nbsp;&nbsp;&nbsp;if (!hBitmap) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(hPal); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL; <BR>&nbsp;&nbsp;&nbsp;&nb

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -