Professional UI Solutions
Site Map   /  Register
 
 

Forum

Please Log In to post a new message or reply to an existing one. If you are not registered, please register.

NOTE: Some forums may be read-only if you are not currently subscribed to our technical support services.

Forums » Prof-UIS Tech Support » Highlighting the tree items along with their icons on mouse hovering over them Collapse All
Subject Author Date
Debabrata Mukherjee Aug 28, 2007 - 8:30 AM

By Highlighting here I mean that when the mouse is taken over a particular tree item , the background color of the portion occupied by the whole item label and its icon should changeI have a tree structure in my application and I want to implement it. Earlier you provided me with the
following code below but I am having a few problems in understanding the functionalities in it , which i have noted down.

Here is the code you provided:

class CSettingsTreeWnd : public CTreeCtrl

{

CFont m_fontBold;

CHighImageList m_imgList;

#if (defined __SETTINGS_TREE_SUPPORTS_HOVER)

HTREEITEM m_htiMenuBoxHover;

#endif // (defined __SETTINGS_TREE_SUPPORTS_HOVER)

HTREEITEM m_htiPopupMenu;

public:

static const int g_nImgWidth;

static const int g_nImgHeight;



// Construction

public:



bool m_bRenderAlphaEffects:1;



CSettingsTreeWnd();



// Attributes

public:



// Operations

public:



// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CSettingsTreeWnd)

protected:

virtual void PreSubclassWindow();

//}}AFX_VIRTUAL



// Implementation

public:

virtual ~CSettingsTreeWnd();

enum e_get_item_rect_impl_t

{

__EGIRT_EXP_IMG = 0,

__EGIRT_MENU_BOX = 1,

__EGIRT_CHECK_BOX = 2,

__EGIRT_ARROW = 3,

__EGIRT_MIN_VALUE = 0,

__EGIRT_MAX_VALUE = 3

};

static CRect stat_GetItemRectImpl(

e_get_item_rect_impl_t eGIRT,

CRect rcItemText,

int nItemIndent,

int nExpImgWidth = 12,

int nExpImgHeight = 12,

int nMenuImgWidth = CSettingsTreeWnd::g_nImgWidth,

int nMenuImgHeight = CSettingsTreeWnd::g_nImgHeight

);

void _AnalyzeMenuButtonHover();

void _TrackItemMenu(

HTREEITEM hti,

bool bSelectAny = false

);

void DoUpdateNextAvail();

void ClientArea_PaintBackground( CDC & dc, CRect rcClient );

void ClientArea_PaintForeground( CDC & dc, CRect rcClient );



// Generated message map functions

protected:

//{{AFX_MSG(CSettingsTreeWnd)

afx_msg BOOL OnEraseBkgnd(CDC* pDC);

afx_msg void OnPaint();

afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);

afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);

afx_msg void OnTimer(UINT nIDEvent);

afx_msg void OnCancelMode();

afx_msg void OnMouseMove(UINT nFlags, CPoint point);

afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);

afx_msg void OnLButtonUp(UINT nFlags, CPoint point);

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

afx_msg void OnKillFocus(CWnd* pNewWnd);

afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);

afx_msg UINT OnGetDlgCode();

afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point);

afx_msg void OnRButtonUp(UINT nFlags, CPoint point);

afx_msg void OnRButtonDown(UINT nFlags, CPoint point);

afx_msg void OnMButtonDblClk(UINT nFlags, CPoint point);

afx_msg void OnMButtonUp(UINT nFlags, CPoint point);

afx_msg void OnMButtonDown(UINT nFlags, CPoint point);

afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);

//}}AFX_MSG

afx_msg LRESULT OnDisplayChange(WPARAM wParam, LPARAM lParam);

DECLARE_MESSAGE_MAP()

};

















/////////////////////////////////////////////////////////////////////////////

// CSettingsTreeWnd



const int CSettingsTreeWnd::g_nImgWidth = 36;

const int CSettingsTreeWnd::g_nImgHeight = 19;



CSettingsTreeWnd::CSettingsTreeWnd()

: m_imgList(

IDB_BITMAP_TREE_IMG_LIST,

RGB(255,0,255),

g_nImgWidth

)

#if (defined __SETTINGS_TREE_SUPPORTS_HOVER)

, m_htiMenuBoxHover( NULL )

#endif // (defined __SETTINGS_TREE_SUPPORTS_HOVER)

, m_htiPopupMenu( NULL )

, m_bRenderAlphaEffects( false )

{

ASSERT( m_imgList.GetSafeHandle() != NULL );

}



CSettingsTreeWnd::~CSettingsTreeWnd()

{

}





BEGIN_MESSAGE_MAP(CSettingsTreeWnd, CTreeCtrl)

//{{AFX_MSG_MAP(CSettingsTreeWnd)

ON_WM_ERASEBKGND()

ON_WM_PAINT()

ON_WM_SETTINGCHANGE()

ON_WM_SETCURSOR()

ON_WM_TIMER()

ON_WM_CANCELMODE()

ON_WM_MOUSEMOVE()

ON_WM_LBUTTONDBLCLK()

ON_WM_LBUTTONUP()

ON_WM_LBUTTONDOWN()

ON_WM_KEYDOWN()

ON_WM_KILLFOCUS()

