// // iconlib.cpp // #include "private.h" #include "cmydc.h" #include "iconlib.h" /* G E T I C O N S I Z E */ /*------------------------------------------------------------------------------ get icon size ------------------------------------------------------------------------------*/ BOOL GetIconSize( HICON hIcon, SIZE *psize ) { ICONINFO IconInfo; BITMAP bmp; Assert( hIcon != NULL ); if (!GetIconInfo( hIcon, &IconInfo )) return FALSE; GetObject( IconInfo.hbmColor, sizeof(bmp), &bmp ); DeleteObject( IconInfo.hbmColor ); DeleteObject( IconInfo.hbmMask ); psize->cx = bmp.bmWidth; psize->cy = bmp.bmHeight; return TRUE; } //+--------------------------------------------------------------------------- // // GetIconBitmaps // //---------------------------------------------------------------------------- BOOL GetIconBitmaps(HICON hIcon, HBITMAP *phbmp, HBITMAP *phbmpMask, SIZE *psize) { CBitmapDC hdcSrc(TRUE); CBitmapDC hdcMask(TRUE); SIZE size; if (psize) size = *psize; else if (!GetIconSize( hIcon, &size)) return FALSE; hdcSrc.SetCompatibleBitmap(size.cx, size.cy); // hdcMask.SetCompatibleBitmap(size.cx, size.cy); hdcMask.SetBitmap(size.cx, size.cy, 1, 1); RECT rc = {0, 0, size.cx, size.cy}; FillRect(hdcSrc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); DrawIconEx(hdcSrc, 0, 0, hIcon, size.cx, size.cy, 0, NULL, DI_NORMAL); DrawIconEx(hdcMask, 0, 0, hIcon, size.cx, size.cy, 0, NULL, DI_MASK); *phbmp = hdcSrc.GetBitmapAndKeep(); *phbmpMask = hdcMask.GetBitmapAndKeep(); return TRUE; } //+--------------------------------------------------------------------------- // // GetIconDIBitmaps // //---------------------------------------------------------------------------- BOOL GetIconDIBitmaps(HICON hIcon, HBITMAP *phbmp, HBITMAP *phbmpMask, SIZE *psize) { CBitmapDC hdcSrc(TRUE); CBitmapDC hdcMask(TRUE); SIZE size; if (psize) size = *psize; else if (!GetIconSize( hIcon, &size)) return FALSE; hdcSrc.SetDIB(size.cx, size.cy); // hdcMask.SetCompatibleBitmap(size.cx, size.cy); hdcMask.SetBitmap(size.cx, size.cy, 1, 1); RECT rc = {0, 0, size.cx, size.cy}; FillRect(hdcSrc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); DrawIconEx(hdcSrc, 0, 0, hIcon, size.cx, size.cy, 0, NULL, DI_NORMAL); DrawIconEx(hdcMask, 0, 0, hIcon, size.cx, size.cy, 0, NULL, DI_MASK); *phbmp = hdcSrc.GetBitmapAndKeep(); *phbmpMask = hdcMask.GetBitmapAndKeep(); return TRUE; } //+--------------------------------------------------------------------------- // // GetMenuIconHeight // //---------------------------------------------------------------------------- int GetMenuIconHeight(int *pnMenuFontHeghti) { int nMenuFontHeight; int cxSmIcon = GetSystemMetrics( SM_CXSMICON ); NONCLIENTMETRICS ncm; int cyMenu = GetSystemMetrics(SM_CYMENU); ncm.cbSize = sizeof(ncm); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, FALSE); nMenuFontHeight = (ncm.lfMenuFont.lfHeight > 0) ? ncm.lfMenuFont.lfHeight : -ncm.lfMenuFont.lfHeight; if (pnMenuFontHeghti) *pnMenuFontHeghti = nMenuFontHeight; // // CUIMENU.CPP uses 8 as TextMargin of dropdown menu. // if ((nMenuFontHeight + 8 >= cxSmIcon) && (nMenuFontHeight <= cxSmIcon)) return cxSmIcon; return nMenuFontHeight + 4; }