void wxIcon::CopyFromBitmap(const wxBitmap& bmp) { #ifndef __WXMICROWIN__ HICON hicon = wxBitmapToHICON(bmp); if ( !hicon ) { wxLogLastError(wxT("CreateIconIndirect")); } else { SetHICON((WXHICON)hicon); SetSize(bmp.GetWidth(), bmp.GetHeight()); } #endif // __WXMICROWIN__ }
void wxIcon::CopyFromBitmap( const wxBitmap& rBmp ) { wxMask* pMask = rBmp.GetMask(); HBITMAP hBmp = NULLHANDLE; HBITMAP hBmpMask = NULLHANDLE; HBITMAP hOldBitmap = NULLHANDLE; ERRORID vError; wxString sError; LONG lHits; if (!pMask) { // // We must have a mask for an icon, so even if it's probably incorrect, // do create it (grey is the "standard" transparent colour) // pMask = new wxMask( rBmp ,*wxLIGHT_GREY ); } BITMAPINFOHEADER2 vHeader; SIZEL vSize = {0, 0}; DEVOPENSTRUC vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L}; HDC hDCSrc = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE); HDC hDCDst = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE); HPS hPSSrc = ::GpiCreatePS(vHabmain, hDCSrc, &vSize, PU_PELS | GPIA_ASSOC); HPS hPSDst = ::GpiCreatePS(vHabmain, hDCDst, &vSize, PU_PELS | GPIA_ASSOC); POINTL vPoint[4] = { {0, 0}, {rBmp.GetWidth(), rBmp.GetHeight()}, {0, 0}, {rBmp.GetWidth(), rBmp.GetHeight()} }; POINTL vPointMask[4] = { {0, 0}, {rBmp.GetWidth(), rBmp.GetHeight() * 2}, {0, 0}, {rBmp.GetWidth(), rBmp.GetHeight()} }; POINTERINFO vIconInfo; memset(&vIconInfo, '\0', sizeof(POINTERINFO)); vIconInfo.fPointer = FALSE; // we want an icon, not a pointer memset(&vHeader, '\0', 16); vHeader.cbFix = 16; vHeader.cx = (ULONG)rBmp.GetWidth(); vHeader.cy = (ULONG)rBmp.GetHeight(); vHeader.cPlanes = 1L; vHeader.cBitCount = 24; hBmp = ::GpiCreateBitmap( hPSDst ,&vHeader ,0L ,NULL ,NULL ); if ((hOldBitmap = ::GpiSetBitmap(hPSDst, hBmp)) == HBM_ERROR) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } if ((hOldBitmap = ::GpiSetBitmap(hPSSrc, (HBITMAP)rBmp.GetHBITMAP())) == HBM_ERROR) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } if ((lHits = ::GpiBitBlt( hPSDst ,hPSSrc ,4L ,vPoint ,ROP_SRCCOPY ,BBO_IGNORE )) == GPI_ERROR) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } if ((hOldBitmap = ::GpiSetBitmap(hPSDst, NULLHANDLE)) == HBM_ERROR) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } if ((hOldBitmap = ::GpiSetBitmap(hPSSrc, NULLHANDLE)) == HBM_ERROR) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } vIconInfo.hbmColor = hBmp; vHeader.cy = (ULONG)rBmp.GetHeight() * 2; hBmpMask = ::GpiCreateBitmap( hPSDst ,&vHeader ,0L ,NULL ,NULL ); if ((hOldBitmap = ::GpiSetBitmap(hPSDst, hBmpMask)) == HBM_ERROR) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } if ((hOldBitmap = ::GpiSetBitmap(hPSSrc, (HBITMAP)pMask->GetMaskBitmap())) == HBM_ERROR) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } if ((lHits = ::GpiBitBlt( hPSDst ,hPSSrc ,4L ,vPointMask ,ROP_SRCCOPY ,BBO_IGNORE )) == GPI_ERROR) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } if ((hOldBitmap = ::GpiSetBitmap(hPSSrc, NULLHANDLE)) == HBM_ERROR) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } if ((hOldBitmap = ::GpiSetBitmap(hPSDst, NULLHANDLE)) == HBM_ERROR) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } vIconInfo.hbmPointer = hBmpMask; HICON hIcon = ::WinCreatePointerIndirect( HWND_DESKTOP ,&vIconInfo ); if (!hIcon) { wxLogLastError(wxT("WinCreatePointerIndirect")); vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } else { SetHICON((WXHICON)hIcon); SetSize( rBmp.GetWidth() ,rBmp.GetHeight() ); } if (!rBmp.GetMask()) { // // We created the mask, now delete it // delete pMask; } ::GpiSetBitmap(hPSSrc, NULL); ::GpiSetBitmap(hPSDst, NULL); ::GpiDestroyPS(hPSSrc); ::GpiDestroyPS(hPSDst); ::DevCloseDC(hDCSrc); ::DevCloseDC(hDCDst); } // end of wxIcon::CopyFromBitmap