ON_WM_HSCROLL()

ON_WM_VSCROLL()

ON_WM_MOUSEWHEEL()

ON_WM_GETDLGCODE()

ON_WM_RBUTTONDBLCLK()

ON_WM_RBUTTONUP()

ON_WM_RBUTTONDOWN()

ON_WM_MBUTTONDBLCLK()

ON_WM_MBUTTONUP()

ON_WM_MBUTTONDOWN()

ON_WM_CONTEXTMENU()

//}}AFX_MSG_MAP

ON_MESSAGE( WM_DISPLAYCHANGE, OnDisplayChange )

END_MESSAGE_MAP()



/////////////////////////////////////////////////////////////////////////////

// CSettingsTreeWnd message handlers



void CSettingsTreeWnd::PreSubclassWindow()

{

CTreeCtrl::PreSubclassWindow();

SetRedraw( FALSE );

// CTreeCtrl::SetImageList( &m_imgList, TVSIL_NORMAL );

// CTreeCtrl::SetImageList( &m_imgList, TVSIL_STATE );

CTreeCtrl::SetIndent( g_nImgWidth + 12 + 8 );

int nItemHeight = CTreeCtrl::GetItemHeight();

nItemHeight = max( nItemHeight, g_nImgHeight );

nItemHeight++;

CTreeCtrl::SetItemHeight( nItemHeight );

theApp.GetRootTaskNode()->OnTreeControlInit( *this );

SetRedraw( TRUE );

HTREEITEM hti = CTreeCtrl::GetNextItem( TVI_ROOT, TVGN_CHILD );

if( hti != NULL )

CTreeCtrl::SelectItem( hti );

}



BOOL CSettingsTreeWnd::OnEraseBkgnd(CDC* pDC)

{

// return CTreeCtrl::OnEraseBkgnd(pDC);

pDC;

return TRUE;

}



void CSettingsTreeWnd::ClientArea_PaintBackground( CDC & dc, CRect rcClient )

{

ASSERT_VALID( this );

dc.FillSolidRect( &rcClient, CTreeCtrl::GetBkColor() );

}



void CSettingsTreeWnd::ClientArea_PaintForeground( CDC & dc, CRect rcClient )

