Example #1
0
BOOL CNotifyWindow::Create(char *Subject, char *Subtext, char *Text)
{
    DWORD dwExStyle=WS_EX_TOOLWINDOW | WS_EX_TOPMOST;

    CRect rcPos(0,0,0,0);
    if(!WindowBase::Create(NULL,rcPos,"",WS_POPUP,dwExStyle))
        return FALSE;

    m_Image = new CxImage();
    _LoadIconFromResource(m_Image, "PNG", CXIMAGE_FORMAT_PNG, IDB_NOTIFYWINDOWBACK);


    HDC hdc;
    long h1, h2;

    hdc = ::GetDC(NULL);
    h1 = -MulDiv(12, GetDeviceCaps(hdc, LOGPIXELSY), 72);
    h2 = -MulDiv(9, GetDeviceCaps(hdc, LOGPIXELSY), 72);
    ::ReleaseDC(NULL, hdc);
    m_SubjectFont = CreateFont(h1, 0, 0, 0, FW_BOLD, FALSE, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, "Arial");
    m_TextFont = CreateFont(h2, 0, 0, 0, FW_NORMAL, FALSE, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, "Tahoma");

    m_Subject = new Buffer();
    m_Subject->Append(Subject);
    m_Text = new Buffer();
    m_Text->Append(Text);
    m_Subtext = new Buffer();
    if (*Subtext)
    {
        m_Subtext->Append("(");
        m_Subtext->Append(Subtext);
        m_Subtext->Append(")");
    }

    APPBARDATA	abd;
    memset(&abd, 0, sizeof(APPBARDATA));
    abd.cbSize = sizeof(APPBARDATA);
    SHAppBarMessage(ABM_GETTASKBARPOS, &abd);

    ::GetWindowRect(GetDesktopWindow(), &m_Rect);
    if (abd.uEdge == ABE_BOTTOM)
        m_Rect.bottom -= (abd.rc.bottom - abd.rc.top);
    if (abd.uEdge == ABE_RIGHT)
        m_Rect.right -= (abd.rc.right - abd.rc.left);

    m_Rect.top = m_Rect.bottom - m_Image->GetHeight();
    m_Rect.left = m_Rect.right - m_Image->GetWidth();

    memcpy(&m_ShowRect, &m_Rect, sizeof(RECT));
    m_ShowRect.top = m_Rect.bottom;
    SetWindowPos(NULL, &m_ShowRect, SWP_SHOWWINDOW | SWP_NOACTIVATE);

    SetTimer(1, 100);
    return TRUE;
}
void CProgressCtrlEx::OnPaint()
{
	CPaintDC paintDC(this);

	int nMin = 0;
	int nMax = 0;

	GetRange(nMin, nMax);
	ASSERT(nMin <= nMax);

	int nPos = GetPos();
	ASSERT(nPos >= nMin && nPos <= nMax);

	DWORD dwStyle = GetStyle();

	BOOL bVertical = FALSE;
	if (dwStyle & PBS_VERTICAL)
	{
		bVertical = TRUE;
	}

	CDC dc;
	dc.CreateCompatibleDC(&paintDC);
	ASSERT(dc.GetSafeHdc());

	CRect rect;
	GetClientRect(&rect);

	CBitmap bmp;
	bmp.CreateCompatibleBitmap(&paintDC, rect.Width(), rect.Height());
	ASSERT(bmp.GetSafeHandle());

	CBitmap* pOldBitmap = (CBitmap*)dc.SelectObject(&bmp);

	CFont* pOldFont = NULL;
	CWnd* pParent = GetParent();
	ASSERT(pParent);

	CFont* pFont = pParent->GetFont();
	ASSERT(pFont);
	if (bVertical)
	{
		if (NULL == m_font.GetSafeHandle())
		{
			LOGFONT lf = { 0 };
			pFont->GetLogFont(&lf);
			lf.lfEscapement = 900;
			m_font.CreateFontIndirect(&lf);
		}
		ASSERT(m_font.GetSafeHandle());
		pOldFont = (CFont*)dc.SelectObject(&m_font);
	}
	else
	{
		pOldFont = (CFont*)dc.SelectObject(pFont);
	}

	double dPercent = (double)(nPos - nMin) / ((double)(nMax - nMin));

	dc.DrawEdge(rect, EDGE_SUNKEN, BF_RECT | BF_FLAT);

	CRect rc(rect);
	rc.DeflateRect(CSize(2, 2));
	dc.FillSolidRect(&rc, m_clrBarBkColor);

	CString strText(_T(""));
	GetWindowText(strText);

	if (m_bShowPercent)
	{
		strText.AppendFormat(_T("%d%% "), static_cast<int>((dPercent * 100.0) + 0.5));
	}

	dc.SetBkMode(TRANSPARENT);
	dc.SetTextColor(m_clrTextColor);

	CPoint pt(0, 0);
	CSize size = dc.GetOutputTextExtent(strText);

	if (!bVertical)
	{
		switch (m_AlignText)
		{
		case ALIGN_LEFT:
			pt.x = rc.left;
			break;

		case ALIGN_RIGHT:
			pt.x = rc.right - size.cx;
			break;

		case ALIGN_CENTER:
		default:
			pt.x = rc.left + (rc.Width() - size.cx) / 2;
			break;
		}
		pt.y = rc.top + (rc.Height() - size.cy) / 2;

		CRect rcPos(rc);

		rcPos.right = rcPos.left + (int)(dPercent * rcPos.Width());
		dc.FillSolidRect(rcPos, m_clrBarColor);

		dc.SetTextColor(m_clrTextColor);
		dc.ExtTextOut(pt.x, pt.y, ETO_OPAQUE, rcPos, strText, NULL);

		dc.SetTextColor(m_clrTextBkColor);
		dc.ExtTextOut(pt.x, pt.y, ETO_CLIPPED, &rcPos, strText, NULL);
	}
	else
	{
		switch (m_AlignText)
		{
		case ALIGN_LEFT:
			pt.y = rc.bottom;
			break;

		case ALIGN_RIGHT:
			pt.y = rc.top + size.cx;
			break;

		case ALIGN_CENTER:
		default:
			pt.y = rc.bottom - (rc.Height() - size.cx) / 2;
			break;
		}
		pt.x = rc.left + (rc.Width() - size.cy) / 2;

		CRect rcPos(rc);

		rcPos.top = rcPos.bottom - (int)(dPercent * rcPos.Height());
		dc.FillSolidRect(rcPos, m_clrBarColor);

		dc.SetTextColor(m_clrTextColor);
		dc.ExtTextOut(pt.x, pt.y, ETO_OPAQUE, rcPos, strText, NULL);

		dc.SetTextColor(m_clrTextBkColor);
		dc.ExtTextOut(pt.x, pt.y, ETO_CLIPPED, &rcPos, strText, NULL);
	}

	paintDC.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &dc, 0, 0, SRCCOPY);

	dc.SelectObject(pOldFont);
	dc.SelectObject(pOldBitmap);
	bmp.DeleteObject();

	dc.DeleteDC();
}