home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / icon / icon.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-02-16  |  56.1 KB  |  1,601 lines

  1. /* ====================================================== */
  2. /*                         ICON.C                         */
  3. /*     Routinen zum Laden, Speichern und Bearbeiten       */
  4. /*           von Windows- und OS2-Icon-Dateien            */
  5. /*                                                        */
  6. /*          (C) 1993 Kay Glahn & DMV-Verlag               */
  7. /* ====================================================== */
  8.  
  9. #include <windows.h>
  10. #include "ICOCON.h"
  11.  
  12.  
  13. int                      Mode;
  14.  
  15. extern char              str[255];
  16.  
  17. extern int               i,
  18.                          CurrIcon;
  19.  
  20. extern HANDLE            hInst;
  21.  
  22.  
  23. RetrieveIcon(lphXORBitmap,lphANDBitmap,lphPal,BegPos,hFile,hWnd)
  24. HBITMAP FAR *lphXORBitmap;
  25. HBITMAP FAR *lphANDBitmap;
  26. HPALETTE FAR *lphPal;
  27. DWORD BegPos;
  28. int hFile;
  29. HWND hWnd;
  30. {
  31.   HDC hDC;
  32.   DWORD Size;
  33.   DWORD Groesse;
  34.   DWORD Size1;
  35.   DWORD OverBound;
  36.   WORD PalEntrys;
  37.   BITMAPINFO Bitmapinfo;
  38.   LPBITMAPINFO lpBitmapinfo;
  39.   LPSTR lpMem;
  40.   HANDLE hBitmapinfoMem;
  41.   HANDLE hMem;
  42.   int count;
  43.   int i;
  44.   RGBQUAD FAR *pRgb;
  45.   LOGPALETTE *pPal;
  46.   WORD FAR *pw;
  47.  
  48.   _llseek(hFile,BegPos,0);
  49.   count = _lread(hFile,(LPSTR)&Bitmapinfo.bmiHeader,sizeof(BITMAPINFOHEADER));
  50.   Bitmapinfo.bmiHeader.biHeight/=2;
  51.   PalEntrys = Bitmapinfo.bmiHeader.biClrUsed;
  52.  
  53.   if(PalEntrys == 0)
  54.   {
  55.     switch(Bitmapinfo.bmiHeader.biBitCount)
  56.     {
  57.       case 1:
  58.         PalEntrys = 2;
  59.         break;
  60.       case 4:
  61.         PalEntrys = 16;
  62.         break;
  63.       case 8:
  64.         PalEntrys = 256;
  65.         break;
  66.     }
  67.   }
  68.  
  69.   if ((PalEntrys!=2)&&(PalEntrys!=16)&&(PalEntrys!=256))
  70.   {
  71.     MessageBox(hWnd, "Die gewΣhlte Datei ist keine gⁿltige Icon-Datei, Ladevorgang wird abgebrochen !" ,NULL,MB_OK|MB_ICONHAND);
  72.     return(FALSE);
  73.   }
  74.  
  75.   Groesse = sizeof(BITMAPINFOHEADER)+PalEntrys*sizeof(RGBQUAD);
  76.   Size = Bitmapinfo.bmiHeader.biWidth*Bitmapinfo.bmiHeader.biHeight*Bitmapinfo.bmiHeader.biBitCount/8;
  77.  
  78.   if ((hBitmapinfoMem = GlobalAlloc(GMEM_MOVEABLE,Groesse)) != NULL)
  79.   {
  80.     if ((hMem = GlobalAlloc(GMEM_MOVEABLE,Size)) != NULL)
  81.     {
  82.       if((lpBitmapinfo = (LPBITMAPINFO)GlobalLock(hBitmapinfoMem)) != NULL)
  83.       {
  84.         if((lpMem = GlobalLock(hMem)) != (LPSTR) NULL)
  85.         {
  86.           _llseek(hFile,BegPos,0);
  87.           count = _lread(hFile,(LPSTR)lpBitmapinfo,(WORD)Groesse);
  88.           _llseek(hFile,BegPos+count,0);
  89.           count= _lread(hFile,(LPSTR)lpMem, (WORD)Size);
  90.  
  91.           hDC = GetDC(NULL);
  92.  
  93.           lpBitmapinfo->bmiHeader.biHeight /=2;
  94.           pRgb = (RGBQUAD FAR *)((LPSTR)lpBitmapinfo->bmiColors);
  95.           pPal = (LOGPALETTE*)LocalAlloc(LPTR,sizeof(LOGPALETTE) + PalEntrys * sizeof(PALETTEENTRY));
  96.  
  97.           if (!pPal)
  98.             return FALSE;
  99.  
  100.           pPal->palNumEntries = PalEntrys;
  101.           pPal->palVersion    = 0x300;
  102.  
  103.           for (i = 0; i < PalEntrys; i++)
  104.           {
  105.             pPal->palPalEntry[i].peRed   = pRgb[i].rgbRed;
  106.             pPal->palPalEntry[i].peGreen = pRgb[i].rgbGreen;
  107.             pPal->palPalEntry[i].peBlue  = pRgb[i].rgbBlue;
  108.             pPal->palPalEntry[i].peFlags = (BYTE)0;
  109.           }
  110.  
  111.           *lphPal = CreatePalette(pPal);
  112.           LocalFree((HANDLE)pPal);
  113.           pw = (WORD FAR *)((LPSTR)lpBitmapinfo->bmiColors);
  114.  
  115.           for (i=0; i<(int)lpBitmapinfo->bmiHeader.biClrUsed; i++)
  116.             *pw++ = (WORD)i;
  117.  
  118.           if (*lphPal)
  119.           {
  120.             SelectPalette(hDC,*lphPal,FALSE);
  121.             RealizePalette(hDC);
  122.           }
  123.  
  124.           *lphXORBitmap=CreateDIBitmap(hDC,(LPBITMAPINFOHEADER)&(lpBitmapinfo->bmiHeader),CBM_INIT,(LPSTR)lpMem,(LPBITMAPINFO)lpBitmapinfo,DIB_RGB_COLORS);
  125.           ReleaseDC(NULL,hDC);
  126.           GlobalUnlock(hMem);
  127.           GlobalFree(hMem);
  128.           GlobalUnlock(hBitmapinfoMem);
  129.           GlobalFree(hBitmapinfoMem);
  130.           if (*lphXORBitmap)
  131.           {
  132.             Size1=Bitmapinfo.bmiHeader.biWidth*Bitmapinfo.bmiHeader.biHeight/8;
  133.             OverBound=(Bitmapinfo.bmiHeader.biWidth/8)%sizeof(LONG);
  134.             if(OverBound) Size1+=(sizeof(LONG)-OverBound)*Bitmapinfo.bmiHeader.biHeight;
  135.  
  136.             if ((hMem = GlobalAlloc(GMEM_MOVEABLE,Size1)) != NULL)
  137.             {
  138.               if ((hBitmapinfoMem = GlobalAlloc(GMEM_MOVEABLE,sizeof(BITMAPINFOHEADER)+2*sizeof(RGBQUAD))) != NULL)
  139.               {
  140.                 if((lpMem = GlobalLock(hMem)) != (LPSTR) NULL)
  141.                 {
  142.                   if((lpBitmapinfo = (LPBITMAPINFO)GlobalLock(hBitmapinfoMem)) != NULL)
  143.                   {
  144.                     lpBitmapinfo->bmiHeader.biSize=(long)sizeof(BITMAPINFOHEADER);
  145.                     lpBitmapinfo->bmiHeader.biWidth=Bitmapinfo.bmiHeader.biWidth;
  146.                     lpBitmapinfo->bmiHeader.biHeight=Bitmapinfo.bmiHeader.biHeight;
  147.                     lpBitmapinfo->bmiHeader.biPlanes=1;
  148.                     lpBitmapinfo->bmiHeader.biBitCount=1;
  149.                     lpBitmapinfo->bmiHeader.biCompression=0L;
  150.                     lpBitmapinfo->bmiHeader.biSizeImage=0L;
  151.                     lpBitmapinfo->bmiHeader.biXPelsPerMeter=0L;
  152.                     lpBitmapinfo->bmiHeader.biYPelsPerMeter=0L;
  153.                     lpBitmapinfo->bmiHeader.biClrUsed=0L;
  154.                     lpBitmapinfo->bmiHeader.biClrImportant=0L;
  155.                     lpBitmapinfo->bmiColors[0].rgbRed=0;
  156.                     lpBitmapinfo->bmiColors[0].rgbGreen=0;
  157.                     lpBitmapinfo->bmiColors[0].rgbBlue=0;
  158.                     lpBitmapinfo->bmiColors[1].rgbRed=0xff;
  159.                     lpBitmapinfo->bmiColors[1].rgbGreen=0xff;
  160.                     lpBitmapinfo->bmiColors[1].rgbBlue=0xff;
  161.  
  162.                     hDC=GetDC(NULL);
  163.  
  164.                     _llseek(hFile,BegPos+Groesse+Size,0);
  165.                     count=_lread(hFile,(LPSTR)lpMem,(WORD)Size1);
  166.  
  167.                     *lphANDBitmap = CreateDIBitmap(hDC,(LPBITMAPINFOHEADER)&(lpBitmapinfo->bmiHeader),CBM_INIT,(LPSTR)lpMem,(LPBITMAPINFO)lpBitmapinfo, DIB_RGB_COLORS);
  168.                     ReleaseDC(NULL,hDC);
  169.                     GlobalUnlock(hBitmapinfoMem);
  170.                     GlobalUnlock(hMem);
  171.                     GlobalFree(hBitmapinfoMem);
  172.                     GlobalFree(hMem);
  173.                   }
  174.                 }
  175.               }
  176.             }
  177.           }
  178.           else
  179.           {
  180.             MessageBox(hWnd, "Bitmap konnte nicht erstellt werden !" ,NULL,MB_OK|MB_ICONHAND);
  181.             return FALSE;
  182.           }
  183.         }
  184.       }
  185.     }
  186.   }
  187.   return TRUE;
  188. }
  189.  
  190. DWORD SaveIcon(hXORBitmap, hANDBitmap, hPal, BegPos, hFile, hWnd, BitPix)
  191. HBITMAP hXORBitmap;
  192. HBITMAP hANDBitmap;
  193. HPALETTE hPal;
  194. DWORD BegPos;
  195. WORD hFile;
  196. HWND hWnd;
  197. WORD BitPix;
  198. {
  199.  
  200.   HDC hDC;
  201.   DWORD Size;
  202.   DWORD Groesse;
  203.   DWORD Size1;
  204.   LPBITMAPINFO lpBitmapinfo;
  205.   LPSTR lpMem;
  206.   HANDLE hBitmapinfoMem;
  207.   HANDLE hMem;
  208.   int count;
  209.   WORD PalEntrys;
  210.   BITMAP Bitmap;
  211.   DWORD OverBound;
  212.  
  213.   GetObject(hXORBitmap,sizeof(BITMAP),(LPSTR)&Bitmap);
  214.   GetObject(hPal,2,(LPSTR)&PalEntrys);
  215.   Groesse = sizeof(BITMAPINFOHEADER)+PalEntrys*sizeof(RGBQUAD);
  216.  
  217.   if ((hBitmapinfoMem = GlobalAlloc(GMEM_MOVEABLE,Groesse)) != NULL)
  218.   {
  219.     if((lpBitmapinfo = (LPBITMAPINFO)GlobalLock(hBitmapinfoMem)) != NULL)
  220.     {
  221.       lpBitmapinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  222.       lpBitmapinfo->bmiHeader.biWidth = Bitmap.bmWidth;
  223.       lpBitmapinfo->bmiHeader.biHeight = Bitmap.bmHeight;
  224.       lpBitmapinfo->bmiHeader.biPlanes = 1;
  225.       lpBitmapinfo->bmiHeader.biBitCount = BitPix;
  226.       lpBitmapinfo->bmiHeader.biCompression = 0;
  227.       lpBitmapinfo->bmiHeader.biSizeImage = 0;
  228.       lpBitmapinfo->bmiHeader.biXPelsPerMeter = 0;
  229.       lpBitmapinfo->bmiHeader.biYPelsPerMeter = 0;
  230.       lpBitmapinfo->bmiHeader.biClrUsed = 0;
  231.       lpBitmapinfo->bmiHeader.biClrImportant = 0;
  232.  
  233.       hDC=GetDC(NULL);
  234.  
  235.       SelectPalette(hDC,hPal,0);
  236.       RealizePalette(hDC);
  237.       GetDIBits(hDC,hXORBitmap,0,(WORD)lpBitmapinfo->bmiHeader.biHeight,NULL,(LPBITMAPINFO)lpBitmapinfo,DIB_RGB_COLORS);
  238.       Size = lpBitmapinfo->bmiHeader.biWidth*lpBitmapinfo->bmiHeader.biHeight*lpBitmapinfo->bmiHeader.biBitCount/8;
  239.  
  240.  
  241.  
  242.       if ((hMem = GlobalAlloc(GMEM_MOVEABLE,Size)) != NULL)
  243.       {
  244.         if((lpMem = GlobalLock(hMem)) != (LPSTR) NULL)
  245.         {
  246.           count = GetDIBits(hDC,hXORBitmap,0,(WORD)lpBitmapinfo->bmiHeader.biHeight,(LPSTR)lpMem,(LPBITMAPINFO)lpBitmapinfo,DIB_RGB_COLORS);
  247.           ReleaseDC(NULL,hDC);
  248.  
  249.           Size1=lpBitmapinfo->bmiHeader.biWidth*lpBitmapinfo->bmiHeader.biHeight/8;
  250.           OverBound=(lpBitmapinfo->bmiHeader.biWidth/8)%sizeof(LONG);
  251.           if(OverBound) Size1+=(sizeof(LONG)-OverBound)*lpBitmapinfo->bmiHeader.biHeight;
  252.  
  253.           lpBitmapinfo->bmiHeader.biSizeImage += Size1;
  254.           lpBitmapinfo->bmiHeader.biHeight*=2;
  255.           _llseek(hFile,BegPos,0);
  256.  
  257.           if((count=_lwrite(hFile,(LPSTR)lpBitmapinfo,(WORD)Groesse))!=Groesse)
  258.           {
  259.             MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  260.             GlobalUnlock(hMem);
  261.             GlobalFree(hMem);
  262.             GlobalUnlock(hBitmapinfoMem);
  263.             GlobalFree(hBitmapinfoMem);
  264.             return(FALSE);
  265.           }
  266.  
  267.           _llseek(hFile,BegPos+Groesse,0);
  268.  
  269.           if((count=_lwrite(hFile,lpMem,(WORD)Size))!=Size)
  270.           {
  271.             MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  272.             GlobalUnlock(hMem);
  273.             GlobalFree(hMem);
  274.             GlobalUnlock(hBitmapinfoMem);
  275.             GlobalFree(hBitmapinfoMem);
  276.             return(FALSE);
  277.           }
  278.  
  279.           GlobalUnlock(hMem);
  280.           GlobalFree(hMem);
  281.           GlobalUnlock(hBitmapinfoMem);
  282.           GlobalFree(hBitmapinfoMem);
  283.           GetObject(hXORBitmap,sizeof(BITMAP),(LPSTR)&Bitmap);
  284.           Size1=Bitmap.bmWidth*Bitmap.bmHeight/8;
  285.           OverBound=(Bitmap.bmWidth/8)%sizeof(LONG);
  286.           if(OverBound) Size1+=(sizeof(LONG)-OverBound)*Bitmap.bmHeight;
  287.  
  288.  
  289.           if ((hMem = GlobalAlloc(GMEM_MOVEABLE,Size1)) != NULL)
  290.           {
  291.             if((lpMem = GlobalLock(hMem)) != (LPSTR) NULL)
  292.             {
  293.               if ((hBitmapinfoMem = GlobalAlloc(GMEM_MOVEABLE,sizeof(BITMAPINFOHEADER)+2*sizeof(RGBQUAD))) != NULL)
  294.               {
  295.                 if((lpBitmapinfo = (LPBITMAPINFO)GlobalLock(hBitmapinfoMem)) != NULL)
  296.                 {
  297.                   lpBitmapinfo->bmiHeader.biSize=(long)sizeof(BITMAPINFOHEADER);
  298.                   lpBitmapinfo->bmiHeader.biWidth=Bitmap.bmWidth;
  299.                   lpBitmapinfo->bmiHeader.biHeight=Bitmap.bmHeight;
  300.                   lpBitmapinfo->bmiHeader.biPlanes=1;
  301.                   lpBitmapinfo->bmiHeader.biBitCount=1;
  302.                   lpBitmapinfo->bmiHeader.biCompression=0L;
  303.                   lpBitmapinfo->bmiHeader.biSizeImage=0L;
  304.                   lpBitmapinfo->bmiHeader.biXPelsPerMeter=0L;
  305.                   lpBitmapinfo->bmiHeader.biYPelsPerMeter=0L;
  306.                   lpBitmapinfo->bmiHeader.biClrUsed=0L;
  307.                   lpBitmapinfo->bmiHeader.biClrImportant=0L;
  308.                   lpBitmapinfo->bmiColors[0].rgbRed=0;
  309.                   lpBitmapinfo->bmiColors[0].rgbGreen=0;
  310.                   lpBitmapinfo->bmiColors[0].rgbBlue=0;
  311.                   lpBitmapinfo->bmiColors[1].rgbRed=0xff;
  312.                   lpBitmapinfo->bmiColors[1].rgbGreen=0xff;
  313.                   lpBitmapinfo->bmiColors[1].rgbBlue=0xff;
  314.  
  315.                   hDC=GetDC(NULL);
  316.  
  317.                   count = GetDIBits(hDC,hANDBitmap,0,(WORD)lpBitmapinfo->bmiHeader.biHeight,(LPSTR)lpMem,(LPBITMAPINFO)lpBitmapinfo,DIB_RGB_COLORS);
  318.  
  319.                   ReleaseDC(NULL,hDC);
  320.  
  321.                   _llseek(hFile,BegPos+Groesse+Size,0);
  322.  
  323.                   if((count=_lwrite(hFile,(LPSTR)lpMem,(WORD)Size1))!=Size1)
  324.                   {
  325.                     MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  326.                     GlobalUnlock(hBitmapinfoMem);
  327.                     GlobalUnlock(hMem);
  328.                     GlobalFree(hBitmapinfoMem);
  329.                     GlobalFree(hMem);
  330.                     return (FALSE);
  331.                   }
  332.  
  333.                   GlobalUnlock(hBitmapinfoMem);
  334.                   GlobalUnlock(hMem);
  335.                   GlobalFree(hBitmapinfoMem);
  336.                   GlobalFree(hMem);
  337.                 }
  338.               }
  339.             }
  340.           }
  341.         }
  342.       }
  343.     }
  344.   }
  345.  
  346.   return(Groesse+Size+Size1);
  347. }
  348.  
  349. BOOL DelAllIcons(lphXORBmpMem,lphANDBmpMem,lphPalMem,lphResDirMem,lpQuantity,hWnd)
  350. HANDLE FAR *lphXORBmpMem;
  351. HANDLE FAR *lphANDBmpMem;
  352. HANDLE FAR *lphPalMem;
  353. HANDLE FAR *lphResDirMem;
  354. WORD FAR *lpQuantity;
  355. HWND hWnd;
  356. {
  357.   HBITMAP FAR *lphXORBitmap;
  358.   HBITMAP FAR *lphANDBitmap;
  359.   HPALETTE FAR *lphPal;
  360.   ICONRESOURCE FAR *lpResDir;
  361.   int i;
  362.  
  363.   lphXORBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphXORBmpMem);
  364.   lphANDBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphANDBmpMem);
  365.   lphPal = (HPALETTE FAR*)GlobalLock((HANDLE)*lphPalMem);
  366.  
  367.   for(i=0;i<*lpQuantity;i++)
  368.   {
  369.     DeleteObject(lphXORBitmap[i]);
  370.     DeleteObject(lphANDBitmap[i]);
  371.     DeleteObject(lphPal[i]);
  372.   }
  373.  
  374.   GlobalUnlock((HANDLE)*lphXORBmpMem);
  375.   GlobalUnlock((HANDLE)*lphANDBmpMem);
  376.   GlobalUnlock((HANDLE)*lphPalMem);
  377.  
  378.   *lphXORBmpMem = GlobalReAlloc(*lphXORBmpMem,1,GMEM_MOVEABLE);
  379.   *lphANDBmpMem = GlobalReAlloc(*lphANDBmpMem,1,GMEM_MOVEABLE);
  380.   *lphPalMem = GlobalReAlloc(*lphPalMem,1,GMEM_MOVEABLE);
  381.   *lphResDirMem = GlobalReAlloc(*lphResDirMem,1,GMEM_MOVEABLE);
  382.   *lpQuantity=0;
  383.   return TRUE;
  384.  
  385. }
  386.  
  387. BOOL RetrieveIconFile(lphXORBmpMem,lphANDBmpMem,lphPalMem,lphResDirMem,hFile,hWnd,lpQuantity)
  388. HANDLE FAR *lphXORBmpMem;
  389. HANDLE FAR *lphANDBmpMem;
  390. HANDLE FAR *lphPalMem;
  391. HANDLE FAR *lphResDirMem;
  392. HANDLE hFile;
  393. HWND hWnd;
  394. WORD FAR *lpQuantity;
  395. {
  396.  
  397.   HBITMAP FAR *lphXORBitmap;
  398.   HBITMAP FAR *lphANDBitmap;
  399.   HPALETTE FAR *lphPal;
  400.   ICONRESOURCE FAR *lpResDir;
  401.   WORD i;
  402.   DWORD count;
  403.   ICONFILEHEADER IconFileHeader;
  404.  
  405.  
  406.   _llseek(hFile,0,0);
  407.   count = _lread(hFile,(LPSTR)&IconFileHeader,sizeof(ICONFILEHEADER));
  408.  
  409.   if(IconFileHeader.icoResourceCount==0)
  410.   {
  411.     MessageBox(hWnd, "Die gewΣhlte Datei enthΣlt keine Icons, Ladevorgang wird abgebrochen !" ,NULL,MB_OK|MB_ICONHAND);
  412.     return(FALSE);
  413.   }
  414.  
  415.   if((IconFileHeader.icoReserved==0)&&(IconFileHeader.icoResourceType==1))
  416.   {
  417.     lphXORBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphXORBmpMem);
  418.     lphANDBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphANDBmpMem);
  419.     lphPal = (HPALETTE FAR*)GlobalLock((HANDLE)*lphPalMem);
  420.  
  421.     for(i=0;i<*lpQuantity;i++)
  422.     {
  423.       DeleteObject(lphXORBitmap[i]);
  424.       DeleteObject(lphANDBitmap[i]);
  425.       DeleteObject(lphPal[i]);
  426.     }
  427.  
  428.     GlobalUnlock((HANDLE)*lphXORBmpMem);
  429.     GlobalUnlock((HANDLE)*lphANDBmpMem);
  430.     GlobalUnlock((HANDLE)*lphPalMem);
  431.  
  432.     *lpQuantity=IconFileHeader.icoResourceCount;
  433.  
  434.     if ((*lphXORBmpMem = (HANDLE)GlobalReAlloc((HANDLE)*lphXORBmpMem,sizeof(HBITMAP)*(*lpQuantity),GMEM_MOVEABLE)) != NULL)
  435.     {
  436.       if((*lphANDBmpMem = (HANDLE)GlobalReAlloc((HANDLE)*lphANDBmpMem,sizeof(HBITMAP)*(*lpQuantity),GMEM_MOVEABLE)) != NULL)
  437.       {
  438.         if((*lphPalMem = (HANDLE)GlobalReAlloc((HANDLE)*lphPalMem,sizeof(HPALETTE)*(*lpQuantity),GMEM_MOVEABLE)) != NULL)
  439.         {
  440.           if((*lphResDirMem = (HANDLE)GlobalReAlloc((HANDLE)*lphResDirMem,sizeof(ICONRESOURCE)*(*lpQuantity),GMEM_MOVEABLE)) != NULL)
  441.           {
  442.             lphXORBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphXORBmpMem);
  443.             lphANDBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphANDBmpMem);
  444.             lphPal = (HPALETTE FAR*)GlobalLock((HANDLE)*lphPalMem);
  445.             lpResDir = (ICONRESOURCE FAR*)GlobalLock((HANDLE)*lphResDirMem);
  446.  
  447.             for (i=0;i<*lpQuantity;i++)
  448.             {
  449.               _llseek(hFile,count,0);
  450.               count += _lread(hFile,(LPSTR)&(lpResDir[i]),sizeof(ICONRESOURCE));
  451.  
  452.               if((lpResDir[i].ColorCount==2)|(lpResDir[i].ColorCount==8)|(lpResDir[i].ColorCount==16))
  453.               {
  454.                 if(RetrieveIcon(&(lphXORBitmap[i]),&(lphANDBitmap[i]),&(lphPal[i]),lpResDir[i].icoDIBOffset, hFile,hWnd)==FALSE)
  455.                 {
  456.                   *lpQuantity=0;
  457.                   GlobalUnlock((HANDLE)*lphXORBmpMem);
  458.                   GlobalUnlock((HANDLE)*lphANDBmpMem);
  459.                   GlobalUnlock((HANDLE)*lphPalMem);
  460.                   GlobalUnlock((HANDLE)*lphResDirMem);
  461.                   return FALSE;
  462.                 }
  463.                 if(lpResDir[i].ColorCount==8) lpResDir[i].ColorCount=16;
  464.               }
  465.               else
  466.               {
  467.                 MessageBox(hWnd, "Icon mit ungⁿltiger Farbenanzahl in Datei enthalten !\nLadevorgang wird abgebrochen !" ,NULL,MB_OK|MB_ICONHAND);
  468.                 *lpQuantity=0;
  469.                 GlobalUnlock((HANDLE)*lphXORBmpMem);
  470.                 GlobalUnlock((HANDLE)*lphANDBmpMem);
  471.                 GlobalUnlock((HANDLE)*lphPalMem);
  472.                 GlobalUnlock((HANDLE)*lphResDirMem);
  473.                 return FALSE;
  474.               }
  475.             }
  476.             GlobalUnlock((HANDLE)*lphXORBmpMem);
  477.             GlobalUnlock((HANDLE)*lphANDBmpMem);
  478.             GlobalUnlock((HANDLE)*lphPalMem);
  479.             GlobalUnlock((HANDLE)*lphResDirMem);
  480.           }
  481.           else
  482.           {
  483.             MessageBox(hWnd, "Nicht genⁿgend freier Speicher, um Datei zu laden ! Ladevorgang wird abgebrochen !" ,NULL,MB_OK|MB_ICONHAND);
  484.             *lpQuantity=0;
  485.             return FALSE;
  486.           }
  487.         }
  488.         else
  489.         {
  490.           MessageBox(hWnd, "Nicht genⁿgend freier Speicher, um Datei zu laden ! Ladevorgang wird abgebrochen !" ,NULL,MB_OK|MB_ICONHAND);
  491.           *lpQuantity=0;
  492.           return FALSE;
  493.         }
  494.       }
  495.       else
  496.       {
  497.         MessageBox(hWnd, "Nicht genⁿgend freier Speicher, um Datei zu laden ! Ladevorgang wird abgebrochen !" ,NULL,MB_OK|MB_ICONHAND);
  498.         *lpQuantity=0;
  499.         return FALSE;
  500.       }
  501.     }
  502.     else
  503.     {
  504.       MessageBox(hWnd, "Nicht genⁿgend freier Speicher, um Datei zu laden ! Ladevorgang wird abgebrochen !" ,NULL,MB_OK|MB_ICONHAND);
  505.       *lpQuantity=0;
  506.       return FALSE;
  507.     }
  508.     return(TRUE);
  509.   }
  510.   else
  511.   {
  512.     MessageBox(hWnd, "Die gewΣhlte Datei ist keine gⁿltige Icon-Datei, Ladevorgang wird abgebrochen !" ,NULL,MB_OK|MB_ICONHAND);
  513.     return(FALSE);
  514.   }
  515. }
  516.  
  517. BOOL SaveIconFile(lphXORBmpMem,lphANDBmpMem,lphPalMem,lphResDirMem,hFile, hWnd, Quantity)
  518. HANDLE FAR *lphXORBmpMem;
  519. HANDLE FAR *lphANDBmpMem;
  520. HANDLE FAR *lphPalMem;
  521. HANDLE FAR *lphResDirMem;
  522. HANDLE hFile;
  523. HWND hWnd;
  524. WORD Quantity;
  525. {
  526.  
  527.   HBITMAP FAR *lphXORBitmap;
  528.   HBITMAP FAR *lphANDBitmap;
  529.   HPALETTE FAR *lphPal;
  530.   ICONRESOURCE FAR *lpResDir;
  531.   ICONFILEHEADER IconFileHeader;
  532.   DWORD count;
  533.   DWORD count1;
  534.   DWORD Groesse;
  535.  
  536.   if (hFile)
  537.   {
  538.     lphXORBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphXORBmpMem);
  539.     lphANDBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphANDBmpMem);
  540.     lphPal = (HPALETTE FAR*)GlobalLock((HANDLE)*lphPalMem);
  541.     lpResDir = (ICONRESOURCE FAR*)GlobalLock((HANDLE)*lphResDirMem);
  542.     IconFileHeader.icoReserved=0;
  543.     IconFileHeader.icoResourceType=1;
  544.     IconFileHeader.icoResourceCount=Quantity;
  545.  
  546.     _llseek(hFile,0,0);
  547.  
  548.     if((count=_lwrite(hFile,(LPSTR)&IconFileHeader,sizeof(ICONFILEHEADER)))!=sizeof(ICONFILEHEADER))
  549.     {
  550.       MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  551.       GlobalUnlock((HANDLE)*lphXORBmpMem);
  552.       GlobalUnlock((HANDLE)*lphANDBmpMem);
  553.       GlobalUnlock((HANDLE)*lphPalMem);
  554.       GlobalUnlock((HANDLE)*lphResDirMem);
  555.       return FALSE;
  556.     }
  557.  
  558.     for (i=0;i<Quantity;i++)
  559.     {
  560.       _llseek(hFile,count,0);
  561.  
  562.       if((count1=_lwrite(hFile,(LPSTR)&(lpResDir[i]),sizeof(ICONRESOURCE)))!=sizeof(ICONRESOURCE))
  563.       {
  564.         MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  565.         GlobalUnlock((HANDLE)*lphXORBmpMem);
  566.         GlobalUnlock((HANDLE)*lphANDBmpMem);
  567.         GlobalUnlock((HANDLE)*lphPalMem);
  568.         GlobalUnlock((HANDLE)*lphResDirMem);
  569.         return FALSE;
  570.       }
  571.  
  572.       count+=count1;
  573.     }
  574.  
  575.     for (i=0;i<Quantity;i++)
  576.     {
  577.       _llseek(hFile,18+(16*i),0);
  578.  
  579.       if((_lwrite(hFile,(LPSTR)&count,sizeof(DWORD)))!=sizeof(DWORD))
  580.       {
  581.         MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  582.         GlobalUnlock((HANDLE)*lphXORBmpMem);
  583.         GlobalUnlock((HANDLE)*lphANDBmpMem);
  584.         GlobalUnlock((HANDLE)*lphPalMem);
  585.         GlobalUnlock((HANDLE)*lphResDirMem);
  586.         return FALSE;
  587.       }
  588.  
  589.       if((Groesse = SaveIcon(lphXORBitmap[i],lphANDBitmap[i],lphPal[i],count,hFile,hWnd,(WORD)ColBit(lpResDir[i].ColorCount)))==FALSE)
  590.       {
  591.         MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  592.         GlobalUnlock((HANDLE)*lphXORBmpMem);
  593.         GlobalUnlock((HANDLE)*lphANDBmpMem);
  594.         GlobalUnlock((HANDLE)*lphPalMem);
  595.         GlobalUnlock((HANDLE)*lphResDirMem);
  596.         return FALSE;
  597.       }
  598.  
  599.       _llseek(hFile,14+(16*i),0);
  600.  
  601.       if((_lwrite(hFile,(LPSTR)&Groesse,sizeof(DWORD)))!=sizeof(DWORD))
  602.       {
  603.         MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  604.         GlobalUnlock((HANDLE)*lphXORBmpMem);
  605.         GlobalUnlock((HANDLE)*lphANDBmpMem);
  606.         GlobalUnlock((HANDLE)*lphPalMem);
  607.         GlobalUnlock((HANDLE)*lphResDirMem);
  608.         return FALSE;
  609.       }
  610.  
  611.       count+=Groesse;
  612.     }
  613.  
  614.     GlobalUnlock((HANDLE)*lphXORBmpMem);
  615.     GlobalUnlock((HANDLE)*lphANDBmpMem);
  616.     GlobalUnlock((HANDLE)*lphPalMem);
  617.     GlobalUnlock((HANDLE)*lphResDirMem);
  618.     return TRUE;
  619.   }
  620.  
  621.   return FALSE;
  622. }
  623.  
  624.  
  625. BOOL DelIcon(lphXORBmpMem,lphANDBmpMem,lphPalMem,lphResDirMem,lpQuantity,hWnd,CurrIcon)
  626. HANDLE FAR *lphXORBmpMem;
  627. HANDLE FAR *lphANDBmpMem;
  628. HANDLE FAR *lphPalMem;
  629. HANDLE FAR *lphResDirMem;
  630. WORD FAR *lpQuantity;
  631. HWND hWnd;
  632. int CurrIcon;
  633. {
  634.   int i;
  635.  
  636.   FARPROC lpDlgSelIcon;
  637.   HBITMAP FAR *lphXORBitmap;
  638.   HBITMAP FAR *lphANDBitmap;
  639.   HPALETTE FAR *lphPal;
  640.   ICONRESOURCE FAR *lpResDir;
  641.  
  642.   lphXORBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphXORBmpMem);
  643.   lphANDBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphANDBmpMem);
  644.   lphPal = (HPALETTE FAR*)GlobalLock((HANDLE)*lphPalMem);
  645.   lpResDir = (ICONRESOURCE FAR*)GlobalLock((HANDLE)*lphResDirMem);
  646.  
  647.   DeleteObject(lphXORBitmap[CurrIcon]);
  648.   DeleteObject(lphANDBitmap[CurrIcon]);
  649.   DeleteObject(lphPal[CurrIcon]);
  650.  
  651.   for (i=CurrIcon;i<(*lpQuantity)-1;i++)
  652.   {
  653.     lphXORBitmap[i]=lphXORBitmap[i+1];
  654.     lphANDBitmap[i]=lphANDBitmap[i+1];
  655.     lphPal[i]=lphPal[i+1];
  656.     lpResDir[i]=lpResDir[i+1];
  657.   }
  658.  
  659.   GlobalUnlock((HANDLE)*lphXORBmpMem);
  660.   GlobalUnlock((HANDLE)*lphANDBmpMem);
  661.   GlobalUnlock((HANDLE)*lphPalMem);
  662.   GlobalUnlock((HANDLE)*lphResDirMem);
  663.  
  664.   (*lpQuantity)--;
  665.  
  666.   if(*lpQuantity<1)
  667.   {
  668.     *lphXORBmpMem = (HANDLE)GlobalReAlloc((HANDLE)*lphXORBmpMem,1,GMEM_MOVEABLE);
  669.     *lphANDBmpMem = (HANDLE)GlobalReAlloc((HANDLE)*lphANDBmpMem,1,GMEM_MOVEABLE);
  670.     *lphPalMem = (HANDLE)GlobalReAlloc((HANDLE)*lphPalMem,1,GMEM_MOVEABLE);
  671.     *lphResDirMem = (HANDLE)GlobalReAlloc((HANDLE)*lphResDirMem,1,GMEM_MOVEABLE);
  672.   }
  673.   else
  674.   {
  675.     *lphXORBmpMem = (HANDLE)GlobalReAlloc((HANDLE)*lphXORBmpMem,sizeof(HBITMAP)*(*lpQuantity),GMEM_MOVEABLE);
  676.     *lphANDBmpMem = (HANDLE)GlobalReAlloc((HANDLE)*lphANDBmpMem,sizeof(HBITMAP)*(*lpQuantity),GMEM_MOVEABLE);
  677.     *lphPalMem = (HANDLE)GlobalReAlloc((HANDLE)*lphPalMem,sizeof(HPALETTE)*(*lpQuantity),GMEM_MOVEABLE);
  678.     *lphResDirMem = (HANDLE)GlobalReAlloc((HANDLE)*lphResDirMem,sizeof(ICONRESOURCE)*(*lpQuantity),GMEM_MOVEABLE);
  679.   }
  680.   return TRUE;
  681. }
  682.  
  683. BYTE ColBit(Farben)
  684. BYTE Farben;
  685. {
  686.   switch(Farben)
  687.   {
  688.     case 2:
  689.       return 1;
  690.       break;
  691.     case 8:
  692.     case 16:
  693.       return 4;
  694.       break;
  695.   }
  696.   return 0;
  697. }
  698.  
  699. BYTE BitCol(Bits)
  700. BYTE Bits;
  701. {
  702.   switch(Bits)
  703.   {
  704.     case 1:
  705.       return 2;
  706.     case 4:
  707.       return 16;
  708.     case 8:
  709.       return 256;
  710.   }
  711.   return 0;
  712. }
  713.  
  714. BOOL RetrieveIconFile2(lphXORBmpMem,lphANDBmpMem,lphPalMem,lphResDirMem,hFile,hWnd,lpQuantity)
  715. HANDLE FAR *lphXORBmpMem;
  716. HANDLE FAR *lphANDBmpMem;
  717. HANDLE FAR *lphPalMem;
  718. HANDLE FAR *lphResDirMem;
  719. HANDLE hFile;
  720. HWND hWnd;
  721. WORD FAR *lpQuantity;
  722. {
  723.  
  724.   HBITMAP FAR *lphXORBitmap;
  725.   HBITMAP FAR *lphANDBitmap;
  726.   HPALETTE FAR *lphPal;
  727.   ICONRESOURCE FAR *lpResDir;
  728.   WORD i;
  729.   char ID[2];
  730.   DWORD count;
  731.   DWORD Info1Start;
  732.   DWORD Info2Start;
  733.   BITMAPFILEHEADER2 BitmapFileHeader2AND;
  734.   BITMAPFILEHEADER2 BitmapFileHeader2XOR;
  735.   BITMAPARRAYFILEHEADER2 BitmapArrayFileHeader2;
  736.  
  737.   _llseek(hFile, 0,0);
  738.   _lread(hFile,ID,2);
  739.  
  740.   if((ID[0]=='B')&&(ID[1]=='A'))
  741.   {
  742.     lphXORBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphXORBmpMem);
  743.     lphANDBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphANDBmpMem);
  744.     lphPal = (HPALETTE FAR*)GlobalLock((HANDLE)*lphPalMem);
  745.  
  746.     for(i=0;i<*lpQuantity;i++)
  747.     {
  748.       DeleteObject(lphXORBitmap[i]);
  749.       DeleteObject(lphANDBitmap[i]);
  750.       DeleteObject(lphPal[i]);
  751.     }
  752.  
  753.     GlobalUnlock((HANDLE)*lphXORBmpMem);
  754.     GlobalUnlock((HANDLE)*lphANDBmpMem);
  755.     GlobalUnlock((HANDLE)*lphPalMem);
  756.  
  757.     count=0;
  758.     *lpQuantity=0;
  759.     i=0;
  760.  
  761.     do
  762.     {
  763.       (*lpQuantity)++;
  764.       if ((*lphXORBmpMem = (HANDLE)GlobalReAlloc((HANDLE)*lphXORBmpMem,sizeof(HBITMAP)*(*lpQuantity),GMEM_MOVEABLE)) != NULL)
  765.       {
  766.         if((*lphANDBmpMem = (HANDLE)GlobalReAlloc((HANDLE)*lphANDBmpMem,sizeof(HBITMAP)*(*lpQuantity),GMEM_MOVEABLE)) != NULL)
  767.         {
  768.           if((*lphPalMem = (HANDLE)GlobalReAlloc((HANDLE)*lphPalMem,sizeof(HPALETTE)*(*lpQuantity),GMEM_MOVEABLE)) != NULL)
  769.           {
  770.             if((*lphResDirMem = (HANDLE)GlobalReAlloc((HANDLE)*lphResDirMem,sizeof(ICONRESOURCE)*(*lpQuantity),GMEM_MOVEABLE)) != NULL)
  771.             {
  772.               lphXORBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphXORBmpMem);
  773.               lphANDBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphANDBmpMem);
  774.               lphPal = (HPALETTE FAR*)GlobalLock((HANDLE)*lphPalMem);
  775.               lpResDir = (ICONRESOURCE FAR*)GlobalLock((HANDLE)*lphResDirMem);
  776.  
  777.               _llseek(hFile,count,0);
  778.               count += _lread(hFile,(LPSTR)&(BitmapArrayFileHeader2),sizeof(BITMAPARRAYFILEHEADER2));
  779.               count += _lread(hFile,(LPSTR)&(BitmapFileHeader2AND),sizeof(BITMAPFILEHEADER));
  780.               Info1Start=count;
  781.  
  782.               switch(BitmapFileHeader2AND.usType)
  783.               {
  784.                 case 0x4943:
  785.                   count += sizeof(BITMAPCOREHEADER)+2*sizeof(RGBTRIPLE);
  786.                   _llseek(hFile,count,0);
  787.                   count += _lread(hFile,(LPSTR)&(BitmapFileHeader2XOR),sizeof(BITMAPFILEHEADER));
  788.                   Info2Start=count;
  789.                   break;
  790.                 case 0x4349:
  791.                   Info2Start=Info1Start;
  792.                   Info1Start=0;
  793.                   BitmapFileHeader2XOR.offBits=BitmapFileHeader2AND.offBits;
  794.                   BitmapFileHeader2AND.offBits=0;
  795.                   break;
  796.               }
  797.  
  798.               count=BitmapArrayFileHeader2.offNext;
  799.  
  800.               if(RetrieveIcon2(&(lphXORBitmap[i]),&(lphANDBitmap[i]),&(lphPal[i]),&(lpResDir[i]),BitmapFileHeader2AND.offBits,BitmapFileHeader2XOR.offBits, Info1Start, Info2Start, hFile,hWnd)==FALSE)
  801.               {
  802.                 *lpQuantity=0;
  803.                 GlobalUnlock((HANDLE)*lphXORBmpMem);
  804.                 GlobalUnlock((HANDLE)*lphANDBmpMem);
  805.                 GlobalUnlock((HANDLE)*lphPalMem);
  806.                 GlobalUnlock((HANDLE)*lphResDirMem);
  807.                 return FALSE;
  808.               }
  809.  
  810.               GlobalUnlock((HANDLE)*lphXORBmpMem);
  811.               GlobalUnlock((HANDLE)*lphANDBmpMem);
  812.               GlobalUnlock((HANDLE)*lphPalMem);
  813.               GlobalUnlock((HANDLE)*lphResDirMem);
  814.             }
  815.             else
  816.             {
  817.               MessageBox(hWnd, "Nicht genⁿgend freier Speicher, um Datei zu laden ! Ladevorgang wird abgebrochen !" ,NULL,MB_OK|MB_ICONHAND);
  818.               *lpQuantity=0;
  819.               return FALSE;
  820.             }
  821.           }
  822.           else
  823.           {
  824.             MessageBox(hWnd, "Nicht genⁿgend freier Speicher, um Datei zu laden ! Ladevorgang wird abgebrochen !" ,NULL,MB_OK|MB_ICONHAND);
  825.             *lpQuantity=0;
  826.             return FALSE;
  827.           }
  828.         }
  829.         else
  830.         {
  831.           MessageBox(hWnd, "Nicht genⁿgend freier Speicher, um Datei zu laden ! Ladevorgang wird abgebrochen !" ,NULL,MB_OK|MB_ICONHAND);
  832.           *lpQuantity=0;
  833.           return FALSE;
  834.         }
  835.       }
  836.       else
  837.       {
  838.         MessageBox(hWnd, "Nicht genⁿgend freier Speicher, um Datei zu laden ! Ladevorgang wird abgebrochen !" ,NULL,MB_OK|MB_ICONHAND);
  839.         *lpQuantity=0;
  840.         return FALSE;
  841.       }
  842.       i++;
  843.     }
  844.     while(count!=0);
  845.     return(TRUE);
  846.   }
  847.   else
  848.   {
  849.     MessageBox(hWnd, "Die gewΣhlte Datei ist keine gⁿltige Icon-Datei, Ladevorgang wird abgebrochen !" ,NULL,MB_OK|MB_ICONHAND);
  850.     return(FALSE);
  851.   }
  852. }
  853.  
  854. RetrieveIcon2(lphXORBitmap,lphANDBitmap,lphPal,lpResDir,BegPosData1,BegPosData2,BegPosInfo1,BegPosInfo2,hFile,hWnd)
  855. HBITMAP FAR *lphXORBitmap;
  856. HBITMAP FAR *lphANDBitmap;
  857. HPALETTE FAR *lphPal;
  858. ICONRESOURCE FAR *lpResDir;
  859. DWORD BegPosData1;
  860. DWORD BegPosData2;
  861. DWORD BegPosInfo1;
  862. DWORD BegPosInfo2;
  863. int hFile;
  864. HWND hWnd;
  865. {
  866.   HDC hDC;
  867.   HDC hDC1;
  868.   HDC hDC2;
  869.   HDC hDC3;
  870.   DWORD Size;
  871.   DWORD Groesse;
  872.   DWORD Size1;
  873.   DWORD OverBound;
  874.   WORD PalEntrys;
  875.   BITMAPCOREINFO BitmapCoreInfo;
  876.   LPBITMAPCOREINFO lpBitmapCoreInfo;
  877.   LPSTR lpMem;
  878.   HANDLE hBitmapCoreInfoMem;
  879.   HANDLE hMem;
  880.   int count;
  881.   int i;
  882.   int j;
  883.   RGBTRIPLE FAR *pRgb;
  884.   LOGPALETTE *pPal;
  885.   WORD FAR *pw;
  886.   HBITMAP hXORBitmap;
  887.   HBITMAP hOldBitmap1;
  888.   HBITMAP hOldBitmap2;
  889.   HBITMAP hOldBitmap3;
  890.  
  891.   _llseek(hFile,BegPosInfo2,0);
  892.   count = _lread(hFile,(LPSTR)&BitmapCoreInfo.bmciHeader,sizeof(BITMAPCOREHEADER));
  893.  
  894.   if(BegPosData1==0) BitmapCoreInfo.bmciHeader.bcHeight/=2;
  895.  
  896.   PalEntrys=(WORD)BitCol((BYTE)BitmapCoreInfo.bmciHeader.bcBitCount);
  897.  
  898.   lpResDir->Width=BitmapCoreInfo.bmciHeader.bcWidth;
  899.   lpResDir->Height=BitmapCoreInfo.bmciHeader.bcHeight;
  900.   lpResDir->ColorCount=PalEntrys;
  901.   lpResDir->Reserved1=0;
  902.   lpResDir->Reserved2=0;
  903.   lpResDir->Reserved3=0;
  904.  
  905.   if ((PalEntrys!=2)&&(PalEntrys!=16)&&(PalEntrys!=256))
  906.   {
  907.     MessageBox(hWnd, "Die gewΣhlte Datei ist keine gⁿltige Icon-Datei, Ladevorgang wird abgebrochen !" ,NULL,MB_OK|MB_ICONHAND);
  908.     return(FALSE);
  909.   }
  910.  
  911.   Groesse = sizeof(BITMAPCOREHEADER)+PalEntrys*sizeof(RGBTRIPLE);
  912.   Size = BitmapCoreInfo.bmciHeader.bcWidth*BitmapCoreInfo.bmciHeader.bcHeight*BitmapCoreInfo.bmciHeader.bcBitCount/8;
  913.  
  914.   if ((hBitmapCoreInfoMem = GlobalAlloc(GMEM_MOVEABLE,Groesse)) != NULL)
  915.   {
  916.     if ((hMem = GlobalAlloc(GMEM_MOVEABLE,Size)) != NULL)
  917.     {
  918.       if((lpBitmapCoreInfo = (LPBITMAPCOREINFO)GlobalLock(hBitmapCoreInfoMem)) != NULL)
  919.       {
  920.         if((lpMem = GlobalLock(hMem)) != (LPSTR) NULL)
  921.         {
  922.           _llseek(hFile,BegPosInfo2,0);
  923.           count = _lread(hFile,(LPSTR)lpBitmapCoreInfo,(WORD)Groesse);
  924.  
  925.           if(BegPosData1==0) lpBitmapCoreInfo->bmciHeader.bcHeight/=2;
  926.  
  927.           _llseek(hFile,BegPosData2,0);
  928.           count= _lread(hFile,(LPSTR)lpMem, (WORD)Size);
  929.  
  930.           hDC = GetDC(NULL);
  931.  
  932.           pRgb = (RGBTRIPLE FAR *)((LPSTR)lpBitmapCoreInfo->bmciColors);
  933.           pPal = (LOGPALETTE*)LocalAlloc(LPTR,sizeof(LOGPALETTE) + PalEntrys * sizeof(PALETTEENTRY));
  934.  
  935.           if (!pPal)
  936.             return FALSE;
  937.  
  938.           pPal->palNumEntries = PalEntrys;
  939.           pPal->palVersion    = 0x300;
  940.  
  941.           for (i = 0; i < PalEntrys; i++)
  942.           {
  943.             pPal->palPalEntry[i].peRed   = pRgb[i].rgbtRed;
  944.             pPal->palPalEntry[i].peGreen = pRgb[i].rgbtGreen;
  945.             pPal->palPalEntry[i].peBlue  = pRgb[i].rgbtBlue;
  946.             pPal->palPalEntry[i].peFlags = (BYTE)0;
  947.           }
  948.  
  949.           *lphPal = CreatePalette(pPal);
  950.           LocalFree((HANDLE)pPal);
  951.           pw = (WORD FAR *)((LPSTR)lpBitmapCoreInfo->bmciColors);
  952.  
  953.           for (i=0; i<(int)PalEntrys; i++)
  954.             *pw++ = (WORD)i;
  955.  
  956.           if (*lphPal)
  957.           {
  958.             SelectPalette(hDC,*lphPal,FALSE);
  959.             RealizePalette(hDC);
  960.           }
  961.  
  962.           *lphXORBitmap=CreateDIBitmap(hDC,(LPBITMAPINFOHEADER)&(lpBitmapCoreInfo->bmciHeader),CBM_INIT,(LPSTR)lpMem,(LPBITMAPINFO)lpBitmapCoreInfo,DIB_PAL_COLORS);
  963.           ReleaseDC(NULL,hDC);
  964.           GlobalUnlock(hMem);
  965.           GlobalFree(hMem);
  966.           GlobalUnlock(hBitmapCoreInfoMem);
  967.           GlobalFree(hBitmapCoreInfoMem);
  968.           if (*lphXORBitmap)
  969.           {
  970.             Size1=BitmapCoreInfo.bmciHeader.bcWidth*BitmapCoreInfo.bmciHeader.bcHeight/8;
  971.             OverBound=(BitmapCoreInfo.bmciHeader.bcWidth/8)%sizeof(LONG);
  972.             if(OverBound) Size1+=(sizeof(LONG)-OverBound)*BitmapCoreInfo.bmciHeader.bcHeight;
  973.  
  974.             Groesse = sizeof(BITMAPCOREHEADER)+2*sizeof(RGBTRIPLE);
  975.             if ((hMem = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,Size1)) != NULL)
  976.             {
  977.               if ((hBitmapCoreInfoMem = GlobalAlloc(GMEM_MOVEABLE,Groesse)) != NULL)
  978.               {
  979.                 if((lpMem = GlobalLock(hMem)) != (LPSTR) NULL)
  980.                 {
  981.                   if((lpBitmapCoreInfo = (LPBITMAPCOREINFO)GlobalLock(hBitmapCoreInfoMem)) != NULL)
  982.                   {
  983.                     if(BegPosInfo1!=0)
  984.                     {
  985.                       _llseek(hFile,BegPosInfo1,0);
  986.                       count = _lread(hFile,(LPSTR)lpBitmapCoreInfo,(WORD)Groesse);
  987.  
  988.  
  989.                       lpBitmapCoreInfo->bmciHeader.bcHeight/=2;
  990.  
  991.                       hDC=GetDC(NULL);
  992.  
  993.                       _llseek(hFile,BegPosData1,0);
  994.                       count=_lread(hFile,(LPSTR)lpMem,(WORD)Size1);
  995.  
  996.                       hXORBitmap = CreateDIBitmap(hDC,(LPBITMAPINFOHEADER)&(lpBitmapCoreInfo->bmciHeader),CBM_INIT,(LPSTR)lpMem,(LPBITMAPINFO)lpBitmapCoreInfo, DIB_RGB_COLORS);
  997.  
  998.                       count=_lread(hFile,(LPSTR)lpMem,(WORD)Size1);
  999.                       *lphANDBitmap = CreateDIBitmap(hDC,(LPBITMAPINFOHEADER)&(lpBitmapCoreInfo->bmciHeader),CBM_INIT,(LPSTR)lpMem,(LPBITMAPINFO)lpBitmapCoreInfo, DIB_RGB_COLORS);
  1000.  
  1001.                       GlobalUnlock(hBitmapCoreInfoMem);
  1002.                       GlobalUnlock(hMem);
  1003.                       GlobalFree(hBitmapCoreInfoMem);
  1004.                       GlobalFree(hMem);
  1005.  
  1006.                       hDC1=CreateCompatibleDC(hDC);
  1007.                       hDC2=CreateCompatibleDC(hDC);
  1008.                       hDC3=CreateCompatibleDC(hDC);
  1009.  
  1010.                       ReleaseDC(NULL,hDC);
  1011.  
  1012.                       hOldBitmap1=SelectObject(hDC1,*lphXORBitmap);
  1013.                       hOldBitmap2=SelectObject(hDC2,*lphANDBitmap);
  1014.                       hOldBitmap3=SelectObject(hDC3,hXORBitmap);
  1015.  
  1016.                       for(i=0;i<lpResDir->Width;i++)
  1017.                       {
  1018.                         for(j=0;j<lpResDir->Height;j++)
  1019.                         {
  1020.                           if(GetPixel(hDC2,i,j)==RGB(255,255,255))
  1021.                             SetPixel(hDC1,i,j,GetPixel(hDC3,i,j));
  1022.                         }
  1023.                       }
  1024.  
  1025.                       SelectObject(hDC1,hOldBitmap1);
  1026.                       SelectObject(hDC2,hOldBitmap2);
  1027.                       SelectObject(hDC3,hOldBitmap3);
  1028.  
  1029.                       DeleteDC(hDC1);
  1030.                       DeleteDC(hDC2);
  1031.                       DeleteDC(hDC3);
  1032.  
  1033.                       DeleteObject(hXORBitmap);
  1034.                     }
  1035.                     else
  1036.                     {
  1037.                       lpBitmapCoreInfo->bmciHeader.bcSize=(long)sizeof(BITMAPCOREHEADER);
  1038.                       lpBitmapCoreInfo->bmciHeader.bcWidth=BitmapCoreInfo.bmciHeader.bcWidth;
  1039.                       lpBitmapCoreInfo->bmciHeader.bcHeight=BitmapCoreInfo.bmciHeader.bcHeight;
  1040.                       lpBitmapCoreInfo->bmciHeader.bcPlanes=1;
  1041.                       lpBitmapCoreInfo->bmciHeader.bcBitCount=1;
  1042.                       lpBitmapCoreInfo->bmciColors[0].rgbtRed=0;
  1043.                       lpBitmapCoreInfo->bmciColors[0].rgbtGreen=0;
  1044.                       lpBitmapCoreInfo->bmciColors[0].rgbtBlue=0;
  1045.                       lpBitmapCoreInfo->bmciColors[1].rgbtRed=0xff;
  1046.                       lpBitmapCoreInfo->bmciColors[1].rgbtGreen=0xff;
  1047.                       lpBitmapCoreInfo->bmciColors[1].rgbtBlue=0xff;
  1048.  
  1049.                       _llseek(hFile,BegPosData2+Size,0);
  1050.                       count= _lread(hFile,(LPSTR)lpMem, (WORD)Size);
  1051.  
  1052.                       hDC=GetDC(NULL);
  1053.                       *lphANDBitmap = CreateDIBitmap(hDC,(LPBITMAPINFOHEADER)&(lpBitmapCoreInfo->bmciHeader),CBM_INIT,(LPSTR)lpMem,(LPBITMAPINFO)lpBitmapCoreInfo, DIB_RGB_COLORS);
  1054.                       ReleaseDC(NULL,hDC);
  1055.  
  1056.                       GlobalUnlock(hBitmapCoreInfoMem);
  1057.                       GlobalUnlock(hMem);
  1058.                       GlobalFree(hBitmapCoreInfoMem);
  1059.                       GlobalFree(hMem);
  1060.  
  1061.                     }
  1062.                   }
  1063.                 }
  1064.               }
  1065.             }
  1066.           }
  1067.           else
  1068.           {
  1069.             MessageBox(hWnd, "Bitmap konnte nicht erstellt werden !" ,NULL,MB_OK|MB_ICONHAND);
  1070.             return FALSE;
  1071.           }
  1072.         }
  1073.       }
  1074.     }
  1075.   }
  1076.   return TRUE;
  1077. }
  1078.  
  1079. BOOL CopyIcon(lphXORBitmap,lphANDBitmap,lphPal,lpResDir,CurrIcon,Quantity,CurrFile,hWnd)
  1080. HBITMAP FAR **lphXORBitmap;
  1081. HBITMAP FAR **lphANDBitmap;
  1082. HPALETTE FAR **lphPal;
  1083. ICONRESOURCE FAR **lpResDir;
  1084. int CurrIcon;
  1085. int Quantity;
  1086. int CurrFile;
  1087. HWND hWnd;
  1088. {
  1089.  
  1090.   HDC hDC;
  1091.   DWORD Size;
  1092.   DWORD Groesse;
  1093.   DWORD Size1;
  1094.   LPBITMAPINFO lpBitmapinfo;
  1095.   LPSTR lpMem;
  1096.   HANDLE hBitmapinfoMem;
  1097.   HANDLE hMem;
  1098.   int count;
  1099.   WORD PalEntrys;
  1100.   DWORD OverBound;
  1101.   int OtherFile;
  1102.   RGBQUAD FAR *pRgb;
  1103.   LOGPALETTE *pPal;
  1104.   WORD FAR *pw;
  1105.   int result;
  1106.  
  1107.   if(CurrFile==0) OtherFile=1;
  1108.   if(CurrFile==1) OtherFile=0;
  1109.  
  1110.   GetObject(lphPal[CurrFile][CurrIcon],2,(LPSTR)&PalEntrys);
  1111.   Groesse = sizeof(BITMAPINFOHEADER)+PalEntrys*sizeof(RGBQUAD);
  1112.  
  1113.   Size = lpResDir[CurrFile][CurrIcon].Width*lpResDir[CurrFile][CurrIcon].Height*ColBit(lpResDir[CurrFile][CurrIcon].ColorCount)/8;
  1114.  
  1115.   if ((hBitmapinfoMem = GlobalAlloc(GMEM_MOVEABLE,Groesse)) != NULL)
  1116.   {
  1117.     if ((hMem = GlobalAlloc(GMEM_MOVEABLE,Size)) != NULL)
  1118.     {
  1119.       if((lpBitmapinfo = (LPBITMAPINFO)GlobalLock(hBitmapinfoMem)) != NULL)
  1120.       {
  1121.         if((lpMem = GlobalLock(hMem)) != (LPSTR) NULL)
  1122.         {
  1123.  
  1124.           lpBitmapinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  1125.           lpBitmapinfo->bmiHeader.biWidth = lpResDir[CurrFile][CurrIcon].Width;
  1126.           lpBitmapinfo->bmiHeader.biHeight = lpResDir[CurrFile][CurrIcon].Height;
  1127.           lpBitmapinfo->bmiHeader.biPlanes = 1;
  1128.           lpBitmapinfo->bmiHeader.biBitCount = ColBit(lpResDir[CurrFile][CurrIcon].ColorCount);
  1129.           lpBitmapinfo->bmiHeader.biCompression = 0;
  1130.           lpBitmapinfo->bmiHeader.biSizeImage = 0;
  1131.           lpBitmapinfo->bmiHeader.biXPelsPerMeter = 0;
  1132.           lpBitmapinfo->bmiHeader.biYPelsPerMeter = 0;
  1133.           lpBitmapinfo->bmiHeader.biClrUsed = 0;
  1134.           lpBitmapinfo->bmiHeader.biClrImportant = 0;
  1135.  
  1136.           hDC=GetDC(NULL);
  1137.  
  1138.           SelectPalette(hDC,lphPal[CurrFile][CurrIcon],0);
  1139.           RealizePalette(hDC);
  1140.  
  1141.           result=GetDIBits(hDC, lphXORBitmap[CurrFile][CurrIcon], 0, (WORD)lpBitmapinfo->bmiHeader.biHeight, (LPSTR)lpMem, (LPBITMAPINFO)lpBitmapinfo, DIB_RGB_COLORS);
  1142.  
  1143.           pRgb = (RGBQUAD FAR *)((LPSTR)lpBitmapinfo->bmiColors);
  1144.           pPal = (LOGPALETTE*)LocalAlloc(LPTR,sizeof(LOGPALETTE) + PalEntrys * sizeof(PALETTEENTRY));
  1145.  
  1146.           if (!pPal)
  1147.             return FALSE;
  1148.  
  1149.           pPal->palNumEntries = PalEntrys;
  1150.           pPal->palVersion    = 0x300;
  1151.  
  1152.           for (i = 0; i < PalEntrys; i++)
  1153.           {
  1154.             pPal->palPalEntry[i].peRed   = pRgb[i].rgbRed;
  1155.             pPal->palPalEntry[i].peGreen = pRgb[i].rgbGreen;
  1156.             pPal->palPalEntry[i].peBlue  = pRgb[i].rgbBlue;
  1157.             pPal->palPalEntry[i].peFlags = (BYTE)0;
  1158.           }
  1159.  
  1160.           lphPal[OtherFile][Quantity-1] = CreatePalette(pPal);
  1161.           LocalFree((HANDLE)pPal);
  1162.           pw = (WORD FAR *)((LPSTR)lpBitmapinfo->bmiColors);
  1163.  
  1164.           for (i=0; i<(int)lpBitmapinfo->bmiHeader.biClrUsed; i++)
  1165.             *pw++ = (WORD)i;
  1166.  
  1167.           if (lphPal[CurrFile][CurrIcon])
  1168.           {
  1169.             SelectPalette(hDC,lphPal[CurrFile][CurrIcon],FALSE);
  1170.             RealizePalette(hDC);
  1171.           }
  1172.  
  1173.           lphXORBitmap[OtherFile][Quantity-1]=CreateDIBitmap(hDC,(LPBITMAPINFOHEADER)&(lpBitmapinfo->bmiHeader),CBM_INIT,(LPSTR)lpMem,(LPBITMAPINFO)lpBitmapinfo,DIB_RGB_COLORS);
  1174.           ReleaseDC(NULL,hDC);
  1175.           GlobalUnlock(hMem);
  1176.           GlobalFree(hMem);
  1177.           GlobalUnlock(hBitmapinfoMem);
  1178.           GlobalFree(hBitmapinfoMem);
  1179.           if (lphXORBitmap[OtherFile][Quantity-1])
  1180.           {
  1181.             /*Size1=Bitmapinfo.bmiHeader.biWidth*Bitmapinfo.bmiHeader.biHeight/8;
  1182.             OverBound=(Bitmapinfo.bmiHeader.biWidth/8)%sizeof(LONG);
  1183.             if(OverBound) Size1+=(sizeof(LONG)-OverBound)*Bitmapinfo.bmiHeader.biHeight;*/
  1184.  
  1185.             Size1=lpResDir[CurrFile][CurrIcon].Width*lpResDir[CurrFile][CurrIcon].Height/8;
  1186.             OverBound=(lpResDir[CurrFile][CurrIcon].Width/8)%sizeof(LONG);
  1187.             if(OverBound) Size1+=(sizeof(LONG)-OverBound)*lpResDir[CurrFile][CurrIcon].Height;
  1188.  
  1189.             if ((hMem = GlobalAlloc(GMEM_MOVEABLE,Size1)) != NULL)
  1190.             {
  1191.               if ((hBitmapinfoMem = GlobalAlloc(GMEM_MOVEABLE,sizeof(BITMAPINFOHEADER)+2*sizeof(RGBQUAD))) != NULL)
  1192.               {
  1193.                 if((lpMem = GlobalLock(hMem)) != (LPSTR) NULL)
  1194.                 {
  1195.                   if((lpBitmapinfo = (LPBITMAPINFO)GlobalLock(hBitmapinfoMem)) != NULL)
  1196.                   {
  1197.                     lpBitmapinfo->bmiHeader.biSize=(long)sizeof(BITMAPINFOHEADER);
  1198.                     lpBitmapinfo->bmiHeader.biWidth=lpResDir[CurrFile][CurrIcon].Width;
  1199.                     lpBitmapinfo->bmiHeader.biHeight=lpResDir[CurrFile][CurrIcon].Height;
  1200.                     lpBitmapinfo->bmiHeader.biPlanes=1;
  1201.                     lpBitmapinfo->bmiHeader.biBitCount=1;
  1202.                     lpBitmapinfo->bmiHeader.biCompression=0L;
  1203.                     lpBitmapinfo->bmiHeader.biSizeImage=0L;
  1204.                     lpBitmapinfo->bmiHeader.biXPelsPerMeter=0L;
  1205.                     lpBitmapinfo->bmiHeader.biYPelsPerMeter=0L;
  1206.                     lpBitmapinfo->bmiHeader.biClrUsed=0L;
  1207.                     lpBitmapinfo->bmiHeader.biClrImportant=0L;
  1208.                     lpBitmapinfo->bmiColors[0].rgbRed=0;
  1209.                     lpBitmapinfo->bmiColors[0].rgbGreen=0;
  1210.                     lpBitmapinfo->bmiColors[0].rgbBlue=0;
  1211.                     lpBitmapinfo->bmiColors[1].rgbRed=0xff;
  1212.                     lpBitmapinfo->bmiColors[1].rgbGreen=0xff;
  1213.                     lpBitmapinfo->bmiColors[1].rgbBlue=0xff;
  1214.  
  1215.                     hDC=GetDC(NULL);
  1216.  
  1217.                     result=GetDIBits(hDC, lphANDBitmap[CurrFile][CurrIcon], 0, (WORD)lpBitmapinfo->bmiHeader.biHeight, (LPSTR)lpMem, (LPBITMAPINFO)lpBitmapinfo, DIB_RGB_COLORS);
  1218.  
  1219.                     lphANDBitmap[OtherFile][Quantity-1] = CreateDIBitmap(hDC,(LPBITMAPINFOHEADER)&(lpBitmapinfo->bmiHeader),CBM_INIT,(LPSTR)lpMem,(LPBITMAPINFO)lpBitmapinfo, DIB_RGB_COLORS);
  1220.                     ReleaseDC(NULL,hDC);
  1221.                     GlobalUnlock(hBitmapinfoMem);
  1222.                     GlobalUnlock(hMem);
  1223.                     GlobalFree(hBitmapinfoMem);
  1224.                     GlobalFree(hMem);
  1225.                   }
  1226.                 }
  1227.               }
  1228.             }
  1229.           }
  1230.           else
  1231.           {
  1232.             MessageBox(hWnd, "Bitmap konnte nicht erstellt werden !" ,NULL,MB_OK|MB_ICONHAND);
  1233.             return FALSE;
  1234.           }
  1235.         }
  1236.       }
  1237.     }
  1238.   }
  1239.  
  1240.   return TRUE;
  1241. }
  1242.  
  1243. BOOL SaveIconFile2(lphXORBmpMem,lphANDBmpMem,lphPalMem,lphResDirMem,hFile, hWnd, Quantity)
  1244. HANDLE FAR *lphXORBmpMem;
  1245. HANDLE FAR *lphANDBmpMem;
  1246. HANDLE FAR *lphPalMem;
  1247. HANDLE FAR *lphResDirMem;
  1248. HANDLE hFile;
  1249. HWND hWnd;
  1250. WORD Quantity;
  1251. {
  1252.  
  1253.   HBITMAP FAR *lphXORBitmap;
  1254.   HBITMAP FAR *lphANDBitmap;
  1255.   HPALETTE FAR *lphPal;
  1256.   ICONRESOURCE FAR *lpResDir;
  1257.   BITMAPARRAYFILEHEADER2 BitmapArrayFileHeader2;
  1258.   BITMAPFILEHEADER2 BitmapFileHeader2;
  1259.   DWORD count=0;
  1260.   DWORD count1;
  1261.   DWORD Groesse;
  1262.   DWORD OverBound;
  1263.   DWORD Result;
  1264.   DWORD Result1;
  1265.  
  1266.   if (hFile)
  1267.   {
  1268.     lphXORBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphXORBmpMem);
  1269.     lphANDBitmap = (HBITMAP FAR*)GlobalLock((HANDLE)*lphANDBmpMem);
  1270.     lphPal = (HPALETTE FAR*)GlobalLock((HANDLE)*lphPalMem);
  1271.     lpResDir = (ICONRESOURCE FAR*)GlobalLock((HANDLE)*lphResDirMem);
  1272.  
  1273.  
  1274.     count1=Quantity*(sizeof(BITMAPARRAYFILEHEADER2)+2*sizeof(BITMAPFILEHEADER2)+2*sizeof(BITMAPCOREHEADER)+2*sizeof(RGBTRIPLE));
  1275.     for (i=0;i<Quantity;i++) count1+=lpResDir[i].ColorCount*sizeof(RGBTRIPLE);
  1276.  
  1277.  
  1278.     for (i=0;i<Quantity;i++)
  1279.     {
  1280.  
  1281.       Groesse=lpResDir[i].Width*lpResDir[i].Height/8;
  1282.       OverBound=(lpResDir[i].Width/8)%sizeof(LONG);
  1283.       if(OverBound) Groesse+=(sizeof(LONG)-OverBound)*lpResDir[i].Height;
  1284.  
  1285.       Groesse*=2;
  1286.  
  1287.       Result1=SaveIcon2(lphXORBitmap[i],
  1288.                     lphANDBitmap[i],
  1289.                     lphPal[i],
  1290.                     count1+Groesse,
  1291.                     count1,
  1292.                     count+sizeof(BITMAPCOREHEADER)+2*sizeof(RGBTRIPLE)+2*sizeof(BITMAPFILEHEADER2)+sizeof(BITMAPARRAYFILEHEADER2),
  1293.                     count+sizeof(BITMAPARRAYFILEHEADER2)+sizeof(BITMAPFILEHEADER2),
  1294.                     hFile,
  1295.                     hWnd,
  1296.                     (WORD)ColBit(lpResDir[i].ColorCount));
  1297.  
  1298.  
  1299.       BitmapArrayFileHeader2.usType=0x4142;
  1300.       BitmapArrayFileHeader2.cbSize=sizeof(BITMAPARRAYFILEHEADER2)+sizeof(BITMAPFILEHEADER2)+sizeof(BITMAPCOREHEADER);
  1301.       BitmapArrayFileHeader2.offNext=(Quantity==(i+1))? 0:(count+sizeof(BITMAPARRAYFILEHEADER2)+2*sizeof(BITMAPFILEHEADER2)+2*sizeof(BITMAPCOREHEADER)+sizeof(RGBTRIPLE)*(2+lpResDir[i].ColorCount));
  1302.       BitmapArrayFileHeader2.cxDisplay=0;
  1303.       BitmapArrayFileHeader2.cyDisplay=0;
  1304.  
  1305.       _llseek(hFile,count,0);
  1306.  
  1307.       Result=_lwrite(hFile,(LPSTR)&BitmapArrayFileHeader2,sizeof(BITMAPARRAYFILEHEADER2));
  1308.       count+=Result;
  1309.  
  1310.       if(Result!=sizeof(BITMAPARRAYFILEHEADER2))
  1311.       {
  1312.         MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  1313.         GlobalUnlock((HANDLE)*lphXORBmpMem);
  1314.         GlobalUnlock((HANDLE)*lphANDBmpMem);
  1315.         GlobalUnlock((HANDLE)*lphPalMem);
  1316.         GlobalUnlock((HANDLE)*lphResDirMem);
  1317.         return FALSE;
  1318.       }
  1319.  
  1320.       BitmapFileHeader2.usType=0x4943;
  1321.       BitmapFileHeader2.cbSize=sizeof(BITMAPFILEHEADER2)+sizeof(BITMAPCOREHEADER);
  1322.       BitmapFileHeader2.xHotspot=lpResDir[i].Width/2;
  1323.       BitmapFileHeader2.yHotspot=lpResDir[i].Height/2;
  1324.       BitmapFileHeader2.offBits=count1;
  1325.  
  1326.       _llseek(hFile,count,0);
  1327.  
  1328.       Result=_lwrite(hFile,(LPSTR)&BitmapFileHeader2,sizeof(BITMAPFILEHEADER2));
  1329.       count+=Result;
  1330.  
  1331.       if(Result!=sizeof(BITMAPFILEHEADER2))
  1332.       {
  1333.         MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  1334.         GlobalUnlock((HANDLE)*lphXORBmpMem);
  1335.         GlobalUnlock((HANDLE)*lphANDBmpMem);
  1336.         GlobalUnlock((HANDLE)*lphPalMem);
  1337.         GlobalUnlock((HANDLE)*lphResDirMem);
  1338.         return FALSE;
  1339.       }
  1340.  
  1341.       count+=sizeof(BITMAPCOREHEADER)+2*sizeof(RGBTRIPLE);
  1342.  
  1343.       BitmapFileHeader2.offBits=count1+Groesse;
  1344.  
  1345.       _llseek(hFile,count,0);
  1346.  
  1347.       Result=_lwrite(hFile,(LPSTR)&BitmapFileHeader2,sizeof(BITMAPFILEHEADER2));
  1348.       count+=Result;
  1349.  
  1350.       if(Result!=sizeof(BITMAPFILEHEADER2))
  1351.       {
  1352.         MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  1353.         GlobalUnlock((HANDLE)*lphXORBmpMem);
  1354.         GlobalUnlock((HANDLE)*lphANDBmpMem);
  1355.         GlobalUnlock((HANDLE)*lphPalMem);
  1356.         GlobalUnlock((HANDLE)*lphResDirMem);
  1357.         return FALSE;
  1358.       }
  1359.  
  1360.       count+=sizeof(BITMAPCOREHEADER)+lpResDir[i].ColorCount*sizeof(RGBTRIPLE);
  1361.       count1+=Result1;
  1362.     }
  1363.  
  1364.     GlobalUnlock((HANDLE)*lphXORBmpMem);
  1365.     GlobalUnlock((HANDLE)*lphANDBmpMem);
  1366.     GlobalUnlock((HANDLE)*lphPalMem);
  1367.     GlobalUnlock((HANDLE)*lphResDirMem);
  1368.     return TRUE;
  1369.   }
  1370.  
  1371.   return FALSE;
  1372. }
  1373.  
  1374.  
  1375. DWORD SaveIcon2(hXORBitmap, hANDBitmap, hPal, BegPosData1, BegPosData2, BegPosInfo1, BegPosInfo2, hFile, hWnd, BitPix)
  1376. HBITMAP hXORBitmap;
  1377. HBITMAP hANDBitmap;
  1378. HPALETTE hPal;
  1379. DWORD BegPosData1;
  1380. DWORD BegPosData2;
  1381. DWORD BegPosInfo1;
  1382. DWORD BegPosInfo2;
  1383. WORD hFile;
  1384. HWND hWnd;
  1385. WORD BitPix;
  1386. {
  1387.   HDC hDC;
  1388.   DWORD Size=0;
  1389.   DWORD Groesse=0;
  1390.   DWORD Size1=0;
  1391.   DWORD Size2=0;
  1392.   DWORD Groesse1=0;
  1393.   LPBITMAPCOREINFO lpBitmapCoreinfo;
  1394.   LPSTR lpMem;
  1395.   HANDLE hBitmapCoreinfoMem;
  1396.   HANDLE hMem;
  1397.   int count;
  1398.   WORD PalEntrys;
  1399.   BITMAP Bitmap;
  1400.   DWORD OverBound;
  1401.   HBITMAP hXORBitmap2;
  1402.   int i;
  1403.   int j;
  1404.  
  1405.   HDC hDC1;
  1406.   HDC hDC2;
  1407.   HDC hDC3;
  1408.   HBITMAP hOldBitmap1;
  1409.   HBITMAP hOldBitmap2;
  1410.   HBITMAP hOldBitmap3;
  1411.  
  1412.   GetObject(hXORBitmap,sizeof(BITMAP),(LPSTR)&Bitmap);
  1413.   GetObject(hPal,2,(LPSTR)&PalEntrys);
  1414.   Groesse = sizeof(BITMAPCOREHEADER)+PalEntrys*sizeof(RGBTRIPLE);
  1415.  
  1416.   if ((hBitmapCoreinfoMem = GlobalAlloc(GMEM_MOVEABLE,Groesse)) != NULL)
  1417.   {
  1418.     if((lpBitmapCoreinfo = (LPBITMAPCOREINFO)GlobalLock(hBitmapCoreinfoMem)) != NULL)
  1419.     {
  1420.       lpBitmapCoreinfo->bmciHeader.bcSize = sizeof(BITMAPCOREHEADER);
  1421.       lpBitmapCoreinfo->bmciHeader.bcWidth = Bitmap.bmWidth;
  1422.       lpBitmapCoreinfo->bmciHeader.bcHeight = Bitmap.bmHeight;
  1423.       lpBitmapCoreinfo->bmciHeader.bcPlanes = 1;
  1424.       lpBitmapCoreinfo->bmciHeader.bcBitCount = BitPix;
  1425.  
  1426.       hDC=GetDC(NULL);
  1427.  
  1428.       SelectPalette(hDC,hPal,0);
  1429.       RealizePalette(hDC);
  1430.       GetDIBits(hDC,hXORBitmap,0,(WORD)lpBitmapCoreinfo->bmciHeader.bcHeight,NULL,(LPBITMAPINFO)lpBitmapCoreinfo,DIB_RGB_COLORS);
  1431.       Size = lpBitmapCoreinfo->bmciHeader.bcWidth*lpBitmapCoreinfo->bmciHeader.bcHeight*lpBitmapCoreinfo->bmciHeader.bcBitCount/8;
  1432.  
  1433.       if ((hMem = GlobalAlloc(GMEM_MOVEABLE,Size)) != NULL)
  1434.       {
  1435.         if((lpMem = GlobalLock(hMem)) != (LPSTR) NULL)
  1436.         {
  1437.           count = GetDIBits(hDC,hXORBitmap,0,(WORD)lpBitmapCoreinfo->bmciHeader.bcHeight,(LPSTR)lpMem,(LPBITMAPINFO)lpBitmapCoreinfo,DIB_RGB_COLORS);
  1438.           ReleaseDC(NULL,hDC);
  1439.  
  1440.           if(BegPosInfo1!=0)
  1441.           {
  1442.             _llseek(hFile,BegPosInfo1,0);
  1443.  
  1444.             if((Groesse=_lwrite(hFile,(LPSTR)lpBitmapCoreinfo,(WORD)Groesse))!=Groesse)
  1445.             {
  1446.               MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  1447.               GlobalUnlock(hMem);
  1448.               GlobalFree(hMem);
  1449.               GlobalUnlock(hBitmapCoreinfoMem);
  1450.               GlobalFree(hBitmapCoreinfoMem);
  1451.               return(FALSE);
  1452.             }
  1453.           }
  1454.  
  1455.           if(BegPosData1!=0)
  1456.           {
  1457.             _llseek(hFile,BegPosData1,0);
  1458.  
  1459.             if((Size=_lwrite(hFile,lpMem,(WORD)Size))!=Size)
  1460.             {
  1461.               MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  1462.               GlobalUnlock(hMem);
  1463.               GlobalFree(hMem);
  1464.               GlobalUnlock(hBitmapCoreinfoMem);
  1465.               GlobalFree(hBitmapCoreinfoMem);
  1466.               return(FALSE);
  1467.             }
  1468.           }
  1469.  
  1470.           GlobalUnlock(hMem);
  1471.           GlobalFree(hMem);
  1472.           GlobalUnlock(hBitmapCoreinfoMem);
  1473.           GlobalFree(hBitmapCoreinfoMem);
  1474.           GetObject(hXORBitmap,sizeof(BITMAP),(LPSTR)&Bitmap);
  1475.  
  1476.           Size1=Bitmap.bmWidth*Bitmap.bmHeight/8;
  1477.           OverBound=(Bitmap.bmWidth/8)%sizeof(LONG);
  1478.           if(OverBound) Size1+=(sizeof(LONG)-OverBound)*Bitmap.bmHeight;
  1479.  
  1480.           Size2=Size1;
  1481.  
  1482.           Groesse1=sizeof(BITMAPCOREHEADER)+2*sizeof(RGBTRIPLE);
  1483.  
  1484.           if ((hMem = GlobalAlloc(GMEM_MOVEABLE,Size1)) != NULL)
  1485.           {
  1486.             if((lpMem = GlobalLock(hMem)) != (LPSTR) NULL)
  1487.             {
  1488.               if ((hBitmapCoreinfoMem = GlobalAlloc(GMEM_MOVEABLE,Groesse1)) != NULL)
  1489.               {
  1490.                 if((lpBitmapCoreinfo = (LPBITMAPCOREINFO)GlobalLock(hBitmapCoreinfoMem)) != NULL)
  1491.                 {
  1492.                   lpBitmapCoreinfo->bmciHeader.bcSize=(long)sizeof(BITMAPCOREHEADER);
  1493.                   lpBitmapCoreinfo->bmciHeader.bcWidth=Bitmap.bmWidth;
  1494.                   lpBitmapCoreinfo->bmciHeader.bcHeight=Bitmap.bmHeight;
  1495.                   lpBitmapCoreinfo->bmciHeader.bcPlanes=1;
  1496.                   lpBitmapCoreinfo->bmciHeader.bcBitCount=1;
  1497.                   lpBitmapCoreinfo->bmciColors[0].rgbtRed=0;
  1498.                   lpBitmapCoreinfo->bmciColors[0].rgbtGreen=0;
  1499.                   lpBitmapCoreinfo->bmciColors[0].rgbtBlue=0;
  1500.                   lpBitmapCoreinfo->bmciColors[1].rgbtRed=0xff;
  1501.                   lpBitmapCoreinfo->bmciColors[1].rgbtGreen=0xff;
  1502.                   lpBitmapCoreinfo->bmciColors[1].rgbtBlue=0xff;
  1503.  
  1504.                   hDC=GetDC(NULL);
  1505.  
  1506.                   hXORBitmap2 = CreateDIBitmap(hDC,(LPBITMAPINFOHEADER)&(lpBitmapCoreinfo->bmciHeader),CBM_INIT,(LPSTR)lpMem,(LPBITMAPINFO)lpBitmapCoreinfo, DIB_RGB_COLORS);
  1507.  
  1508.                   hDC1=CreateCompatibleDC(hDC);
  1509.                   hDC2=CreateCompatibleDC(hDC);
  1510.                   hDC3=CreateCompatibleDC(hDC);
  1511.  
  1512.                   hOldBitmap1=SelectObject(hDC1,hXORBitmap);
  1513.                   hOldBitmap2=SelectObject(hDC2,hANDBitmap);
  1514.                   hOldBitmap3=SelectObject(hDC3,hXORBitmap2);
  1515.  
  1516.                   for(i=0;i<Bitmap.bmWidth;i++)
  1517.                   {
  1518.                     for(j=0;j<Bitmap.bmHeight;j++)
  1519.                     {
  1520.                       if(GetPixel(hDC2,i,j)==RGB(255,255,255))
  1521.                         SetPixel(hDC3,i,j,GetPixel(hDC1,i,j));
  1522.                       else
  1523.                         SetPixel(hDC3,i,j,RGB(0,0,0));
  1524.                     }
  1525.                   }
  1526.  
  1527.                   SelectObject(hDC1,hOldBitmap1);
  1528.                   SelectObject(hDC2,hOldBitmap2);
  1529.                   SelectObject(hDC3,hOldBitmap3);
  1530.  
  1531.                   DeleteDC(hDC1);
  1532.                   DeleteDC(hDC2);
  1533.                   DeleteDC(hDC3);
  1534.  
  1535.                   count = GetDIBits(hDC,hXORBitmap2,0,(WORD)lpBitmapCoreinfo->bmciHeader.bcHeight,(LPSTR)lpMem,(LPBITMAPINFO)lpBitmapCoreinfo,DIB_RGB_COLORS);
  1536.  
  1537.                   lpBitmapCoreinfo->bmciHeader.bcHeight*=2;
  1538.  
  1539.                   if(BegPosInfo2!=0)
  1540.                   {
  1541.                     _llseek(hFile,BegPosInfo2,0);
  1542.  
  1543.                     if((Groesse1=_lwrite(hFile,(LPSTR)lpBitmapCoreinfo,(WORD)Groesse1))!=Groesse1)
  1544.                     {
  1545.                       MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  1546.                       GlobalUnlock(hMem);
  1547.                       GlobalFree(hMem);
  1548.                       GlobalUnlock(hBitmapCoreinfoMem);
  1549.                       GlobalFree(hBitmapCoreinfoMem);
  1550.                       return(FALSE);
  1551.                     }
  1552.                   }
  1553.  
  1554.                   if(BegPosData2!=0)
  1555.                   {
  1556.                     _llseek(hFile,BegPosData2,0);
  1557.  
  1558.                     if((Size1=_lwrite(hFile,(LPSTR)lpMem,(WORD)Size1))!=Size1)
  1559.                     {
  1560.                       MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  1561.                       GlobalUnlock(hBitmapCoreinfoMem);
  1562.                       GlobalUnlock(hMem);
  1563.                       GlobalFree(hBitmapCoreinfoMem);
  1564.                       GlobalFree(hMem);
  1565.                       return (FALSE);
  1566.                     }
  1567.  
  1568.                     lpBitmapCoreinfo->bmciHeader.bcHeight/=2;
  1569.                     count = GetDIBits(hDC,hANDBitmap,0,(WORD)lpBitmapCoreinfo->bmciHeader.bcHeight,(LPSTR)lpMem,(LPBITMAPINFO)lpBitmapCoreinfo,DIB_RGB_COLORS);
  1570.  
  1571.                     if((Size2=_lwrite(hFile,(LPSTR)lpMem,(WORD)Size2))!=Size2)
  1572.                     {
  1573.                       MessageBox(hWnd,"Nicht genⁿgend freier Speicher auf Laufwerk!",NULL,MB_OK|MB_ICONHAND);
  1574.                       GlobalUnlock(hBitmapCoreinfoMem);
  1575.                       GlobalUnlock(hMem);
  1576.                       GlobalFree(hBitmapCoreinfoMem);
  1577.                       GlobalFree(hMem);
  1578.                       return (FALSE);
  1579.                     }
  1580.                   }
  1581.  
  1582.                   ReleaseDC(NULL,hDC);
  1583.  
  1584.                   GlobalUnlock(hBitmapCoreinfoMem);
  1585.                   GlobalUnlock(hMem);
  1586.                   GlobalFree(hBitmapCoreinfoMem);
  1587.                   GlobalFree(hMem);
  1588.                 }
  1589.               }
  1590.             }
  1591.           }
  1592.         }
  1593.       }
  1594.     }
  1595.   }
  1596.   return (Size+Size1+Size2);
  1597. }
  1598.  
  1599. /* ====================================================== */
  1600. /*                      Ende von ICON.C                   */
  1601.