Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Hasło nie zostało zweryfikowane
Niniejsze hasło zostało opracowane, jednak nie zostało ono zweryfikowane przez administrację serwisu. Jeżeli znalazłeś błędy merytoryczne w niniejszym dokumencie, prosimy o ich zgłoszenie na forum w dziale Znalezione błędy.
Opracował: jankowalski25
Biblioteki C/C++

SetWindowPos

[funkcja] Zmienia rozmiar, pozycję lub kolejność wyświetlania okna.

Składnia

C/C++
#include <windows.h>

BOOL WINAPI SetWindowPos( HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags );

Argumenty

ArgumentOpis
hWndUchwyt do okna.
hWndInsertAfterUchwyt do okna poprzedzającego okno umieszczone na osi Z. Wartość tego argumentu może być uchwytem do okna lub przyjmować jedną z poniższych stałych:
NazwaWartośćZnaczenie
HWND_BOTTOMHWND(1)Umieszcza okno na końcu osi Z. Jeśli wartość argumentu hWnd określa okno najwyższego poziomu, to dane okno przestaje być oknem najwyższego poziomu i jest umieszczane pod wszystkimi innymi oknami.
HWND_NOTOPMOSTHWND(-2)Umieszcza okno poniżej wszystkich okien najwyższego poziomu. Ustawienie tej flagi niczego nie zmienia, jeśli okno nie jest oknem najwyższego poziomu.
HWND_TOPHWND(0)Umieszcza okno na szczycie osi Z.
HWND_TOPMOSTHWND(-1)Umieszcza okno powyżej wszystkich okien, które nie są oknami najwyższego poziomu. Okno utrzymuje swój stan okna najwyższego poziomu, nawet gdy jest dezaktywowane.
XNowa pozycja lewego brzegu ekranu.
YNowa pozycja górnego brzegu ekranu.
cxNowa szerokość okna.
cyNowa wysokość okna.
uFlagsRozmiary okna i flagi pozycjonowania. Wartość tego argumentu może być połączeniem poniższych stałych:
NazwaWartośćZnaczenie
SWP_ASYNCWINDOWPOS0x4000Jeśli wywoływany wątek jest połączony z inną kolejką wejściową, niż wątek będący właścicielem okna, system wysyła żądanie do wątku będącego właścicielem okna. To ułatwia zablokowanie bieżącego wątku i utworzenie innych wątków do obsługi danego żądania.
SWP_DEFERERASE0x2000Zapobiega wywoływaniom komunikatu WM_SYNCPAINT.
SWP_DRAWFRAME0x0020Rysuje ramkę wokół okna (zdefiniowaną w opisie klasy tego okna).
SWP_FRAMECHANGED0x0020Zmienia nowe style ramki używając funkcji » WinAPISetWindowLong. Wysyła komunikat WM_NCCALCSIZE do okna, nawet jeśli jego rozmiar nie zostanie zmieniony. Jeśli ta flaga nie jest ustawiona, komunikat WM_NCCALCSIZE jest wysyłany tylko podczas zmiany rozmiaru okna.
SWP_HIDEWINDOW0x0080Ukrywa okno.
SWP_NOACTIVATE0x0010Nie pozwala na aktywację okna. Jeśli ta flaga nie jest ustawiona, okno jest aktywowane i przesuwane na szczyt innych okien z danej grupy (w zależności od ustawienia argumentu hWndInsertAfter).
SWP_NOCOPYBITS0x0100Nie kopiuje zawartości obszaru klienta. Jeśli ta flaga nie jest ustawiona, poprawna treść obszaru klienta jest zapisywana i kopiowana z powrotem do obszaru klienta po zmianie pozycji lub rozmiaru okna.
SWP_NOMOVE0x0002Zachowuje obecną pozycję (ignoruje wartości argumentów X i Y).
SWP_NOOWNERZORDER lub SWP_NOREPOSITION0x0200Nie zmienia właściciela pozycji okna w osi Z.
SWP_NOREDRAW0x0008Nie odrysowuje okna. Jeśli ta flaga jest ustawiona, okno nie jest odmalowywane. Kiedy ta flaga jest ustawiona, program musi jawnie odświeżyć lub odrysować określone części danego okna oraz okna nadrzędnego.
SWP_NOSENDCHANGING0x0400Zapobiega przechwytywaniu komunikatu WM_WINDOWPOSCHANGING przez dane okno.
SWP_NOSIZE0x0001Zachowuje obecny rozmiar okna (ignoruje argumenty cx i cy).
SWP_NOZORDER0x0004Zachowuje obecną kolejność elementów w osi Z (ignoruje argument hWndInsertAfter).
SWP_SHOWWINDOW0x0040Wyświetla dane okno.

