Everyone knows the new menu-like left pane view’s in IE4.
But did you know that this is only a extended TreeView?
You can do this by using CUSTONDRAW notification in the new from CTreeCtrl derived class.
I called it CTreeMenu. To do this is quite easy. See an code extract below.
But note: This works only with the extended TreeCtrl that comes with IE4.
You can use my wrapper class or the one from
Luis Barreira IE4 Classes. This should also work, but I didn’t test it.
Also on Codeguru’s Webpage.
I wrote a class, that makes the handling pretty easy. Included are a Button to close the view and some Bevel stuff to be uptodate with the Windows style.
There is also a self RegisterClass() function to use as a CustomControl on Dialog Templates.
The Frame use the SizingControlBar from Cristi Posea
also found here on Codeguru’s Webpage.
See more details in code comments.

void CTreeMenu::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMTVCUSTOMDRAW *pTVCD = (NMTVCUSTOMDRAW*)pNMHDR;
CDC* pDC = CDC::FromHandle(pTVCD->nmcd.hdc);
// The rect for the cell gives correct left and right values
CRect rect = pTVCD->nmcd.rc;
// By default set the return value to do the default behavior
*pResult = 0;
switch( pTVCD->nmcd.dwDrawStage )
{
// First stage (for the whole control
case CDDS_PREPAINT:
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
break;
// Stage three (called for each subitem of the focused item
case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
{
*pResult = CDRF_NOTIFYSUBITEMDRAW | CDRF_NOTIFYPOSTPAINT;
}
break;
// Stage four (called for each subitem of the focused item
case CDDS_ITEMPOSTPAINT | CDDS_SUBITEM:
{
*pResult = CDRF_SKIPDEFAULT;
}
break;
default:
// Stage two handled here. (called for each item
if (pTVCD->nmcd.uItemState & CDIS_HOT)
{
pDC->Draw3dRect( &rect, m_clr3DHilight, m_clr3DShadow );
pDC->SetBkColor(GetBkColor());
pDC->SetTextColor(RGB(0,0,255));
// Tell the control that to draw it again
*pResult = CDRF_NOTIFYPOSTPAINT;
}
if (pTVCD->nmcd.uItemState & CDIS_SELECTED)
{
*pResult = CDRF_SKIPDEFAULT;
}
if( (pTVCD->nmcd.uItemState & CDIS_FOCUS) )
{
pDC->Draw3dRect( &rect, m_clr3DShadow, m_clr3DHilight );
pDC->SetBkColor(m_clrSelBkColor);
pDC->SetTextColor(m_clrSelTextColor);
*pResult = CDRF_NOTIFYPOSTPAINT;
}
if( (pTVCD->nmcd.uItemState & CDIS_CHECKED) )
{
*pResult = CDRF_DODEFAULT;
}
break;
}
}
P.S: Did everyone has successfull experienced with the new pager control (see latest “commctrl.h”), please send a notice to Rainer Pfitzner
Date Posted: 05/13/98