{

ASSERT_VALID( this );

rcClient;

int nVisibleCount = CTreeCtrl::GetVisibleCount() + 1;

if( nVisibleCount == 0 )

return;

CFont * pDefaultGuiFont = CTreeCtrl::GetFont();

ASSERT( pDefaultGuiFont->GetSafeHandle() != NULL );

CFont * pOldFont = dc.SelectObject( pDefaultGuiFont );

COLORREF clrOldTextColor = dc.GetTextColor();

int nOldBkMode = dc.SetBkMode( TRANSPARENT );

HTREEITEM htiDH = CTreeCtrl::GetDropHilightItem();

bool bFocusedControl = false;

HWND hWndFocus = ::GetFocus();

if( hWndFocus == m_hWnd

|| ::IsChild( m_hWnd, hWndFocus )

)

bFocusedControl = true;

INT nItemIndent = (INT)CTreeCtrl::GetIndent();

ASSERT( nItemIndent > 0 );

COLORREF clrTextDisabled = ::GetSysColor( COLOR_3DSHADOW );

COLORREF clrTextNorm = ::GetSysColor( COLOR_WINDOWTEXT );

COLORREF clrBkNorm = ::GetSysColor( COLOR_WINDOW );

ASSERT( !theApp.m_iconNodeCollapsed.IsEmpty() );

ASSERT( !theApp.m_iconNodeExpaded.IsEmpty() );

ASSERT( !theApp.m_iconNodeDot.IsEmpty() );

ASSERT( !theApp.m_iconNodeBlueCube.IsEmpty() );

for( HTREEITEM hti = CTreeCtrl::GetFirstVisibleItem();

hti != NULL && nVisibleCount > 0;

hti = CTreeCtrl::GetNextVisibleItem( hti ), nVisibleCount--

)

{ // walk all visible items

CTaskNode * pTaskNode = (CTaskNode *)

CTreeCtrl::GetItemData( hti );

ASSERT_VALID( pTaskNode );

ASSERT_KINDOF( CTaskNode, pTaskNode );

bool bEnabled = pTaskNode->IsActionAvailable();

INT nImgCheck = 0;

if( bEnabled )

{

INT nCheck = pTaskNode->Check();

ASSERT( 0 <= nCheck && nCheck <= 2 );

nImgCheck = nCheck << 1;

} // if( bEnabled )

else

nImgCheck = 6;

if(

#if (defined __SETTINGS_TREE_SUPPORTS_HOVER)

hti == m_htiMenuBoxHover

||

#endif // (defined __SETTINGS_TREE_SUPPORTS_HOVER)

hti == m_htiPopupMenu

)

nImgCheck++;

UINT nItemState =

CTreeCtrl::GetItemState(

hti,

TVIS_BOLD|TVIS_SELECTED|TVIS_DROPHILITED

);

CRect rcItemText, rcItemAll;

CTreeCtrl::GetItemRect( hti, &rcItemAll, FALSE );

CTreeCtrl::GetItemRect( hti, &rcItemText, TRUE );

dc.FillSolidRect( &rcItemAll, clrBkNorm );

// dc.FillSolidRect( &rcItemText, clrBk );

CRect rcImage(

stat_GetItemRectImpl(

__EGIRT_MENU_BOX,

rcItemText,

nItemIndent

)

);

m_imgList.Draw(

&dc,

nImgCheck,

rcImage.TopLeft(),

ILD_NORMAL

);



HTREEITEM htiChild =

CTreeCtrl::GetNextItem( hti, TVGN_CHILD );

if( htiChild != NULL )

{

bool bExpanded =

( (CTreeCtrl::GetItemState( hti, TVIS_EXPANDED ) & TVIS_EXPANDED) != 0 )

? true : false;

CExtCmdIcon & _icon =

bExpanded

? theApp.m_iconNodeExpaded

: theApp.m_iconNodeCollapsed

;

CSize _sizeIcon = _icon.GetSize();

CRect rcCollExpBmp(

stat_GetItemRectImpl(

__EGIRT_EXP_IMG,

rcItemText,

nItemIndent,

_sizeIcon.cx,

_sizeIcon.cy

)

);



_icon.Paint(

g_PaintManager.GetPM(),

dc,

rcCollExpBmp.left,

rcCollExpBmp.top,

-1,

-1

);

} // if( htiChild != NULL )

else

{

CExtCmdIcon & _icon = pTaskNode->GetIcon();

ASSERT( !_icon.IsEmpty() );

CSize _sizeIcon = _icon.GetSize();

CRect rcDot(

stat_GetItemRectImpl(

__EGIRT_EXP_IMG,

rcItemText,

nItemIndent,

_sizeIcon.cx,

_sizeIcon.cy

)

);

_icon.Paint(

g_PaintManager.GetPM(),

dc,

rcDot.left,

rcDot.top,

-1,

-1

);

} // else from if( htiChild != NULL )



CString strItemText = CTreeCtrl::GetItemText( hti );

int nItemTextLength = strItemText.GetLength();

ASSERT( nItemTextLength > 0 );

bool bFocusStyle = false;

if( ( nItemState & TVIS_DROPHILITED ) != 0 )

bFocusStyle = true;

else if( ( nItemState & TVIS_SELECTED ) != 0 && htiDH == NULL )

bFocusStyle = true;

COLORREF clrText = bEnabled ? clrTextNorm : clrTextDisabled;

COLORREF clrBk = clrBkNorm;

if( bFocusStyle )

{

if( bFocusedControl )

{

clrText =

::GetSysColor(

bEnabled ? COLOR_HIGHLIGHTTEXT : COLOR_3DFACE

);

clrBk =

::GetSysColor( COLOR_HIGHLIGHT );

} // if( bFocusedControl )

else

{

clrBk = ::GetSysColor( COLOR_3DFACE );

} // else from if( bFocusedControl )

} // if( bFocusStyle )

if( clrBk != clrBkNorm )

dc.FillSolidRect( &rcItemText, clrBk );

dc.SetTextColor( clrText );



if( (nItemState & TVIS_BOLD) != 0 )

{

if( m_fontBold.GetSafeHandle() == NULL )

{

LOGFONT _lf;

::memset( &_lf, 0, sizeof(LOGFONT) );

pDefaultGuiFont->GetLogFont( &_lf );

_lf.lfWeight = 700;

VERIFY( m_fontBold.CreateFontIndirect( &_lf ) );

} // if( m_fontBold.GetSafeHandle() == NULL )

if( m_fontBold.GetSafeHandle() != NULL )

dc.SelectObject( &m_fontBold );

} // if( (nItemState & TVIS_BOLD) != 0 )

dc.DrawText(

strItemText,

nItemTextLength,

&rcItemText,

DT_SINGLELINE|DT_CENTER|DT_VCENTER

);

dc.SelectObject( pDefaultGuiFont );



if( bFocusedControl && ( nItemState & TVIS_SELECTED ) != 0 )

{

dc.SetTextColor( clrText );

dc.DrawFocusRect( &rcItemText );

}

} // walk all visible items

dc.SetBkMode( nOldBkMode );

dc.SetTextColor( clrOldTextColor );

dc.SelectObject( pOldFont );

}



void CSettingsTreeWnd::OnPaint()

