lpDIB) { LPBITMAPINFOHEADER lpbmi; LPBITMAPCOREHEADER lpbmc;
lpbmi=(LPBITMAPINFOHEADER)lpDIB; lpbmc=(LPBITMAPCOREHEADER)lpDIB; if(IS_WIN30_DIB(lpDIB)) return lpbmi->biHeight; else return (DWORD)lpbmc->bcHeight; } BOOL WINAPI PaintDIB(HDC hDC,LPRECT lpDCRect,HDIB hDIB,LPRECT lpDIBRect,CPalette* pPal) { LPSTR lpDIBHdr; LPSTR lpDIBBits; BOOL bSuccess=FALSE; HPALETTE hPal=NULL; HPALETTE hOldPal=NULL; if(hDIB==NULL) return FALSE; lpDIBHdr=(LPSTR)::GlobalLock((HGLOBAL)hDIB); lpDIBBits=FindDIBBits(lpDIBHdr); if(pPal!=NULL) { hPal=(HPALETTE)pPal->m_hObject; hOldPal=::SelectPalette(hDC,hPal,TRUE); } ::SetStretchBltMode(hDC,COLORONCOLOR);
if((RECTWIDTH(lpDCRect)==RECTWIDTH(lpDIBRect))&;&;(RECTHEIGHT(lp DCRect)==RECTHEIGHT(lpDIBRect))) { bSuccess=::SetDIBitsToDevice(hDC,lpDCRect->left,lpDCRect->top,RECTWI DTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\
(int)DIBHeight(lpDIBHdr)-lpDIBRect->top-RECTHEIGHT(lpDIBRect),0,(WOR D)DIBHeight(lpDIBHdr),\ lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS); } else { bSuccess=::StretchDIBits(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(l pDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\ lpDIBRect->top,RECTWIDTH(lpDIBRect),RECTHEIGHT(lpDIBRect),\ lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY); } ::GlobalUnlock((HGLOBAL)hDIB); if(hOldPal) ::SelectPalette(hDC,hOldPal,TRUE); GlobalUnlock(hDIB); return bSuccess; } BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette* pPal) { LPLOGPALETTE lpPal; HANDLE hLogPal; HPALETTE hPal=NULL; LPSTR lpbi; LPBITMAPINFO lpbmi; LPBITMAPCOREINFO lpbmc; BOOL bWinStyleDIB; int i; WORD wNumColors; BOOL bResult=FALSE; if(hDIB==NULL) return FALSE; lpbi=(LPSTR)::GlobalLock((HGLOBAL)hDIB); lpbmi=(LPBITMAPINFO)lpbi;
lpbmc=(LPBITMAPCOREINFO)lpbi; wNumColors=DIBNumColors(lpbi); bWinStyleDIB=IS_WIN30_DIB(lpbi); if(wNumColors!=0) { hLogPal=::GlobalAlloc(GHND,sizeof(LOGPALETTE)+sizeof(PALETTEENTR Y)*wNumColors); if(hLogPal==0) { ::GlobalUnlock((HGLOBAL)hDIB); return FALSE; } lpPal=(LPLOGPALETTE)::GlobalLock(hLogPal); lpPal->palVersion=PALVERSION; lpPal->palNumEntries=(WORD)wNumColors; bWinStyleDIB=IS_WIN30_DIB(lpbi); for(i=0;i<(int)wNumColors;i++) { if(bWinStyleDIB) { lpPal->palPalEntry[i].peRed=lpbmi->bmiColors[i].rgbRed; lpPal->palPalEntry[i].peGreen=lpbmi->bmiColors[i].rgbGreen; lpPal->palPalEntry[i].peBlue=lpbmi->bmiColors[i].rgbBlue; lpPal->palPalEntry[i].peFlags=0; } else { lpPal->palPalEntry[i].peRed=lpbmc->bmciColors[i].rgbtRed; lpPal->pal
PalEntry[i].peGreen=lpbmc->bmciColors[i].rgbtGreen; lpPal->palPalEntry[i].peBlue=lpbmc->bmciColors[i].rgbtBlue; lpPal->palPalEntry[i].peFlags=0; } }
bResult=pPal->CreatePalette(lpPal); ::GlobalUnlock((HGLOBAL)hLogPal); ::GlobalFree((HGLOBAL)hLogPal); } ::GlobalUnlock((HGLOBAL)hDIB); return bResult; }
HGLOBAL WINAPI CopyHandle(HGLOBAL h) { if(h==NULL) return NULL; DWORD dwLen=::GlobalSize((HGLOBAL)h); HGLOBAL hCopy=::GlobalAlloc(GHND,dwLen); if(hCopy!=NULL) { void* lpCopy=::GlobalLock((HGLOBAL)hCopy); void* lp=::GlobalLock((HGLOBAL)h); memcpy(lpCopy,lp,dwLen); ::GlobalUnlock(hCopy); ::GlobalUnlock(h); } return hCopy; } BOOL WINAPI S