ListView - zaginiony Focus

Odpowiedz Nowy wątek
Zaginiony w akcji
2017-06-13 11:57
Zaginiony w akcji
0

Witam ,
Stworzyłem układ okien wg. schematu:

  **Okno główne-> 2 okna  podrzędne  ->  kontrolka ListView.**

Chciałbym po uruchomieniu programu , by na kontrolce ListView np. na pierwszym elemencie pojawił się fokus.
Niestety albo coś źle robię ale jest jakiś ( jak zwykle ) wytrych , który sprawia , że fokus się nie pojawia.

Sprawdzałem zawsze , kto faktycznie otrzymał fokus - wszystko się zgadza.
Czyli GetFocus() wskazuje na uchwyt kontrolki ListView, a aktywne okno na uchwyt okna głównego.
Jednak focus się nie pojawia.

Kiedy to powtórzę ale po wywaleniu okien podrzędnych, czyli w takim układzie:
Okno główne -> kontrolka ListView
wszystko jest OK. Mogę dowolnie ustawiać fokus, zaznaczenie , wszystko działa poprawnie.

Czy ktoś jest mi w stanie podpowiedzieć gdzie może tkwić błąd ?

Pozostało 580 znaków

2017-06-14 09:30

Rejestracja: 14 lat temu

Ostatnio: 3 dni temu

Lokalizacja: Gorlice

0

Nie napisałeś nic jak robisz (nawet fragmentu kodu) a tylko objawy więc trudno powiedzieć co może być nie tak. Wydaje mi się (dawno sie nie bawiłem WinApi a nie che mi się sprawdzać) że powinno zadziałać SetActiveWindow lub SetWindowPos z parametrem HWND_TOP na uchwyt okna z ListView a później SetFocus dla kontrolki ListView .


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek, 2017-06-14 09:32

Pozostało 580 znaków

Zaginiony w akcji
2017-06-14 14:19
Zaginiony w akcji
0
kAzek napisał(a):

Nie napisałeś nic jak robisz (nawet fragmentu kodu) a tylko objawy więc trudno powiedzieć co może być nie tak. Wydaje mi się (dawno sie nie bawiłem WinApi a nie che mi się sprawdzać) że powinno zadziałać SetActiveWindow lub SetWindowPos z parametrem HWND_TOP na uchwyt okna z ListView a później SetFocus dla kontrolki ListView .

Dziękuję za wskazówki.
Twoja sugestia nie pomogła, chyba , że robię coś niepoprawnie. Wrzuciłem ją do funkjci w której wypełniam kontrlkę ListView:
int iRezultat = SetWindowPos( hwndListView, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
_listView.SetFocus();

Kodu nie wrzucałem, bo jest rozbudowany ( wrapper) , poza tym zakładałem, że być może to jakiś rodzaj "wytrychu", o którym wielu wie, tylko nie ja.
Problem jest o tyle zastanawiający, że kiedu na szybko wrzuciłem prosty kod nawet dla układu:
Okno główne -> 2 okna podrzędne -> kontrolka ListView.
Focus się pojawia. Kod tworzenie i wypełniania kontrolki ListView (style, kolumny itd ) jest taki sam , jak w programie bardziej rozbudowanym . Róznica polega tylko na tym , że pominąłem opakowanie kodu w klasy.

Kod opakowany w klasy ( wrapper):

  1. Klasa bazowa CWindowBase

    • zawiera uchwyt do tworzonego okna
    • tworzy wszystkie okna
    • zawiera metody konfigurujące tworzone okna
  2. klasa CWindowDerivid wyprowadzona z CWindowBase:

    • tu przechowuję jako statyczną Procedurę tworzonych okien (głównego i potomnych) , która deleguje do odpowiednich obiektów komunikaty msg.
      Procedura zawiera tzw. "mechanizm przekazywania wskaźników do funkcji statycznej "
    • virtualne delegaty obsługi komunikatów ( OnMessage, OnCreate ... )
  3. Klasa Panel

    • wywołuje utworzenie kontrolek ListView
    • dodaję kolumny, tekst ...
    • ustawiam , który item kontrolki będzia miał fokus i czy będzie zaznaczony:
      UINT state_ = LVNI_SELECTED | LVNI_FOCUSED;
    • ustawiam Focus:
      int iRezultat = SetWindowPos( hwndListView, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
      _listView.SetFocus();
    • zawiera subclassing kontrolki ListView
    1. Klasa ListView
      • zawiera obsługę kontrolki ListView
      • I. cz. subclassingi

Na koniec po utworzeniu wszystkich okien sprawdzam ( w pliku log) poprawność uchwytów okien, kontrolek , kto ma Focus , jakie okna jest aktywne ... jaki element kontrolki ma focus i zaznaczenie
Podobną procedurę testową wykonywałem dla testów prymitywnego programu, w którym focus i zaznaczenie pojawiają się bez problemu.

Okna i kontrolki tworzą się poprawnie, poprawnie się pozycjonują , tak jak tego sobie życzę.
Tylko Focus jest niewidoczny, mimo, że w logach ( również to sprawdzałem dobugerem) mam dowód , że kontrolka ListView ma focus, a oknem aktywnym jest okno główne. W ramach testu zmieniałem ustawienia dla kontrolek , pozycję elementu, który ma mieć focus itd i wszystko w pliku log jest poprawne.

Pozostało 580 znaków

2017-06-15 13:33

Rejestracja: 14 lat temu

Ostatnio: 3 dni temu

Lokalizacja: Gorlice

0

Nie chodziło mi o SetWindowPos na uchwyt kontroli ListView tylko na uchwyt okna z tą kontrolką (czyli jej rodzica), później wywołanie SetFocus dla kontrolki powinno zadziałać.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.

Pozostało 580 znaków

Odnaleziony focus
2017-06-19 09:21
Odnaleziony focus
0

Dziękuję bardzo.
Ponieważ nie działało dla uchwytu okna rodzica , to sprawdziłam również dla wszystkich uchwytów kontrolek i to ostanie sprawdzenie wkleiłem.
Sprawdziłem również porządek-Z okien funkcją GetTopWindow i wszystko było ok.
Ale błąd znalazłem , polegał na tym, że wywoływałem funkcję subclassingu kontrolki ListView przed ustawieniem Focusa, a subclassing miałem niedokończony. To skutkowało ostatecznie "zaginięciem" focusa. Z kolei ten błąd był powiązany z niedopracowaniem ustawień w zmiennych dla funkcji delegowania komunikatu WM_SETFOCUS.

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0