Autor Wątek: Przesuwanie okna  (Przeczytany 1053 razy)

Offline kapec94

  • Użytkownik

# Listopad 02, 2010, 19:22:07
Cześć.
Mam pytanie.
Ostatnimi czasy intensywnie zajmuję się programowaniem okien w Windowsie, głównie w C# i .NET, ale mam wrażenie, że mój problem dotyczy głównie programowania w WinAPI.
Otóż: zauważyłem, że typowa moja procedura, polegająca na zmianie położenia okna pod wpływem "przytrzymania" go w odpowiednim miejscu (zazwyczaj na rozszerzonej w klienta powierzchni szkła, biblioteka WdmApi się kłania :) ) i poruszania myszą w tę i "wewtę" różni się znacznie od przesuwania okna "Systemowego", pojawiającego się chociażby w przeglądarce Chrome czy w każdym windowsowym innym oknie, na pasku tytułu, tym na samej górze okna. Co mam na myśli: w "systemowym" przesuwaniu okna, to zdaje się być przyklejone do kursora myszy, nie ma tego laga co przy "programowym". Można również w ten sposób "ściągnąć" okno, gdy jest ono zmaksymalizowane, a także przeciągnąć do którejś z krawędzi i rozszerzyć je np. na całą szerokość monitora (tzn. aż po pasek menu start) albo zmaksymalizować. Wszystkie te "feature'y" są dostępne dopiero w Windows 7, jeśli się nie mylę.
Więc zapytowywuję się, co trzeba zrobić, jakie zdarzenie trzeba obsłużyć, by uzyskać taki efekt?
Zdekompilowałem raz bibliotekę pod WPF, implementującą okno w zasadzie takie samo, jak w MS Office 2010. W obsłudze zdarzeń była obsługa WM_NCHITTEST (0x0084). To coś związanego z tym zdarzeniem?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Karol

  • Użytkownik

# Listopad 02, 2010, 22:03:05
Zamiast pisać własne procedury przesuwania okna to wystarczy, że przechwycisz właśnie ten komunikat (WM_NCHITTEST) i sprawdzisz koordynaty podane w lParam, jeżeli znajdują się one w miejscu, które ma oferować funkcjonalność paska tytułowego aplikacji (czyli pozwalać na przeciąganie okna) to zwracasz HTCAPTION.

Offline kapec94

  • Użytkownik

# Listopad 02, 2010, 22:52:44
BARDZO dziękuję za pomoc.
Pozdrawiam.