Rebar controls act as containers for child windows. An application assigns child windows, which are often other controls, to a rebar control band. Rebar controls contain one or more bands, and each band can have any combination of a gripper bar, a bitmap, a text label, and a child window. However, bands cannot contain more than one child window. (Описание из MSDN).
Весь код показать не смогу, дело в том, что я пишу виртуальный тулбар (там периодически меняются иконки, кнопки, контролы, баннер) для коммерческого использования. В общем по требованию заказчика он должен находится на ребаре, чтобы его можно было перетаскивать.
Ну вот как я создаю ребар:
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
REBARINFO rbi;
REBARBANDINFO rbBand;
HWND hwndCB, hwndTB, hwndRB;
RECT rc;
SIZE sz;
::SetClassLong(m_hWnd, GCL_HBRBACKGROUND, (LONG)::GetSysColorBrush(COLOR_BTNFACE));
hwndRB=m_ReBar.Create(m_hWnd, NULL, NULL, WS_CHILD|WS_VISIBLE | WS_CLIPSIBLINGS |
WS_CLIPCHILDREN | /*CCS_NORESIZE | CCS_NOPARENTALIGN |/*RBS_VARHEIGHT |*/
CCS_NODIVIDER, /*RBS_AUTOSIZE*/ 0/*, WS_EX_TOOLWINDOW);
rbi.cbSize = sizeof(REBARINFO);
rbi.fMask = 0;
rbi.himl = (HIMAGELIST)NULL;
m_ReBar.SetBarInfo(&rbi);
rbBand.cbSize = sizeof(REBARBANDINFO);
rbBand.fMask = /*RBBIM_COLORS /*| RBBIM_TEXT /*| RBBIM_BACKGROUND |*/
RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE |
RBBIM_SIZE /*| RBBIM_IDEALSIZE*/;
rbBand.fStyle = RBBS_CHILDEDGE /*| RBBS_FIXEDBMP | RBBS_GRIPPERALWAYS | RBBS_USECHEVRON*/;
rbBand.clrBack=0;
tbar.m_ToolBarImageArea.setBorder(TRUE);//tbar - это мой виртуальный тулбар
tbar.m_ToolBarImageArea.setShowHint(TRUE);
tbar.m_ToolBarImageArea.CreateSimple(m_hWnd);
tbar.m_hWnd=this->m_hWnd;
tbar.createBarControls();
tbar.initButton();
tbar.loadBannerData();
tbar.runBannerImage(true);
rbBand.hwndChild = tbar.m_ToolBarImageArea.m_hWnd;
rbBand.cxMinChild = 0;
tbar.m_ToolBarImageArea.GetPadding(&sz);
rbBand.cyMinChild = tbar.m_ToolBarImageArea.getButtonHeight()+2*sz.cy;// rc.bottom - rc.top;
rbBand.cx = 300;
m_ReBar.InsertBand(-1, &rbBand);
CEdit m_Edit;
m_Edit.Create(m_hWnd, CRect(0, 0, 100, 24), "", WS_CHILD | WS_BORDER
| WS_VISIBLE | ES_LEFT | ES_AUTOVSCROLL | ES_MULTILINE, 0, ID_NONSTRETCH);
::GetWindowRect(m_Edit.m_hWnd, &rc);
//rbBand.fStyle = RBBS_CHILDEDGE | RBBS_HIDDEN;
//rbBand.lpText = " ";
rbBand.hwndChild = m_Edit.m_hWnd;
rbBand.cxMinChild = 0;
rbBand.cyMinChild = rc.bottom - rc.top;
rbBand.cx = 250;
m_ReBar.InsertBand(-1, &rbBand);
// register object for message filtering and idle updates
CMessageLoop* pLoop = _Module.GetMessageLoop();
ATLASSERT(pLoop != NULL);
pLoop->AddMessageFilter(this);
pLoop->AddIdleHandler(this);
return 0;
}
Пишу на WTL (таково требование заказчика).