HICON CMeterIcon::CreateMeterIcon(int *pBarData) // the returned icon must be cleaned up using DestroyIcon() {// begin CreateMeterIcon ICONINFO iiNewIcon; iiNewIcon.fIcon = true; // set that it is an icon // create DC's HDC hScreenDC = ::GetDC(NULL); HDC hIconDC = CreateCompatibleDC(hScreenDC); HDC hMaskDC = CreateCompatibleDC(hScreenDC); if(hScreenDC == NULL) {// begin error check return NULL; }// end error check if(hIconDC == NULL) {// begin error check return NULL; }// end error check if(hMaskDC == NULL) {// begin error check return NULL; }// end error check // load bitmaps iiNewIcon.hbmColor = CreateCompatibleBitmap(hScreenDC,m_sDimensions.cx,m_sDimensions.cy); if(iiNewIcon.hbmColor == NULL) {// begin error check return NULL; }// end error check if(!::ReleaseDC(NULL,hScreenDC)) // release this ASAP {// begin DC not released return NULL; }// end DC not released iiNewIcon.hbmMask = CreateCompatibleBitmap(hMaskDC,m_sDimensions.cx,m_sDimensions.cy); if(iiNewIcon.hbmMask == NULL) {// begin error check return NULL; }// end error check HGDIOBJ hOldIconDC = ::SelectObject(hIconDC,iiNewIcon.hbmColor); if(hOldIconDC == NULL) {// begin error check return NULL; }// end error check HGDIOBJ hOldMaskDC = ::SelectObject(hMaskDC,iiNewIcon.hbmMask); if(hOldMaskDC == NULL) {// begin error check return NULL; }// end error check // initilize the bitmaps if(!BitBlt(hIconDC,0,0,m_sDimensions.cx,m_sDimensions.cy,NULL,0,0,BLACKNESS)) {// begin BitBlt failed return NULL; }// end BitBlt failed if(!BitBlt(hMaskDC,0,0,m_sDimensions.cx,m_sDimensions.cy,NULL,0,0,WHITENESS)) {// begin BitBlt failed return NULL; }// end BitBlt failed // draw the meters for(int i = 0;i < m_nNumBars;i++) if(DrawIconMeter(hIconDC,hMaskDC,pBarData[i],i) == false) return false; if(!DrawIconEx(hIconDC,0,0,m_hFrame,m_sDimensions.cx,m_sDimensions.cy,NULL,NULL,DI_NORMAL|DI_IMAGE)) {// begin error check return NULL; }// end error check if(!DrawIconEx(hMaskDC,0,0,m_hFrame,m_sDimensions.cx,m_sDimensions.cy,NULL,NULL,DI_NORMAL|DI_MASK)) {// begin error check return NULL; }// end error check // create icon ::SelectObject(hIconDC,hOldIconDC); ::SelectObject(hMaskDC,hOldMaskDC); HICON hNewIcon = CreateIconIndirect(&iiNewIcon); // cleanup DeleteObject(iiNewIcon.hbmColor); DeleteObject(iiNewIcon.hbmMask); DeleteDC(hMaskDC); DeleteDC(hIconDC); return hNewIcon; }// end CreateMeterIcon
HICON CreateMeterIcon(UINT nBaseIconID, int cx, int cy, int iMaxVal, int iCurVal, COLORREF crMeter, COLORREF crBorder) { EMULE_TRY ICONINFO iiNewIcon; ::ZeroMemory(&iiNewIcon,sizeof(ICONINFO)); iiNewIcon.fIcon = TRUE; HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(nBaseIconID), IMAGE_ICON, cx, cy, LR_DEFAULTCOLOR); if(hIcon == NULL) return NULL; HWND hDesktopWnd = ::GetDesktopWindow(); if(hDesktopWnd == NULL) return hIcon; HDC hDesktopDC = ::GetDC(hDesktopWnd); if(hDesktopDC == NULL) return hIcon; HDC hIconDC = ::CreateCompatibleDC(hDesktopDC); iiNewIcon.hbmColor = ::CreateCompatibleBitmap(hDesktopDC, cx, cy); HBITMAP hOldIconBMP = (HBITMAP)::SelectObject(hIconDC, iiNewIcon.hbmColor); ::PatBlt(hIconDC, 0, 0, cx, cy, BLACKNESS); ::DrawIconEx(hIconDC, 0, 0, hIcon, cx, cy, 0, NULL, DI_NORMAL); DrawIconMeter(hIconDC, iMaxVal, iCurVal, cx, cy, crMeter, crBorder); iiNewIcon.hbmMask = ::CreateCompatibleBitmap(hDesktopDC, cx, cy); ::SelectObject(hIconDC, iiNewIcon.hbmMask); ::PatBlt(hIconDC, 0, 0, cx, cy, WHITENESS); ::DrawIconEx(hIconDC, 0, 0, hIcon, cx, cy, 0, NULL, DI_NORMAL); DrawIconMeter(hIconDC, iMaxVal, iCurVal, cx, cy, 0, 0); ::SelectObject(hIconDC, hOldIconBMP); ::DestroyIcon(hIcon); hIcon = CreateIconIndirect(&iiNewIcon); //if(hIcon == NULL) //{ // LPVOID lpMsgBuf; // FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | // FORMAT_MESSAGE_FROM_SYSTEM | // FORMAT_MESSAGE_IGNORE_INSERTS, // NULL, GetLastError(), // MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language // (LPTSTR)&lpMsgBuf, 0, NULL); // MessageBox(NULL, (LPCTSTR)lpMsgBuf, _T("Error"), MB_OK|MB_ICONINFORMATION); // LocalFree(lpMsgBuf); //} ::DeleteObject(iiNewIcon.hbmColor); ::DeleteObject(iiNewIcon.hbmMask); ::DeleteDC(hIconDC); ::ReleaseDC(hDesktopWnd, hDesktopDC); return hIcon; EMULE_CATCH return NULL; }