www.pudn.com > 完整的FTP客户端ftpwanderersrc.zip > InfobarCtrl.cpp
/****************************************************************/
/* */
/* InfobarCtrl.cpp */
/* */
/* Implementation of the CInfobarCtrl class. */
/* This class imitates the outlook infobar. */
/* */
/* Programmed by Pablo van der Meer */
/* Copyright Pablo Software Solutions 2002 */
/* http://www.pablovandermeer.nl */
/* */
/* Last updated: 15 may 2002 */
/* */
/****************************************************************/
#include "stdafx.h"
#include "resource.h"
#include "InfobarCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CInfobarCtrl::CInfobarCtrl()
{
m_bMouseInButton = FALSE;
m_bMouseDown = FALSE;
}
CInfobarCtrl::~CInfobarCtrl()
{
}
BEGIN_MESSAGE_MAP(CInfobarCtrl, CStatic)
//{{AFX_MSG_MAP(CInfobarCtrl)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/********************************************************************/
/* */
/* Function name : OnPaint */
/* Description : This is where all the painting of our control */
/* takes place. */
/* */
/********************************************************************/
void CInfobarCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC memDC;
CBitmap memBitmap;
CBitmap* pOldBitmap;
CRect rcClient;
GetClientRect(&rcClient);
// to avoid flicker, establish a memory dc, draw to it and then BitBlt it to the client
memDC.CreateCompatibleDC(&dc);
memBitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
pOldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap);
// paint background
memDC.FillSolidRect(rcClient, GetSysColor(COLOR_3DSHADOW));
// select font
CFont* pOldFont = (CFont*)memDC.SelectObject(&m_TextFont);
COLORREF oldTextColor;
int nBkMode = memDC.SetBkMode(TRANSPARENT);
// set text color to white
oldTextColor = memDC.SetTextColor(RGB(255,255,255));
CRect rcItem = m_rcButton;
if (rcItem.right >= rcClient.right)
rcItem.right = rcClient.right-1;
if (m_bMouseInButton)
{
if (m_bMouseDown)
memDC.Draw3dRect(rcItem, RGB(0,0,0), RGB(255,255,255));
else
memDC.Draw3dRect(rcItem, RGB(255,255,255), RGB(0,0,0));
}
rcItem.DeflateRect(5, 0);
rcItem.right -= 12;
// draw text
::DrawTextEx(memDC.m_hDC,
m_strText.GetBuffer (0),
m_strText.GetLength(),
&rcItem,
DT_SINGLELINE | DT_VCENTER | DT_LEFT | DT_PATH_ELLIPSIS,
NULL);
// finally send the result to the display
dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY);
// restore old values
memDC.SelectObject(pOldFont);
memDC.SetTextColor(oldTextColor);
memDC.SetBkMode(nBkMode);
memDC.SelectObject(pOldBitmap);
}
/********************************************************************/
/* */
/* Function name : SetText */
/* Description : Set text of the control */
/* */
/********************************************************************/
void CInfobarCtrl::SetText(LPCTSTR lpszText)
{
m_strText = lpszText;
CClientDC dc(this);
CFont* pFont = (CFont*)dc.SelectObject(&m_TextFont);
CRect rcClient;
GetClientRect(&rcClient);
// calculate new button rect
CSize size = dc.GetTextExtent(m_strText);
size.cx += 22;
size.cy = rcClient.Height()-2;
m_rcButton = CRect(CPoint(1, 1), size);
dc.SelectObject(pFont);
Invalidate();
}
/********************************************************************/
/* */
/* Function name : PreSubclassWindow */
/* Description : Initialize control variables */
/* */
/********************************************************************/
void CInfobarCtrl::PreSubclassWindow()
{
m_TextFont.CreateFont(16, 0,0,0,FW_BOLD, 0,0,0,
DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial");
CStatic::PreSubclassWindow();
}