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
» 2013-05-25 20:34:04
Rozumiem to i w 1 poście zaznaczyłem że moja kontrolka lisview posiada styl LVS_SINGLESEL wiec możliwe jest zaznaczenie tylko jednego elementu jednocześnie
P-83901
DejaVu
» 2013-05-25 21:28:05
Więc skoro masz singlesel to nie może być sytuacji w której 2 elementy Ci się zaznaczają (tak jak sugerujesz, że obecnie działa).
P-83906
emacs
Temat założony przez niniejszego użytkownika
» 2013-05-25 22:12:59
widocznie źle mnie zrozumiałeś, nie zaznaczają mi się 2 elementy tylko jeden ma ciągle zaznaczenie i przesuwa się w miarę dodawania nowych elementów w dół listy...
rozwiązałem problem tak
C/C++
POINT mouse;
GetCursorPos( & mouse );
int a = mouse.x;
int b = mouse.y;

RECT rcl;
GetWindowRect( global::dialog_window, & rcl );
int x = rcl.left + 50;
int y = rcl.top + 50;

SetCursorPos( x, y );
mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );

SetCursorPos( x, y );
pobieram aktualne położenie mychy, programowo ustawiam i klikam w 1 pozycje na listview i wracam do położenia pierwotnego czy takie coś ma sens?

P-83912
DejaVu
» 2013-05-25 23:27:14
Raczej złym rozwiązaniem jest uzależniać zaznaczenie elementu od położenia myszy, bowiem skrótami klawiszowymi też się da wiele zrobić. Skoro zaznacza Ci się każdy kolejny element przy dodawaniu nowego elementu to znaczy, że ustawiasz na nowy element zaznaczenie przez jeden z Twoich wytrychów. W końcu skoro już jednym wytrychem 'skutecznym' się pochwaliłeś by rozwiązać błąd to istnieje spora szansa, że jest ich w Twoim kodzie więcej. Każdy wytrych to nic innego jak zamiatanie buga pod dywan, zamiast jego rozwiązywanie, a to z kolei się zawsze mści w późniejszym czasie :)

/edit:
A, że da się poprawnie napisać to masz tu przykład: http://ddt.pl/listView.zip
P-83917
emacs
Temat założony przez niniejszego użytkownika
» 2013-05-26 13:48:46
według mnie cały błąd sprowadza się do tego że nie mogę (nie mam pojęcia czemu) odznaczyć programowo zaznaczonego wcześniej elementu bo

ListView_SetItemState (global::listview, numer_rekordu, LVIS_SELECTED | LVIS_FOCUSED,                  LVIS_SELECTED | LVIS_FOCUSED);

zaznacza mi pozycje prawidłowo ale już ten kod

ListView_SetItemState (global::listview, numer_rekordu, 0,
LVIS_SELECTED | LVIS_FOCUSED );

który powinien odznaczyć rekord poprostu tego nie robi i 

int index = ListView_GetSelectionMark( global::listview );

ciągle zwraca ostatnio zaznaczona pozycje a ja chce żeby po ukryciu okna z kontrolka listview tak

ShowWindow( global::dialog_window, 0 );

odznaczał się zaznaczony wcześniej element
P-83956
DejaVu
» 2013-05-26 13:51:42
Jak jest tryb single-select to chyba domyślnie jest zabroniona możliwość odznaczenia zaznaczonego elementu tj. zawsze musi być coś zaznaczone jeżeli lista nie jest pusta. Ale... chyba również na to istnieje jakaś flaga.

C/C++
ListView_SetItemState( global::listview, numer_rekordu, 0, LVIS_SELECTED | LVIS_FOCUSED );

W którym miejscu w dokumentacji masz napisane, że ta linijka ODZNACZA rekord? Jakoś nie wydaje mi się, żeby to tak działało jak myślisz.
P-83958
emacs
Temat założony przez niniejszego użytkownika
» 2013-05-26 14:29:04
Odpaliłem sobie CodeDesk i chciałbym abyś mi powiedział jak obsłużyłeś klawisze strzałek w listview-ach bo widzę ze jak jade strzałką w dół to przechodzi na kolejne pozycje niżej ale daje im tylko "selected" jakby bez focusa czyli tego wykropkowanego obramowania u mnie zaznacza z obramowaniem może to w tym coś jest....
Przepraszam za tyle pytań ale jest to dla mnie ważne
P-83968
DejaVu
» 2013-05-26 14:44:36
Już Ci wklejałem wcześniej kod, który obsługuje poprawnie zaznaczanie. Co do strzałek:
C/C++
bool CCodeDeskApp::delegate_OnKeyDown( CWindowBase * pWnd, DWORD iKeyCode, WORD iRepeatCount, BYTE iScanCode, bool bExtendedKey, bool bWasPressedBefore )
{
    if( !pWnd )
         return false;
   
    if( pWnd->getHWND() == m_pSearchBox->getHWND() )
    {
        switch( iKeyCode )
        {
        case VK_UP: m_pSearchResult->moveSelection( - 1 ); return true;
        case VK_DOWN: m_pSearchResult->moveSelection( 1 ); return true;
        case VK_PRIOR: m_pSearchResult->moveSelection( - 8 ); return true;
        case VK_NEXT: m_pSearchResult->moveSelection( 8 ); return true;
        case VK_RETURN: return openVirtualKeyInBrowser( static_cast < long >( m_pSearchResult->getItemData( m_pSearchResult->getSingleSelection() ) ) );
            default: return false;
        } //switch
    } //if
    return false;
}
P-83974
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona