Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI] zaznaczanie / odznaczanie elementu w ListView

Ostatnio zmodyfikowano 2013-05-27 22:46
Autor Wiadomość
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
 
C/C++
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?
P-83395
xevuel
» 2013-05-20 12:40:21
C/C++
ListView_SetItemState( hList, - 1, 0, LVIS_SELECTED );
P-83396
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
C/C++
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
P-83399
DejaVu
» 2013-05-22 21:56:37
Fragment CodeDeska:
C/C++
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 );
}
P-83628
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ć?
P-83850
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.
P-83851
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
C/C++
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
P-83892
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.
P-83895
« 1 » 2 3
  Strona 1 z 3 Następna strona