www.pudn.com > gui_Outlook.rar > CJOutlookBar.cpp
// CJOutlookBar.cpp : implementation file
//
// Copyright © 1998 Written by Kirk Stowell
// mailto:kstowel@sprynet.com
// http://www.geocities.com/SiliconValley/Haven/8230
//
// This code may be used in compiled form in any way you desire. This
// file may be redistributed unmodified by any means PROVIDING it is
// not sold for profit without the authors written consent, and
// providing that this notice and the authors name and all copyright
// notices remains intact. If the source code in this file is used in
// any commercial application then a statement along the lines of
// "Portions Copyright © 1998 Kirk Stowell" must be included in
// the startup banner, "About" box or printed documentation. An email
// letting me know that you are using it would be nice as well. That's
// not much to ask considering the amount of work that went into this.
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability for any damage/loss of business that
// this product may cause.
//
// ==========================================================================
// HISTORY:
// ==========================================================================
// 1.00 17 Oct 1998 - Initial re-write and release.
// ==========================================================================
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CJOutlookBar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCJOutlookBar
CCJOutlookBar::CCJOutlookBar()
{
m_bLBDown = false;
m_bHilight = true;
}
CCJOutlookBar::~CCJOutlookBar()
{
// TODO: add destruction code here.
}
IMPLEMENT_DYNAMIC(CCJOutlookBar, CListBox)
BEGIN_MESSAGE_MAP(CCJOutlookBar, CListBox)
//{{AFX_MSG_MAP(CCJOutlookBar)
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCJOutlookBar message handlers
// Checks mouse movement, sets point member, sets timer.
void CCJOutlookBar::OnMouseMove(UINT nFlags, CPoint point)
{
m_point = point;
SetTimer (1, 10, NULL);
CListBox::OnMouseMove(nFlags, point);
}
// Sets bLBDown member to true, and sets current selection
void CCJOutlookBar::OnLButtonDown(UINT nFlags, CPoint point)
{
m_bLBDown = true;
SetCurSel(GetCurSel());
CListBox::OnLButtonDown(nFlags, point);
}
// Sets bLBDown member to false, and sets current selection
void CCJOutlookBar::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bLBDown = false;
SetCurSel(GetCurSel());
p_Owner->SendMessage(WM_OUTLOOKBAR_NOTIFY,
OBM_ITEMCLICK, GetCurSel());
CListBox::OnLButtonUp(nFlags, point);
}
// Sets the hilite flag based on cursor position.
void CCJOutlookBar::OnTimer(UINT nIDEvent)
{
BOOL bOutSide;
CRect rItem;
CRect rWindow;
CPoint pt;
int nIndex;
// Get the rect of the current window,
// get the current cursor position.
GetWindowRect (rWindow);
GetCursorPos (&pt);
// If the mouse is in the rect of this window,
// set hilite flag to true, get the item that
// the mouse is over.
if (rWindow.PtInRect (pt)) {
m_bHilight = true;
nIndex = ItemFromPoint (m_point, bOutSide);
if (nIndex != GetCurSel() && !bOutSide) {
SetCurSel( nIndex );
}
}
// If the mouse is not in the rect of
// this window, kill the timer, set hilite flag
// to false, and return.
else {
m_bHilight = false;
if( !m_bLBDown ) {
SetCurSel (-1);
}
KillTimer(1);
}
}
//////////////////////////////
// Initial draw routine, draws button on mouse over,
// on mouse press, and on mouse out.
void CCJOutlookBar::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
CRect rcItem(lpDrawItemStruct->rcItem);
CRect rClient(rcItem);
CRect rText;
CPoint Pt(((rcItem.Width() - 32) /2 ), rcItem.top + 15);
CContentItems pContents = m_pContents[ lpDrawItemStruct->itemID ];
HICON hIcon = m_ImageListNormal.ExtractIcon( pContents.GetImageID());
// deflate the client rect, and set up item and
// text rect's.
rClient.DeflateRect( 8, 5 );
rcItem.CopyRect( rClient );
rText.CopyRect( rClient );
rText.top += 45;
rText.bottom += 10;
// set the text color to white, and background mode
// to transparent.
pDC->SetTextColor( ::GetSysColor( COLOR_WINDOW ) );
pDC->SetBkMode( TRANSPARENT );
// draw the button icon and text.
if( lpDrawItemStruct->itemAction& ODA_DRAWENTIRE ) {
pDC->DrawIcon( Pt, hIcon );
pDC->DrawText( pContents.GetText(), rText,
DT_CENTER | DT_WORDBREAK );
}
// if the left mouse button is pressed, offset
// the button icon.
if( m_bLBDown ) {
Pt.x += 2;
Pt.y += 2;
rcItem.OffsetRect( 2, 2 );
}
// deflate the button rect, and move up.
rcItem.DeflateRect( 4, 16 );
rcItem.top -= 8;
// Draw the button icon and text, if the mouse is over the
// button, draw the 3d rect, either pressed,
// or not pressed depending on left mouse button.
if(( lpDrawItemStruct->itemState& ODS_SELECTED ) &&
( lpDrawItemStruct->itemAction& ( ODA_SELECT | ODA_DRAWENTIRE ))) {
rcItem.left = ( rcItem.Width()/2 )-5;
rcItem.right = rcItem.left+37;
if( m_bHilight ) {
if( m_bLBDown ) {
pDC->Draw3dRect( rcItem, ::GetSysColor( COLOR_3DDKSHADOW ),
::GetSysColor( COLOR_BTNFACE ) );
}
else {
pDC->Draw3dRect( rcItem, ::GetSysColor( COLOR_BTNFACE ),
::GetSysColor( COLOR_3DDKSHADOW ) );
}
}
pDC->DrawIcon( Pt, hIcon );
pDC->DrawText( pContents.GetText(), rText,
DT_CENTER | DT_WORDBREAK );
}
if( !( lpDrawItemStruct->itemState& ODS_SELECTED ) &&
( lpDrawItemStruct->itemAction& ODA_SELECT )) {
pDC->FillSolidRect( rClient, ::GetSysColor( COLOR_3DSHADOW ) );
pDC->DrawIcon(Pt, hIcon);
pDC->DrawText(pContents.GetText(), rText, DT_CENTER|DT_WORDBREAK);
}
}
//////////////////////////////
// Sets item height
void CCJOutlookBar::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemHeight = 70;
}
//////////////////////////////
// Sets the background color.
BOOL CCJOutlookBar::OnEraseBkgnd(CDC* pDC)
{
// Get the rect of the client area, and fill
// the background color.
CRect rcClient;
GetClientRect( &rcClient );
pDC->FillRect( rcClient, &CBrush( ::GetSysColor( COLOR_3DSHADOW ) ));
return TRUE;
}
//////////////////////////////
// Initializes the ContentMenu
void CCJOutlookBar::SetItems(CContentItems * pItems, int nNumItems)
{
m_pContents = pItems;
m_nNumItems = nNumItems;
for( int i = 0; i < nNumItems; i++ ) {
AddString(m_pContents[i].GetText());
}
}