Нужно сделать сабж (как, например в Outlook 2007). Работаю в VS2010 под Win XP. Беру стандартный визардовый MDI проект. Тулбар создается стандартно:
if ( !m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
{
TRACE0("Не удалось создать панель инструментов\n");
return -1; // не удалось создать
}
Дальше мои попытки добавить стрелку для выпадающего меню и/или подпись к кнопке. Как я только не извращался...
(1)
// расширенный стиль почему-то не устанавливается
m_wndToolBar.ModifyStyleEx( 0, TBSTYLE_EX_MIXEDBUTTONS | TBSTYLE_EX_DRAWDDARROWS );
int i = m_wndToolBar.CommandToIndex( ID_TEST );
m_wndToolBar.SetButtonStyle( i, BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT | BTNS_DROPDOWN );
// текст даже в качестве тултипа не устанавливается, не говоря уже о подписи
m_wndToolBar.SetButtonText( i, _T( "Test" ) );
// кнопка без изменений
В VS2005 для CToolBar этот способ работал, но там расширенный стиль ставился так:
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle( TBSTYLE_EX_MIXEDBUTTONS );
Теперь же контрола тулбара вроде как нет.
(2)
// сделать хотя бы подпись...
int i = m_wndToolBar.CommandToIndex( ID_TEST );
CMFCToolBarButton* b = m_wndToolBar.GetButton(i);
b->m_strText = _T( "TEST" );
b->m_bText = true;
b->m_bImage = false;
// кнопка без изменений
(3)
// сделать хотя бы подпись...
int i = m_wndToolBar.CommandToIndex( ID_TEST );
CMFCToolBarButton* b = new CMFCToolBarButton( ID_TEST, ID_TEST - 1 , _T( "test" ), 1 );
b->m_strText = _T( "TEST" );
b->m_bText = true;
b->m_bImage = false;
b->Show(true);
m_wndToolBar.ReplaceButton( ID_TEST, *b );
// кнопка без изменений
(4)
// сделать хотя бы стрелку...
CMFCToolBarMenuButton* b = new CMFCToolBarMenuButton( ID_TEST, 0, ID_TEST, _T( "test" ) );
m_wndToolBar.ReplaceButton( ID_TEST, *b );
// кнопка без изменений
P.S. Подскажите, есть ли нормальная русская книжка по MFC в VS2010?
Сделал так:
ON_REGISTERED_MESSAGE(AFX_WM_RESETTOOLBAR, OnToolbarReset)
afx_msg LRESULT CMainFrm::OnToolbarReset(WPARAM wp, LPARAM)
{
UINT id = (UINT)wp;
if( id == IDR_MAINFRAME )
{
CMFCToolBarMenuButton b( IDB_TEST, this->GetSystemMenu(0)->GetSafeHmenu(),
-1, _T( "Подпись к кнопке" ) );
b.m_bText = true;
m_wndToolBar.ReplaceButton( IDB_TEST, b );
}
return 0;
}
Нужно было а) поменять кнопку в этом обработчике; б) задать реальный хэндл на меню, иначе стрелка не появится; в) после компиляции сбросить меню через его настройки, т.к. из реестра грузится все равно старое меню.
При этом CMFCToolBarButton::m_bWrapText не похоже, что работает (а жаль), как и CMFCToolBar::SetButtontext. Также открыт вопрос про книжку/статьи по MFC в VS2010.
Поищи примеры по "Visual C++ 2008 Feature Pack samples".
Книжки скорее всего нет, вернее есть, но по сути перепечатка старых книг.
Здравствуйте, Kernel0, Вы писали:
K>Сделал так:
Может, проще вызвать метод
EnableTextLabels()?
Здравствуйте, Hawk, Вы писали:
H>Здравствуйте, Kernel0, Вы писали:
K>>Сделал так:
H>Может, проще вызвать метод EnableTextLabels()?
Это делает подписи под всеми кнопками, а мне надо было под (а лучше рядом с) некоторыми.
Здравствуйте, Kernel0, Вы писали:
K>P.S. Подскажите, есть ли нормальная русская книжка по MFC в VS2010?
Книжек не видел (их, вероятно, нет) но пользуюсь ссылочками:
1)
http://www.codeguru.com/cpp/cpp/cpp_mfc/tutorials/article.php/c14929/MFC-Feature-Pack-An-Introduction.htm
2)
http://www.codeproject.com/Articles/217588/Porting-a-legacy-MFC-app-to-MFC-Feature-Pack
ну и конечно же online MSDN...
P.S. Насчет "нормальных русских книжек по MFC" — давно уже не встречал