{

ASSERT( m_imgList.GetSafeHandle() != NULL );

CRect rcClient;

GetClientRect( &rcClient );

CPaintDC dcPaint( this );

CExtMemoryDC dc( &dcPaint, &rcClient );



if( m_bRenderAlphaEffects )

{

BITMAPINFOHEADER bih;

bih.biSize = sizeof(BITMAPINFOHEADER);

bih.biWidth = rcClient.Width();

bih.biHeight = rcClient.Height();

bih.biPlanes = 1;

bih.biBitCount = 32;

bih.biCompression = BI_RGB;

bih.biSizeImage = rcClient.Width() * rcClient.Height();

bih.biXPelsPerMeter = 0;

bih.biYPelsPerMeter = 0;

bih.biClrUsed = 0;

bih.biClrImportant = 0;

COLORREF * pDibSurface = NULL;

HBITMAP hDIB =

::CreateDIBSection(

dc.GetSafeHdc(),

(LPBITMAPINFO)&bih,

DIB_RGB_COLORS,

(void **)&pDibSurface,

NULL,

NULL

);

if( hDIB != NULL && pDibSurface != NULL )

{

CBitmap bmpBetterSurface;

bmpBetterSurface.Attach( hDIB );

CDC dcBetterSurface;

if( dcBetterSurface.CreateCompatibleDC( &dc ) )

{

CBitmap * pOldBmp = dcBetterSurface.SelectObject( &bmpBetterSurface );

ClientArea_PaintBackground( dc, rcClient );

// ClientArea_PaintBackground( dcBetterSurface, rcClient );

COLORREF clrTransparentFake = RGB(255,0,255);

dcBetterSurface.FillSolidRect( &rcClient, clrTransparentFake );

CTreeCtrl::DefWindowProc( WM_PAINT, (WPARAM)dcBetterSurface.GetSafeHdc(), 0L );

ClientArea_PaintForeground( dcBetterSurface, rcClient );

dcBetterSurface.SelectObject( pOldBmp );

CExtBitmap _bmpMaze;

if( _bmpMaze.FromBitmap( hDIB ) )

{

_bmpMaze.AlphaColor( clrTransparentFake, RGB(0,0,0), 0 );

CRect rcFrameTop(

rcClient.left,

rcClient.top,

rcClient.right,

rcClient.top + 1

);

CRect rcFrameBottom(

rcClient.left,

rcClient.bottom - 1,

rcClient.right,

rcClient.bottom

);

const INT nStepDY = 25;

const INT nAlphaRange = 32;

for( INT nStepY = 0; nStepY < nStepDY; nStepY ++ )

{

INT nAlpha = ::MulDiv( nStepY, nAlphaRange, nStepDY ) + 255 - nAlphaRange;

_bmpMaze.AlphaRect(

rcFrameTop,

nAlpha

);

_bmpMaze.AlphaRect(

rcFrameBottom,

nAlpha

);

rcFrameTop.OffsetRect( 0, 1 );

rcFrameBottom.OffsetRect( 0, -1 );

}

_bmpMaze.AlphaBlend( dc, rcClient );

return;

}

}

}

} // if( m_bRenderAlphaEffects )



CRect rcClip;

dcPaint.GetClipBox( &rcClip );

CRgn rgnClip;

rgnClip.CreateRectRgnIndirect( &rcClip );

dc.SelectClipRgn( &rgnClip );

//rgnClip.DeleteObject();

ClientArea_PaintBackground( dc, rcClient );

CTreeCtrl::DefWindowProc( WM_PAINT, (WPARAM)dc.GetSafeHdc(), 0L );

ClientArea_PaintForeground( dc, rcClient );

dc.SelectClipRgn( NULL );

}



CRect CSettingsTreeWnd::stat_GetItemRectImpl(

CSettingsTreeWnd::e_get_item_rect_impl_t eGIRT,

CRect rcItemText,

int nItemIndent,

int nExpImgWidth, // = 12

int nExpImgHeight, // = 12

int nMenuImgWidth, // = CSettingsTreeWnd::g_nImgWidth

int nMenuImgHeight // = CSettingsTreeWnd::g_nImgHeight

)

{

ASSERT( __EGIRT_MIN_VALUE <= eGIRT && eGIRT <= __EGIRT_MAX_VALUE );

CRect rcResult( rcItemText );



switch( eGIRT )

{

case __EGIRT_EXP_IMG:

rcResult.left -= nItemIndent;

rcResult.right = rcResult.left + nExpImgWidth;

rcResult.OffsetRect(

( nItemIndent - nMenuImgWidth - nExpImgWidth ) / 2,

( rcResult.Height() - nExpImgHeight ) / 2

);

break;

case __EGIRT_MENU_BOX:

rcResult.right = rcResult.left-2;

rcResult.left -= nMenuImgWidth+2;

break;

case __EGIRT_CHECK_BOX:

rcResult.right = rcResult.left-2;

rcResult.left -= nMenuImgWidth+2;

rcResult.left += 5;

rcResult.top += 3;

rcResult.right = rcResult.left + 12;

rcResult.bottom = rcResult.top + 12;

break;

case __EGIRT_ARROW:

rcResult.right = rcResult.left-2;

rcResult.left -= nMenuImgWidth+2;

rcResult.left += 22;

break;

#ifdef _DEBUG

default:

ASSERT( FALSE );

break;

#endif // _DEBUG

} // switch( eGIRT )

return rcResult;

}



void CSettingsTreeWnd::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)

{

CTreeCtrl::OnSettingChange(uFlags, lpszSection);

if( m_fontBold.GetSafeHandle() != NULL )

m_fontBold.DeleteObject();

}



LRESULT CSettingsTreeWnd::OnDisplayChange(WPARAM wParam, LPARAM lParam)

{

LRESULT lResult = Default();

if( m_fontBold.GetSafeHandle() != NULL )

m_fontBold.DeleteObject();

return lResult;

}



BOOL CSettingsTreeWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)

