emacs Temat założony przez niniejszego użytkownika |
[WinAPI] zaznaczanie / odznaczanie elementu w ListView » 2013-05-20 12:20:10 Cześć wszystkim ;) za każdym razem gdy otwieram okno z listview ustawiam zaznaczenie z podświetleniem na 1 pozycje w ten sposób ListView_SetItemState( global::listview, 0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED ); i wszystko jest ok dopóki w listview nie użyje strzałek żeby wybrać jakąś dalsza pozycje bo wtedy kolejny razem gdy otworze okno z listview powyższa funkcja nie chce ustawić zaznaczenia 1 elementu a aktywne zostaje zaznaczenie rekordu który wybrałem wcześniej strzałkami... wydaje mi się że to przez styl okna listview - LVS_SINGLESEL które uniemożliwia zaznaczenie nowego elementu przed zwolnieniem poprzedniego zaznaczenia... może wiecie jak odznaczyć zaznaczoną wcześniej pozycje w listview? jest do tego jakaś funkcja, makro? |
|
xevuel |
» 2013-05-20 12:40:21 ListView_SetItemState( hList, - 1, 0, LVIS_SELECTED );
|
|
emacs Temat założony przez niniejszego użytkownika |
» 2013-05-20 13:08:58 niestety nie usuwa zaznaczenia z elementu, jak dodaje nowy element do listy to przesuwa ten stary razem z zaznaczeniem na kolejną pozycje... w kontrolce listview sprawdzam sobie to tak if( wParam == VK_TAB ) { ListView_SetItemState( global::listview, - 1, 0, LVIS_SELECTED ); int index = ListView_GetSelectionMark( global::listview ); std::cout << index << std::endl; } i ListView_GetSelectionMark( global::listview ) za każdym razem gdy dodam nowy element zwraca kolejną pozycje |
|
DejaVu |
» 2013-05-22 21:56:37 Fragment CodeDeska: int CListView::getSingleSelection() { return sendMessage( LVM_GETNEXTITEM, - 1, LVNI_FOCUSED ); }
void CListView::setSingleSelection( int iRow, bool bEnsureVisible ) { ListView_SetItemState( m_hWnd, iRow, LVIS_SELECTED, LVIS_SELECTED ); ListView_SetItemState( m_hWnd, iRow, LVIS_FOCUSED, LVIS_FOCUSED ); if( bEnsureVisible ) ListView_EnsureVisible( m_hWnd, iRow, TRUE ); }
void CListView::moveSelection( int iOffset, bool bEnsureVisible ) { int iCurSel = getSingleSelection() + iOffset; if( iCurSel < 0 ) iCurSel = 0; int iCount = size(); if( iCurSel >= iCount ) iCurSel = iCount - 1; setSingleSelection( iCurSel, bEnsureVisible ); }
int CListView::size() { return ListView_GetItemCount( m_hWnd ); }
|
|
emacs Temat założony przez niniejszego użytkownika |
» 2013-05-25 17:15:57 Dziękuje za odpowiedź jednak to nadal nic nie zmieniło, zaznaczenie ciągle zostaje... nawet jak zaznaczę jakiś element myszka i później dodam kilka nowych elementów do listview to zaznaczenie zostaje już jakby 'na stałe' przypisane do tego elementu który wcześniej wcisnąłem i dopiero jak zaznaczę inny element myszką to zmienia się. A koniecznie potrzebuje aby zawsze 'standartowo' był zaznaczony 1 element - jak dodaje nowe rekordy to zaznaczenie powinien mieć element 0 czyli ten dodany najpóźniej i tak samo jak zaznaczę myszką to po dodaniu następnego rekordu zaznaczenie powinno automatycznie przejść na ten nowy rekord.
Jak na razie pomaga jedynie usunięcie wszystkich elementów i wrzucenie ich jeszcze raz ale to raczej nie ta droga...
A może wiecie jak wysłać komunikat do listview poprzez np SendMessage( global::listview, WM_CHAR, 0, 0 ); aby po dodaniu elementu 'wirtualnie' naciskał myszą na 0 elemencie listy? jak coś takiego zrealizować? |
|
DejaVu |
» 2013-05-25 17:20:19 Skoro w CodeDesku działa to i Tobie również musi działać. No chyba, że coś źle robisz to na to nie ma mocnych. |
|
emacs Temat założony przez niniejszego użytkownika |
» 2013-05-25 20:17:00 getSingleSelection() w tym przypadku zwraca 1 pozycje która ma focusa a iOffset? tak u mnie wygląda funkcja która dodaje rekordy void api_listview_add() { LVITEM lvi; lvi.mask = LVIF_TEXT; lvi.pszText = lvi.pszText = LPSTR( api_source_name_cut( global::source_name ).c_str() ); lvi.iItem = 0; lvi.iSubItem = 0; int index = ListView_GetSelectionMark( global::listview ); std::cout << "listview add na wejsciu" << index << std::endl; if( api_listview_source_search() == 1 ) { string size = global::file.getsize(); string date = global::file.gettime(); ListView_SetItemText( global::listview, global::source_search_number, 1, LPSTR( size.c_str() ) ); ListView_SetItemText( global::listview, global::source_search_number, 2, LPSTR( date.c_str() ) ); } else { ListView_InsertItem( global::listview, & lvi ); global::listview_line_size++; string size = global::file.getsize(); string date = global::file.gettime(); ListView_SetItemText( global::listview, 0, 1, LPSTR( size.c_str() ) ); ListView_SetItemText( global::listview, 0, 2, LPSTR( date.c_str() ) ); } api_listview_move_selection( 0, 1 ); } api_listview_mowe selection() zawiera w sobie wszystko co podałeś powyżej |
|
DejaVu |
» 2013-05-25 20:22:50 Wiesz... ale ListView może pracować w trybie Single Selection jak również Multi Selection. Co więcej, są różne funkcje do obsługi obu scenariuszy. |
|
« 1 » 2 3 |