ListView - zaginiony Focus

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 ?

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 .

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 ... )
  1. 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.

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ć.

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.

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