BOOL CSizableReBar::OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* pResult ) { if ( wParam != 1 ) { return FALSE; } REBARBANDINFO rbbi; rbbi.cbSize = sizeof( rbbi ); rbbi.fMask = RBBIM_CHILD; // Let child windows handle certain messages NMHDR* pNMHDR = ( NMHDR* )lParam; switch ( pNMHDR->code ) { case RBN_HEIGHTCHANGE: case RBN_ENDDRAG: { CFrameWnd* pFrameWnd = GetParentFrame(); ASSERT( pFrameWnd != 0 ); if ( !( ( CFrameWndFriend* )pFrameWnd )->m_bInRecalcLayout ) { pFrameWnd->RecalcLayout(); } else { PostMessage( WM_RECALCPARENT ); } break; } case RBN_CHILDSIZE: { NMREBARCHILDSIZE* lprbcs = ( NMREBARCHILDSIZE* )pNMHDR; VERIFY( m_rbCtrl.GetBandInfo( lprbcs->uBand, &rbbi ) ); ::SendMessage( rbbi.hwndChild, WM_REBAR_CHILDSIZE, ( WPARAM )&lprbcs->rcBand, ( LPARAM )&lprbcs->rcChild ); break; } case RBN_CHEVRONPUSHED: { NMREBARCHEVRON* lpnm = ( NMREBARCHEVRON* )pNMHDR; VERIFY( m_rbCtrl.GetBandInfo( lpnm->uBand, &rbbi ) ); CRect rcChevron( lpnm->rc ); m_rbCtrl.ClientToScreen( rcChevron ); ::SendMessage( rbbi.hwndChild, WM_REBAR_CHEVRONPUSHED, ( WPARAM )( LPCRECT )rcChevron, lpnm->lParamNM ); break; } default: // Forward notifications from the re-bar control to owner/parent *pResult = GetParent()->SendMessage( WM_NOTIFY, wParam, lParam ); break; } return TRUE; }
LRESULT CToolBarEx::OnReBarChevronPushed( WPARAM wParam, LPARAM /*lParam*/ ) { CRect rcChevron( ( LPCRECT )wParam ); CToolBarPopup menu( this ); menu.ShowPopup( TPM_LEFTALIGN | TPM_VERTICAL | ( CWinAppEx::GetInstance()->IsWin50() ? TPM_VERPOSANIMATION : 0 ), CPoint( rcChevron.left, rcChevron.bottom ), rcChevron ); return 0L; }
BOOL CSizableReBar::OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* pResult ) { if ( wParam == AFX_IDW_REBAR ) { REBARBANDINFO rbbi; rbbi.cbSize = sizeof( rbbi ); rbbi.fMask = RBBIM_CHILD; // Let child windows handle certain messages NMHDR* pNMHDR = ( NMHDR* )lParam; switch ( pNMHDR->code ) { case RBN_CHILDSIZE: { NMREBARCHILDSIZE* lprbcs = ( NMREBARCHILDSIZE* )pNMHDR; VERIFY( m_wndReBar.GetReBarCtrl().GetBandInfo( lprbcs->uBand, &rbbi ) ); ::SendMessage( rbbi.hwndChild, WM_REBAR_CHILDSIZE, ( WPARAM )&lprbcs->rcBand, ( LPARAM )&lprbcs->rcChild ); break; } case RBN_CHEVRONPUSHED: { NMREBARCHEVRON* lpnm = ( NMREBARCHEVRON* )pNMHDR; VERIFY( m_wndReBar.GetReBarCtrl().GetBandInfo( lpnm->uBand, &rbbi ) ); CRect rcChevron( lpnm->rc ); m_wndReBar.ClientToScreen( rcChevron ); ::SendMessage( rbbi.hwndChild, WM_REBAR_CHEVRONPUSHED, ( WPARAM )( LPCRECT )rcChevron, lpnm->lParamNM ); break; } default: break; } // Forward notifications from the re-bar control to owner/parent m_wndReBar.SendMessage( WM_NOTIFY, wParam, lParam ); *pResult = GetParent()->SendMessage( WM_NOTIFY, wParam, lParam ); return TRUE; } return FALSE; }