{

ASSERT( theApp.m_hCursorHand != NULL );

CPoint point;

if( ::GetCursorPos( &point) )

{

ScreenToClient( &point );

UINT nHtFlags = 0;

HTREEITEM hti = CTreeCtrl::HitTest( point, &nHtFlags );

if( hti != NULL

&& (nHtFlags&(TVHT_ONITEMICON|TVHT_ONITEMLABEL|TVHT_ONITEMICON|TVHT_ONITEMSTATEICON|TVHT_ONITEMINDENT|TVHT_ONITEMBUTTON)) != 0

)

{

INT nItemIndent = (INT)CTreeCtrl::GetIndent();

ASSERT( nItemIndent > 0 );

CRect rcItemText;

CTreeCtrl::GetItemRect( hti, &rcItemText, TRUE );

HTREEITEM htiChild =

CTreeCtrl::GetNextItem( hti, TVGN_CHILD );

if( htiChild != NULL )

{

CRect rcCollExpBmp(

stat_GetItemRectImpl(

__EGIRT_EXP_IMG,

rcItemText,

nItemIndent

)

);

if( rcCollExpBmp.PtInRect(point) )

{

::SetCursor( theApp.m_hCursorHand );

return TRUE;

} // if( rcCollExpBmp.PtInRect(point) )

} // if( htiChild != NULL )

CTaskNode * pTaskNode = (CTaskNode *)

CTreeCtrl::GetItemData( hti );

ASSERT_VALID( pTaskNode );

ASSERT_KINDOF( CTaskNode, pTaskNode );

bool bEnabled = pTaskNode->IsActionAvailable();

if( bEnabled )

{

CRect rcCheckBox(

stat_GetItemRectImpl(

__EGIRT_CHECK_BOX,

rcItemText,

nItemIndent

)

);

if( rcCheckBox.PtInRect(point) )

{

::SetCursor( theApp.m_hCursorHand );

return TRUE;

} // if( rcCheckBox.PtInRect(point) )

CRect rcArrow(

stat_GetItemRectImpl(

__EGIRT_ARROW,

rcItemText,

nItemIndent

)

);

if( rcArrow.PtInRect(point) )

{

::SetCursor( theApp.m_hCursorHand );

return TRUE;

} // if( rcArrow.PtInRect(point) )

} // if( bEnabled )

}

} // if( ::GetCursorPos( &point) )

return CTreeCtrl::OnSetCursor(pWnd, nHitTest, message);

}



void CSettingsTreeWnd::OnTimer(UINT nIDEvent)

{

#if (defined __SETTINGS_TREE_SUPPORTS_HOVER)

if( nIDEvent == 0x333 )

{

if( m_htiMenuBoxHover == NULL

|| ( GetStyle() & WS_VISIBLE ) == 0

|| ( GetParent()->GetStyle() & WS_VISIBLE ) == 0

)

{

m_htiMenuBoxHover = NULL;

KillTimer( 0x333 );

return;

}

if( m_htiPopupMenu != NULL )

return;

CPoint point;

if( GetCursorPos(&point) )

{

CRect rcClient;

GetClientRect( &rcClient );

ClientToScreen( &rcClient );

if( rcClient.PtInRect(point) )

return;

} // if( GetCursorPos(&point) )

KillTimer( 0x333 );

CRect rcItemAll;

CTreeCtrl::GetItemRect( m_htiMenuBoxHover, &rcItemAll, FALSE );

m_htiMenuBoxHover = NULL;

InvalidateRect( &rcItemAll );

UpdateWindow();

return;

} // if( nIDEvent == 0x333 )

#endif // (defined __SETTINGS_TREE_SUPPORTS_HOVER)

CTreeCtrl::OnTimer(nIDEvent);

}



void CSettingsTreeWnd::OnCancelMode()

{

CTreeCtrl::OnCancelMode();

#if (defined __SETTINGS_TREE_SUPPORTS_HOVER)

KillTimer( 0x333 );

if( m_htiMenuBoxHover != NULL )

{

CRect rcItemAll;

CTreeCtrl::GetItemRect( m_htiMenuBoxHover, &rcItemAll, FALSE );

m_htiMenuBoxHover = NULL;

InvalidateRect( &rcItemAll );

UpdateWindow();

} // if( m_htiMenuBoxHover != NULL )

#endif // (defined __SETTINGS_TREE_SUPPORTS_HOVER)

}

void CSettingsTreeWnd::OnKillFocus(CWnd* pNewWnd)

{

CTreeCtrl::OnKillFocus(pNewWnd);

SendMessage( WM_CANCELMODE );

}



void CSettingsTreeWnd::_AnalyzeMenuButtonHover()

