Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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;
}