// // maskbmp.cpp // #include "private.h" #include "globals.h" #include "maskbmp.h" extern HINSTANCE g_hInst; // // from CUILIB.LIB // extern CBitmapDC *g_phdcSrc; extern CBitmapDC *g_phdcMask; extern CBitmapDC *g_phdcDst; ////////////////////////////////////////////////////////////////////////////// // // misc func // ////////////////////////////////////////////////////////////////////////////// //+--------------------------------------------------------------------------- // // StretchIcon // //---------------------------------------------------------------------------- HICON StretchIcon(HICON hIcon, int cxNew, int cyNew) { BITMAP bmp; ICONINFO ii; HICON hIconRet = NULL; GetIconInfo(hIcon, &ii); GetObject(ii.hbmMask, sizeof(BITMAP), &bmp); if ((bmp.bmWidth == cxNew) && (bmp.bmHeight == cyNew)) { hIconRet = (HICON)CopyImage(hIcon, IMAGE_ICON, cxNew, cyNew, LR_COPYFROMRESOURCE); goto Exit; } g_phdcDst->SetDIB(cxNew, cyNew); g_phdcSrc->SetDIB(bmp.bmWidth, bmp.bmHeight); DrawIconEx(*g_phdcSrc, 0, 0, hIcon, bmp.bmWidth, bmp.bmHeight, 0, NULL, DI_IMAGE); SetStretchBltMode(*g_phdcDst, HALFTONE); StretchBlt(*g_phdcDst, 0, 0, cxNew, cyNew, *g_phdcSrc, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY); g_phdcSrc->Uninit(); g_phdcSrc->SetBitmap(bmp.bmWidth, bmp.bmHeight, 1, 1); g_phdcMask->SetBitmap(cxNew, cyNew, 1, 1); DrawIconEx(*g_phdcSrc, 0, 0, hIcon, bmp.bmWidth, bmp.bmHeight, 0, NULL, DI_MASK); StretchBlt(*g_phdcMask, 0, 0, cxNew, cyNew, *g_phdcSrc, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY); ii.fIcon = TRUE; ii.xHotspot = 0; ii.yHotspot = 0; DeleteObject(ii.hbmMask); DeleteObject(ii.hbmColor); ii.hbmMask = g_phdcMask->GetBitmapAndKeep(); ii.hbmColor = g_phdcDst->GetBitmapAndKeep(); g_phdcMask->Uninit(); g_phdcDst->Uninit(); g_phdcSrc->Uninit(); hIconRet= CreateIconIndirect(&ii); Exit: DeleteObject(ii.hbmMask); DeleteObject(ii.hbmColor); return hIconRet; } ////////////////////////////////////////////////////////////////////////////// // // CMaskBitmap // ////////////////////////////////////////////////////////////////////////////// //+--------------------------------------------------------------------------- // // Init // //---------------------------------------------------------------------------- BOOL CMaskBitmap::Init(int nId, int cx, int cy, COLORREF rgb) { Clear(); CSolidBrush hbrFore(rgb); HBRUSH hbrBlack = (HBRUSH)GetStockObject(BLACK_BRUSH); HBRUSH hbrWhite = (HBRUSH)GetStockObject(WHITE_BRUSH); RECT rc; g_phdcMask->SetBitmap(cx, cy, 1, 1); g_phdcDst->SetDIB(cx, cy); g_phdcSrc->SetBitmapFromRes(g_hInst, MAKEINTRESOURCE(nId)); ::SetRect(&rc, 0, 0, cx, cy); FillRect(*g_phdcDst, &rc, hbrBlack); FillRect(*g_phdcMask, &rc, hbrWhite); // // draw caps bitmap // // src ::SetRect(&rc, 0, 0, cx, cy); FillRect(*g_phdcDst, &rc, hbrFore); BitBlt(*g_phdcDst, 0, 0, cx, cy, *g_phdcSrc, 0, 0, SRCAND); // mask BitBlt(*g_phdcMask, 0, 0, cx, cy, *g_phdcSrc, 0, 0, SRCINVERT); g_phdcSrc->Uninit(); g_phdcMask->Uninit(TRUE); g_phdcDst->Uninit(TRUE); _hbmp = g_phdcDst->GetBitmapAndKeep(); _hbmpMask = g_phdcMask->GetBitmapAndKeep(); DeleteObject(hbrBlack); DeleteObject(hbrWhite); return TRUE; } //+--------------------------------------------------------------------------- // // Init // //---------------------------------------------------------------------------- BOOL CMaskBitmap::Init(HICON hIcon, int cx, int cy, COLORREF rgb) { Clear(); CSolidBrush hbrFore(rgb); HBRUSH hbrBlack = (HBRUSH)GetStockObject(BLACK_BRUSH); HBRUSH hbrWhite = (HBRUSH)GetStockObject(WHITE_BRUSH); RECT rc; g_phdcMask->SetBitmap(cx, cy, 1, 1); g_phdcDst->SetDIB(cx, cy); g_phdcSrc->SetDIB(cx, cy); // // flip mask of Icon. // DrawIconEx(*g_phdcDst, 0, 0, hIcon, cx, cy, 0, NULL, DI_MASK); ::SetRect(&rc, 0, 0, cx, cy); FillRect(*g_phdcSrc, &rc, hbrWhite); BitBlt(*g_phdcSrc, 0, 0, cx, cy, *g_phdcDst, 0, 0, SRCINVERT); // // draw caps bitmap // // // src // ::SetRect(&rc, 0, 0, cx, cy); FillRect(*g_phdcDst, &rc, hbrFore); BitBlt(*g_phdcDst, 0, 0, cx, cy, *g_phdcSrc, 0, 0, SRCAND); // // mask // ::SetRect(&rc, 0, 0, cx, cy); FillRect(*g_phdcMask, &rc, hbrWhite); BitBlt(*g_phdcMask, 0, 0, cx, cy, *g_phdcSrc, 0, 0, SRCINVERT); // // Draw white area for image. // FillRect(*g_phdcSrc, &rc, hbrBlack); DrawIconEx(*g_phdcSrc, 0, 0, hIcon, cx, cy, 0, NULL, DI_IMAGE); BitBlt(*g_phdcDst, 0, 0, cx, cy, *g_phdcSrc, 0, 0, SRCPAINT); g_phdcSrc->Uninit(); g_phdcMask->Uninit(TRUE); g_phdcDst->Uninit(TRUE); _hbmp = g_phdcDst->GetBitmapAndKeep(); _hbmpMask = g_phdcMask->GetBitmapAndKeep(); DeleteObject(hbrBlack); DeleteObject(hbrWhite); return TRUE; }