Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przechwycenie komunikatu od kontrolek winAPi
Konnekt | Forum > Developerzy > Tworzenie wtyczek
KoSiarzPL
Czy kontrolki w WinAPI wysyłąją do siebie powiadomienia?
Weżmy dla przykładu listboxa. Czy ona wysyla do siebie powiadomienia np: LBN_DBLCLK, LBN_ERRSPACE, LBN_KILLFOCUS, ... Czy wysyła je tylko do rodzica a jeśli tak a jeśli tak czy można je jakoś przechwycić nie podkłądając własnego okna pomiędzy rodziaca a kontrolke?
winthux
wysyłają chyba tylko do rodzica, a rodzica możesz łatwo obczaić funkcją GetParent smile.gif Następnie podpinasz się pod windowsProc i przechwytujesz komuniakty:]
Olórin
Subclassowanie okien (moja specjalność tongue.gif)

Tak jak napisał winthux trzeba podpiąc się pod rodzica....

1. Przechwytujesz tworzenie okna, a tam
CODE
SetProp(hwnd,"Subclass",SetWindowLong(hwnd,GWL_WNDPROC,(LONG)WndProc));

2. Teraz WndProc
CODE

LRESULT CALLBACK WndProc(
   HWND hwnd,        // handle to window
   UINT uMsg,        // message identifier
   WPARAM wParam,    // first message parameter
   LPARAM lParam)    // second message parameter
{
 switch (uMsg)
   {
/* tu przechywytujemy i analizujemy wiadomości, jeżeli nie chcemy nie musimy przekazyać dalej/*
 case WM_NOTIFY: // Obsługa WM_NOTIFY
 {
  NMHDR* head = (NMHDR*) lParam;
  switch(head->code)
  {
/* tu przetwarzamy wm_notify, dodałem ten przykład co by było łatwiej */
  }
  break;
}
}
return CallWindowProc((WNDPROC)GetProp(hwnd,"Subclass"),hwnd,uMsg,wParam,lParam);
}



Zamiast SetProp i GetProp można użyć w zasadzie zmiennej, ale... musimy być pewni że wszystkie okna będą miały taką samą procedurę (np. konnferencja i ggimage subclassują tylko okna kiedy siec to gg) - moje rozwiązanie daje spokój że będzie ok smile.gif
KoSiarzPL
Tak tez bym robil jeśli nie ma innej metody. Wolal bym nie mieszać się zupelnie w rodzica.
Olórin
Spokojnie, nie namieszasz wink.gif tabletka, sprzątaczka, klawa i kzmieniacz też subclassują i działają wink.gif
KoSiarzPL
Ja wiem, że będzie mi działać. Sęk w tym iż ja buduję klasę opakowującą listboxa z WinAPI dla konfiguracji. Jak na razie działa znakomicie cool.gif
Co myślicie o instrukcji:
CODE
SetWindowLongPtr( GetParent( okno ), GWLP_WNDPROC, (LONG)staraProc );

W momencie niszczenia kontrolki? Właśnie mi wpadło do głowy i jeszce nie miałem się czasu nad nią zastanowić.
Olórin
Tak, jeżeli już subclass nie bedzie potrzebny to oczywiście - zwłaszcza kiedy bez listboxa mógłby sprawiać problemy wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2012 Invision Power Services, Inc.