{

if( m_htiPopupMenu != NULL )

return;

HTREEITEM hti = NULL;

if( IsWindowEnabled() && GetFocus() == this )

{

CPoint point;

if( GetCursorPos(&point) )

{

ScreenToClient( &point );

UINT nHtFlags = 0;

hti = CTreeCtrl::HitTest( point, &nHtFlags );

if( hti != NULL

&& (nHtFlags&(TVHT_ONITEMICON|TVHT_ONITEMLABEL|TVHT_ONITEMICON|TVHT_ONITEMSTATEICON|TVHT_ONITEMINDENT|TVHT_ONITEMBUTTON)) != 0

)

{

CTaskNode * pTaskNode = (CTaskNode *)

CTreeCtrl::GetItemData( hti );

ASSERT_VALID( pTaskNode );

ASSERT_KINDOF( CTaskNode, pTaskNode );

INT nItemIndent = (INT)CTreeCtrl::GetIndent();

ASSERT( nItemIndent > 0 );

CRect rcItemText;

CTreeCtrl::GetItemRect( hti, &rcItemText, TRUE );

CRect rcMenuBox(

stat_GetItemRectImpl(

__EGIRT_MENU_BOX,

rcItemText,

nItemIndent

)

);

if( !rcMenuBox.PtInRect(point) )

hti = NULL;

}

} // if( GetCursorPos(&point) )

} // if( IsWindowEnabled() && GetFocus() == this )

#if (defined __SETTINGS_TREE_SUPPORTS_HOVER)

if( m_htiMenuBoxHover != hti )

{

if( m_htiMenuBoxHover != NULL )

{

CRect rcItemAll;

CTreeCtrl::GetItemRect( m_htiMenuBoxHover, &rcItemAll, FALSE );

InvalidateRect( &rcItemAll );

} // if( m_htiMenuBoxHover != NULL )

m_htiMenuBoxHover = hti;

if( m_htiMenuBoxHover != NULL )

{

CRect rcItemAll;

CTreeCtrl::GetItemRect( m_htiMenuBoxHover, &rcItemAll, FALSE );

InvalidateRect( &rcItemAll );

SetTimer( 0x333, 10, NULL );

} // if( m_htiMenuBoxHover != NULL )

else

KillTimer( 0x333 );

UpdateWindow();

} // if( m_htiMenuBoxHover != hti )

#endif // (defined __SETTINGS_TREE_SUPPORTS_HOVER)

}



void CSettingsTreeWnd::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

CTreeCtrl::OnHScroll(nSBCode, nPos, pScrollBar);

_AnalyzeMenuButtonHover();

}

void CSettingsTreeWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

CTreeCtrl::OnVScroll(nSBCode, nPos, pScrollBar);

_AnalyzeMenuButtonHover();

}

BOOL CSettingsTreeWnd::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)

{

BOOL bRetVal = CTreeCtrl::OnMouseWheel(nFlags, zDelta, pt);

_AnalyzeMenuButtonHover();

return bRetVal;

}

void CSettingsTreeWnd::OnMouseMove(UINT nFlags, CPoint point)

{

_AnalyzeMenuButtonHover();

CTreeCtrl::OnMouseMove(nFlags, point);

}

void CSettingsTreeWnd::OnLButtonDblClk(UINT nFlags, CPoint point)

{

// CTreeCtrl::OnLButtonDblClk(nFlags, point);

nFlags;

if( GetFocus() != this )

SetFocus();

UINT nHtFlags = 0;

HTREEITEM hti = CTreeCtrl::HitTest( point, &nHtFlags );

if( hti == NULL

|| (nHtFlags&(TVHT_ONITEMICON|TVHT_ONITEMLABEL|TVHT_ONITEMICON|TVHT_ONITEMSTATEICON|TVHT_ONITEMINDENT|TVHT_ONITEMBUTTON)) == 0

)

return;

HTREEITEM htiSel = CTreeCtrl::GetSelectedItem();

if( htiSel != hti )

CTreeCtrl::SelectItem( hti );

INT nItemIndent = (INT)CTreeCtrl::GetIndent();

ASSERT( nItemIndent > 0 );

CRect rcItemText;

CTreeCtrl::GetItemRect( hti, &rcItemText, TRUE );

if( !rcItemText.PtInRect(point) )

return;

CTaskNode * pTaskNode = (CTaskNode *)

CTreeCtrl::GetItemData( hti );

ASSERT_VALID( pTaskNode );

ASSERT_KINDOF( CTaskNode, pTaskNode );

bool bEnabled = pTaskNode->IsActionAvailable();

if( !bEnabled )

return;

int nCheck = pTaskNode->Check();

if( nCheck != 1 )

nCheck = 1;

else

nCheck = 0;

pTaskNode->Check( nCheck );

Invalidate();

UpdateWindow();

DoUpdateNextAvail();

}

void CSettingsTreeWnd::OnLButtonUp(UINT nFlags, CPoint point)

{

// CTreeCtrl::OnLButtonUp(nFlags, point);

nFlags;

point;

}

void CSettingsTreeWnd::OnLButtonDown(UINT nFlags, CPoint point)

