wxMenu с иконками и обход выделенных атемов в wxListCtrl
June 16th, 2008 Begemot Posted in Программирование
Пара маленьких функий, может кому пригодится.
Был удивлен что у wxMenu::Append нету для добавления меню с картинками. Пришлось писать самому
wxMenuItem * MainFrame::AppendMenuItemWithImage(wxMenu* parentMenu,
int id, const wxString& text, const wxString& helpString, const wxBitmap& checked, const wxBitmap& unchecked, wxItemKind kind, wxMenu* subMenu)
{
wxMenuItem* menuItem =
new wxMenuItem(parentMenu, id, text, helpString, kind, subMenu);
menuItem->SetBitmaps(checked, unchecked);
parentMenu->Append(menuItem);
return menuItem;
}
Использование:
wxMenu* itemMenu = new wxMenu;
AppendMenuItemWithImage(itemMenu, ID_HIDE, _(“&Hide In Tray\tEsc”), _T(“”), wxBitmap(hide_xpm));
AppendMenuItemWithImage(itemMenu, wxID_EXIT, _(“E&xit\tAlt-x”), _T(“”), wxBitmap(exit_xpm));
menuBar->Append(itemMenu, _(“&File”));
И еще один маленький хелпер для удобной работы с выделенными айтемами в wxListCtrl:
vector<
long> MainFrame::GetListCtrlItems(const wxListCtrl * lcont, int state /*= wxLIST_STATE_DONTCARE*/, int geometry /*= wxLIST_NEXT_ALL*/, long item/*=-1*/)
{
vector<
long> items;
items.resize(lcont->GetSelectedItemCount());
// надеюсь так быстрее чем push_back
long ind=0;
do
{
item= lcont->GetNextItem(item, geometry, state);
if (item!=-1) items[ind++]=item; //items.push_back(item);
}
while( item != -1 );
return items;
}
Использование:
vector<
long> items=GetListCtrlItems(m_listFormat, wxLIST_STATE_SELECTED);
BOOST_FOREACH(
long item, items)
{
str+=m_listFormat->GetItemText(item)+wxT(
“\n”);
…
}
Иногда удобнее работать с вектором, хотя это я просто сейчас с STL знакомлюсь, вот и выпендриваюсь:)
June 21st, 2008 at 8:24 am
Угу, именно это и называется стабильным API 🙂 Поэтому и возникают такие небольшие неудобства.
June 26th, 2008 at 5:43 pm
Для wxListCtrl не понял юмора. Я всегда юзаю wxListView и там есть методы для навигации по выделенным итемам. Если у меня несколько сот тысяч итемов и виртуальный листвью, то не вижу смысла вобще где-либо хранить выделенные итемы лишний раз, это ж туева гора памяти.
Но… на вкус и цвет фломастеры разные.
July 2nd, 2008 at 7:04 am
wxListView не использовал, но возможность навигации по выделенным атемам есть и в wxListCtrl, просто так как я сделал мне показалось удобнее.
Вот например задача удалить все выделенные айтемы:
vector<long> items=GetListCtrlItems(m_listFormat, wxLIST_STATE_SELECTED);
for (vector<long>::reverse_iterator it=items.rbegin(); it!=items.rend(); ++it)
{
cbData->DeleteFormat(m_listFormat->GetItemData(*it));
m_listFormat->DeleteItem(*it);
}
December 24th, 2008 at 1:13 pm
[…] AppendMenuItemWithImage можно взять в wxMenu с иконками и обход выделенных атемов в wxListCtrl […]