понедельник, 16 июня 2008 г.

wxMenu с иконками и обход выделенных атемов в wxListCtrl

Пара маленьких функий, может кому пригодится.

Был удивлен что у 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 знакомлюсь, вот и выпендриваюсь:)