Zwracana wartość

Jeśli nie wystąpią błędy, zwracana wartość jest niezerowa, inaczej 0. Aby uzyskać szczegółowe informacje o błędzie, wywołaj funkcję » WinAPIGetLastError.

Dodatkowe informacje

Okna umieszczone na osi Z są układane zgodnie z kolejnością ich pojawiania się na ekranie. Okno najwyższego poziomu ma najwyższy priorytet i jest pierwszym oknem na osi Z. Wartości argumentów X i Y są wyrażone we współrzędnych klienta, natomiast wartości argumentów cx i cy w pikselach.

Na niektórych systemach Windows Vista wszystkie usługi zostały przeniesione na zewnątrz pulpitu interaktywnego do sesji 0. Uchwyty do okien i operacje menedżera okien przynoszą rezultaty tylko wewnątrz obecnej sesji. Wszelkie próby zmiany uchwytu okna w innych sesjach zakończą się niepowodzeniem. Jeśli określone dane okna zostaną zmienione przy użyciu funkcji » WinAPISetWindowLong, należy wywołać tą funkcję z argumentem uFlags o wartości
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED
, aby uzyskać oczekiwane rezultaty.

Okno może być oknem najwyższego poziomu również przez ustawienie wartości argumentu hWndInsertAfter na HWND_TOPMOST i upewnieniu się, że flaga SWP_NOZORDER nie jest ustawiona. Można również umieścić okno na osi Z powyżej jakichkolwiek istniejących okien najwyższego poziomu. Kiedy okno niebędące oknem najwyższego poziomu staje się oknem najwyższego poziomu, jego okna potomne również stają się oknami najwyższego poziomu. Mimo tego okna nadrzędne dla tego okna nie zmieniają swojego stanu.

Jeśli flagi SWP_NOACTIVATE i SWP_NOZORDER nie są ustawione (na przykład okno jest aktywowane i jednocześnie jego pozycja na osi Z zostaje zmieniona), wartość argumentu hWndInsertAfter jest używana tylko w następujących sytuacjach:
  • Flaga HWND_TOPMOST oraz HWND_NOTOPMOST nie została ustawiona dla okna określanego przez wartość argumentu hWndInsertAfter.
  • Okno określane przez wartość argumentu hWnd nie jest oknem aktywnym.

Program nie może aktywować nieaktywnego okna bez przeniesienia go na szczyt osi Z. Programy mogą zmieniać pozycję okna aktywowanego na osi Z bez ograniczeń oraz mogą aktywować okno, a następnie przemieścić je na szczyt okien najwyższego poziomu lub okien innych, niż okna najwyższego poziomu. Jeśli okno najwyższego poziomu znajdzie się na ostatniej pozycji na osi Z (HWND_BOTTOM) lub znajdzie się pod wszystkimi oknami najwyższego poziomu, przestaje być oknem najwyższego poziomu. Kiedy okno najwyższego poziomu przestaje być oknem najwyższego poziomu, jego okna potomne również przestają być oknami najwyższego poziomu. Okno niebędące oknem najwyższego poziomu może być oknem nadrzędnym dla okna najwyższego poziomu, ale nie odwrotnie. Każde okno (na przykład okno dialogowe) będące oknem podrzędnym dla okna najwyższego poziomu jest także oknem najwyższego poziomu. Dzięki temu wszystkie okna potomne znajdują się nad swoim oknem nadrzędnym (na przykład okno dialogowe znajduje się nad głównym oknem programu). Jeśli program nie znajduje się w tle, ale powinien działać w tle, należy wywołać funkcję SetForegroundWindow. Aby to zrobić, proces będący właścicielem okna musi mieć dostęp do funkcji SetForegroundWindow.

Wymagania

Minimalny system klientaWindows 2000 Professional (tylko aplikacje biurowe).
Minimalny system serweraWindows 2000 Server (tylko aplikacje biurowe).
NagłówekWinuser.h (dołącza Windows.h)
BibliotekaUser32.lib
DLLUser32.dll

Linki zewnętrzne