{

// CTreeCtrl::OnLButtonDown(nFlags, point);

nFlags;

if( GetFocus() != this )

SetFocus();

UINT nHtFlags = 0;

HTREEITEM hti = CTreeCtrl::HitTest( point, &nHtFlags );

if( hti == NULL

|| (nHtFlags&(TVHT_ONITEMICON|TVHT_ONITEMLABEL|TVHT_ONITEMICON|TVHT_ONITEMSTATEICON|TVHT_ONITEMINDENT|TVHT_ONITEMBUTTON)) == 0

)

return;

HTREEITEM htiSel = CTreeCtrl::GetSelectedItem();

if( htiSel != hti )

CTreeCtrl::SelectItem( hti );

INT nItemIndent = (INT)CTreeCtrl::GetIndent();

ASSERT( nItemIndent > 0 );

CRect rcItemText;

CTreeCtrl::GetItemRect( hti, &rcItemText, TRUE );

HTREEITEM htiChild =

CTreeCtrl::GetNextItem( hti, TVGN_CHILD );

if( htiChild != NULL )

{

CRect rcCollExpBmp(

stat_GetItemRectImpl(

__EGIRT_EXP_IMG,

rcItemText,

nItemIndent

)

);

if( rcCollExpBmp.PtInRect(point) )

{

CTreeCtrl::Expand( hti, TVE_TOGGLE );

return;

} // if( rcCollExpBmp.PtInRect(point) )

} // if( htiChild != NULL )

CTaskNode * pTaskNode = (CTaskNode *)

CTreeCtrl::GetItemData( hti );

ASSERT_VALID( pTaskNode );

ASSERT_KINDOF( CTaskNode, pTaskNode );

bool bEnabled = pTaskNode->IsActionAvailable();

if( !bEnabled )

return;

CRect rcCheckBox(

stat_GetItemRectImpl(

__EGIRT_CHECK_BOX,

rcItemText,

nItemIndent

)

);

if( rcCheckBox.PtInRect(point) )

{

int nCheck = pTaskNode->Check();

if( nCheck != 1 )

nCheck = 1;

else

nCheck = 0;

pTaskNode->Check( nCheck );

Invalidate();

UpdateWindow();

DoUpdateNextAvail();

return;

} // if( rcCheckBox.PtInRect(point) )

CRect rcArrow(

stat_GetItemRectImpl(

__EGIRT_ARROW,

rcItemText,

nItemIndent

)

);

if( rcArrow.PtInRect(point) )

{

_TrackItemMenu( hti );

return;

} // if( rcArrow.PtInRect(point) )

}



void CSettingsTreeWnd::OnMButtonDblClk(UINT nFlags, CPoint point)

{

// CTreeCtrl::OnMButtonDblClk(nFlags, point);

OnLButtonDblClk( nFlags, point );

}

void CSettingsTreeWnd::OnMButtonUp(UINT nFlags, CPoint point)

{

// CTreeCtrl::OnMButtonUp(nFlags, point);

nFlags;

point;

}

void CSettingsTreeWnd::OnMButtonDown(UINT nFlags, CPoint point)

{

// CTreeCtrl::OnMButtonDown(nFlags, point);

nFlags;

point;

}



void CSettingsTreeWnd::OnRButtonDblClk(UINT nFlags, CPoint point)

{

// CTreeCtrl::OnRButtonDblClk(nFlags, point);

OnLButtonDblClk( nFlags, point );

}

void CSettingsTreeWnd::OnRButtonUp(UINT nFlags, CPoint point)

{

// CTreeCtrl::OnRButtonUp(nFlags, point);

nFlags;

point;

}

void CSettingsTreeWnd::OnRButtonDown(UINT nFlags, CPoint point)

{

// CTreeCtrl::OnRButtonDown(nFlags, point);

nFlags;

if( GetFocus() != this )

SetFocus();

UINT nHtFlags = 0;

HTREEITEM hti = CTreeCtrl::HitTest( point, &nHtFlags );

if( hti == NULL

|| (nHtFlags&(TVHT_ONITEMICON|TVHT_ONITEMLABEL|TVHT_ONITEMICON|TVHT_ONITEMSTATEICON|TVHT_ONITEMINDENT|TVHT_ONITEMBUTTON)) == 0

)

return;

HTREEITEM htiSel = CTreeCtrl::GetSelectedItem();

if( htiSel != hti )

CTreeCtrl::SelectItem( hti );

INT nItemIndent = (INT)CTreeCtrl::GetIndent();

ASSERT( nItemIndent > 0 );

CRect rcItemText;

CTreeCtrl::GetItemRect( hti, &rcItemText, TRUE );

CTaskNode * pTaskNode = (CTaskNode *)

CTreeCtrl::GetItemData( hti );

ASSERT_VALID( pTaskNode );

ASSERT_KINDOF( CTaskNode, pTaskNode );

bool bEnabled = pTaskNode->IsActionAvailable();

if( !bEnabled )

return;

_TrackItemMenu( hti );

}



void CSettingsTreeWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

HTREEITEM hti = CTreeCtrl::GetSelectedItem();

if( hti != NULL )

{

if( nChar == VK_SPACE )

{

CTaskNode * pTaskNode = (CTaskNode *)

CTreeCtrl::GetItemData( hti );

ASSERT_VALID( pTaskNode );

ASSERT_KINDOF( CTaskNode, pTaskNode );

bool bEnabled = pTaskNode->IsActionAvailable();

if( !bEnabled )

return;

int nCheck = pTaskNode->Check();

if( nCheck != 1 )

nCheck = 1;

else

nCheck = 0;

pTaskNode->Check( nCheck );

Invalidate();

UpdateWindow();

DoUpdateNextAvail();

return;

} // if( nChar == VK_SPACE )

if( nChar == VK_RETURN )

{

CTaskNode * pTaskNode = (CTaskNode *)

CTreeCtrl::GetItemData( hti );

ASSERT_VALID( pTaskNode );

ASSERT_KINDOF( CTaskNode, pTaskNode );

bool bEnabled = pTaskNode->IsActionAvailable();

if( !bEnabled )

return;

_TrackItemMenu( hti, true );

} // if( nChar == VK_RETURN )

} // if( hti != NULL )

CTreeCtrl::OnKeyDown(nChar, nRepCnt, nFlags);

}



void CSettingsTreeWnd::DoUpdateNextAvail()

{

CPageSettings * pPageSettings = (CPageSettings *)

GetParent();

pPageSettings->DoUpdateNextAvail();

}



void CSettingsTreeWnd::_TrackItemMenu(

HTREEITEM hti,

bool bSelectAny // = false

)

{

ASSERT( hti != NULL );

CPoint point;

if( !GetCursorPos(&point) )

{

ASSERT( FALSE );

return;

}

if( m_htiPopupMenu != NULL

|| CExtPopupMenuWnd::IsMenuTracking()

)

{

CExtPopupMenuWnd::CancelMenuTracking();

return;

} // if( m_htiPopupMenu != NULL )

CRect rcItemText;

CTreeCtrl::GetItemRect( hti, &rcItemText, TRUE );

INT nItemIndent = (INT)CTreeCtrl::GetIndent();

ASSERT( nItemIndent > 0 );

CRect rcMenuBox(

stat_GetItemRectImpl(

__EGIRT_MENU_BOX,

rcItemText,

nItemIndent

)

);

ClientToScreen( &rcMenuBox );

CTaskNode * pTaskNode = (CTaskNode *)

CTreeCtrl::GetItemData( hti );

ASSERT_VALID( pTaskNode );

ASSERT_KINDOF( CTaskNode, pTaskNode );

bool bEnabled = pTaskNode->IsActionAvailable();

if( !bEnabled )

return;

CExtPopupMenuWnd * pPopup = new CExtPopupMenuWnd;

if( !pPopup->CreatePopupMenu( m_hWnd ) )

{

ASSERT( FALSE );

delete pPopup;

return;

}

CTaskNode::CTaskNodeArray arrMenuCmds;

pTaskNode->OnPopupMenuInit(

pPopup,

arrMenuCmds

);

if( arrMenuCmds.GetSize() == 0 )

{

ASSERT( FALSE );

delete pPopup;

return;

}

m_htiPopupMenu = hti;

DWORD dwTrackFlags =

TPMX_NO_WM_COMMAND|TPMX_NO_CMD_UI|TPMX_DO_MESSAGE_LOOP

|TPMX_TOPALIGN;

if( bSelectAny )

dwTrackFlags |= TPMX_SELECT_ANY;

UINT nResultCmdID = 0;

if( !pPopup->TrackPopupMenu(

dwTrackFlags,

point.x,

point.y,

&rcMenuBox,

NULL,

NULL,

&nResultCmdID

)

)

{

ASSERT( FALSE );

delete pPopup;

}

else if( nResultCmdID != 0 )

{

nResultCmdID --;

ASSERT( nResultCmdID < ((UINT)arrMenuCmds.GetSize()) );

pTaskNode = arrMenuCmds[ nResultCmdID ];

ASSERT_VALID( pTaskNode );

ASSERT_KINDOF( CTaskNode, pTaskNode );

bool bEnabled = pTaskNode->IsActionAvailable();

if( bEnabled )

{

int nCheck = pTaskNode->Check();

if( nCheck != 1 )

nCheck = 1;

else

nCheck = 0;

pTaskNode->Check( nCheck );

Invalidate();

UpdateWindow();

DoUpdateNextAvail();

} // if( bEnabled )

} // else if( nResultCmdID != 0 )

m_htiPopupMenu = NULL;

Invalidate();

_AnalyzeMenuButtonHover();

UpdateWindow();

}



UINT CSettingsTreeWnd::OnGetDlgCode()

{

UINT nDlgCode = CTreeCtrl::OnGetDlgCode();

nDlgCode |= DLGC_WANTALLKEYS;

return nDlgCode;

}



void CSettingsTreeWnd::OnContextMenu(CWnd* pWnd, CPoint point)

{

pWnd;

point;

HTREEITEM hti = CTreeCtrl::GetSelectedItem();

if( hti == NULL )

return;

CTaskNode * pTaskNode = (CTaskNode *)

CTreeCtrl::GetItemData( hti );

ASSERT_VALID( pTaskNode );

ASSERT_KINDOF( CTaskNode, pTaskNode );

bool bEnabled = pTaskNode->IsActionAvailable();

if( !bEnabled )

return;

_TrackItemMenu( hti, true );

}

And here is the problem I am facing:

1. Not able to understand the functionality of ClientArea_PaintBackground and ClientArea_PaintForeground
the method OnPaint () and how is it helping in highlighting each individual tree item.



2. What is the value retrieved by GetClientRect (&client) in the method OnPaint ();


3. Where the declaration for CTaskNode and what is is it used for?


4. For highlighting individual items do we require only the method OnPaint () or do we also require the method
BOOL CSettingsTreeWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)






Kindly guide me and address my issues.

Thank you

Technical Support Aug 29, 2007 - 1:48 PM

We have provided you with the source code of the custom painted tree control from the task page of our Integration Wizard. This tree class cannot be used as is. You should not try insert it into your project as is. You should simply take a look at its implementation as a sample. The OnPaint() method contains most of all you need: it demonstrates how to walk through the visible tree items and over-paint them with custom look. Besides this task is a bit outside Prof-UIS. If it’s difficult for you to code similar tree control, then you can set us a custom work request. This will take a only a few hours and not a problem for us.