2011-11-28 10 views
10

Jakie są najlepsze praktyki dotyczące układania okien potomnych (elementów sterujących) w oknie dialogowym lub oknie głównym? Mam na myśli mechanizm wiążący, który ustaliłby względne pozycje kontrolki do granicy okna nadrzędnego, tak jak w WPF. Podczas zmiany rozmiaru okna kontrolka podrzędna zmieniłaby rozmiar wraz z głównym oknem. Obecnie mam to: List view dialogJak powiązać okna podrzędne z oknem nadrzędnym we względnych położeniach?

Jak widać z czerwonymi liniami nie wygląda dość, kiedy jestem zmiana rozmiaru okna nadrzędnego formantu widoku listy. Chciałbym powiązać na przykład prawą stronę ListView z prawą krawędzią DialogBox i podobnie z innymi kontrolkami.

Wiem, że mogę grać z funkcjami GetWindowRect, GetClientRect i MoveWindow. Ale czy to jest właściwy sposób?

Obecnie pracuję z czystym Win32 Api bez MFC.

Odpowiedz

9

Jeśli używasz tylko interfejsu Win32 API, normalnie radzisz sobie z tym poprzez obsługę komunikatu WM_SIZE i odpowiadasz, wywołując GetClientRect w oknie nadrzędnym i MoveWindow na elementach potomnych, aby przenieść/zmienić rozmiar dzieci, aby odpowiednio wypełnić rodzica.

Jeśli chcesz wystarczająco mocno, możesz (oczywiście) zaimplementować menedżera układu, więc reszta programu nie musi obsługiwać takich rzeczy bezpośrednio. Przynajmniej IME, robienie tego dobrze jest wystarczająco trudne, że rzadko jest warte zachodu, chyba że można dużo użyć tego kodu układu.

+0

Myślę, że miałeś na myśli WM_SIZE w pierwszym zdaniu. –

+0

@AdrianMcCarthy: Ups, całkiem w porządku. Dziękuję Ci. Naprawiony. –

2

Spróbuj wybrać sterowanie i grę z jego właściwością "Dok". Dzięki temu możesz przypiąć kontrolę do niektórych stron, a nawet wszystkich stron kontroli rodzica.

+3

Nie ma "dołączyć" cechą czystego win32, ale okazało się to [wątku] (http://stackoverflow.com/questions/7058564/dock-window-in -win32-c), które zasadniczo odpowiadają na moje pytanie, więc dzięki za słowo kluczowe "Dock" :) – Robertas

+0

Ok, przepraszam, ale cieszę się, że nadal pomógł. – Katu

9

Podczas pracy ręcznej uważam, że pomocne jest współdziałanie w stosunku do okna nadrzędnego każdego z kontrolek.

Korzystam z poniższej funkcji, aby zwrócić bieżącą pozycję kontrolki względem jej obiektu nadrzędnego, aby można było ją łatwo przesuwać/zmieniać za pomocą narzędzia SetWindowPos().

void GetRelativeCtrlRect(HWND hWnd, RECT *rc) { 
    // Get the position of the window relative to the entire screen 
    GetWindowRect(hWnd, rc); 

    // Now convert those with regards to the control's parent 
    ScreenToClient(GetParent(hWnd), (LPPOINT) &((LPPOINT)rc)[0]); 
    ScreenToClient(GetParent(hWnd), (LPPOINT) &((LPPOINT)rc)[1]); 
} 

ta zwraca wielkości RECTwzględną do nadrzędnego okna/kontroli. Na przykład, jeśli chcesz zmienić rozmiar kontrolki podrzędnej na "blisko" dolnej krawędzi obiektu nadrzędnego, po prostu zrzuć kilka pikseli z rc.bottom przed wywołaniem SetWindowPos (childHWND, ...)

Też mam niektóre "kotwiące" funkcje, które pomagają kontrolować położenie w stosunku do innych punktów odniesienia. Jest to jednak proces ręcznego kodowania w czasie, ale daje doskonałe, ręcznie modyfikowane wyniki.

Kilka innych opcji, które dodałem do zakładek, wszystkie najprawdopodobniej będą wymagać dostosowania do Twoich potrzeb, ale daje ci to pomysł na niektóre narzędzia, które inni stworzyli, aby rozwiązać ten problem.

Powiązane problemy