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()); 
	} 
}