2008-09-24 26 views
12

Piszę program, który ma dwa panele (przez CSplitter), jednak mam problemy z wymyślaniem, aby zmienić rozmiar kontrolek w każdej klatce. Dla uproszczenia, czy ktoś może mi powiedzieć, jak zrobiłbym to dla podstawowej ramki z pojedynczym sterowaniem CEdit?Zmiana rozmiaru kontrolek w MFC

jestem dość pewny, że jest to zrobić za pomocą funkcji CEdit::OnSize() ... Ale nie jestem nigdzie ...

Dzięki! :)

+0

Dzięki za odpowiedzi, ale może ktoś dokładniej na przykładzie? Dzięki – Konrad

+0

Jakiej wersji Visual Studio używasz? – Rob

Odpowiedz

8

Kiedy twoja ramka otrzyma komunikat OnSize, dostaniesz nową szerokość i wysokość - możesz po prostu wywołać metodę CEdit SetWindowPos, przekazując te wartości.

Załóżmy CMyPane to okienko splitter i zawiera on utworzony w onCreate cedit nazywa m_wndEdit:

void CMyPane::OnSize(UINT nType, int cx, int cy) 
{ 
    m_wndEdit.SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); 
} 
3

SetWindowPos jest trochę heavy duty do tego celu. MoveWindow ma właśnie to, co jest potrzebne.

5

GetDlgItem (IDC_your_slidebar) -> SetWindowPos (...) // rzeczywiście można przenieść, rozmiaru itp ...

10

Okno odbiera WM_SIZE wiadomość (który jest przetwarzany przez przewodnika OnSize w MFC) bezpośrednio po nim został zmieniony, więc CEdit :: OnSize nie jest tym, czego szukasz.

Powinieneś dodać moduł obsługi rozmiaru w klasie ramki i wewnątrz tego uchwytu, ponieważ Rob pointed out otrzymasz szerokość i wysokość obszaru roboczego ramki, następnie powinieneś dodać kod, który dostosowuje rozmiar i położenie twojego elementu sterującego.

coś takiego

void MyFrame::OnSize(UINT nType, int w, int h) 
{ 
    // w and h parameters are new width and height of your frame 
    // suppose you have member veriable CEdit myEdit which you need to resize/more 
    myEdit.MoveWindow(w/5, h/5, w/2, h/2); 
} 
1

inni zwrócili uwagę, że WM_SIZE jest komunikat powinien obsługiwać i rozmiaru formantów podrzędnych w tym punkcie. WM_SIZE jest wysyłane po zakończeniu zmiany rozmiaru.

Możesz również chcieć obsłużyć wiadomość WM_SIZING, która zostanie wysłana podczas zmiany rozmiaru. Umożliwi to aktywną zmianę rozmiaru okien podrzędnych, gdy użytkownik wciąż przeciąga mysz. Nie jest to konieczne do obsługi WM_SIZING, ale może zapewnić lepsze wrażenia użytkownika.

1

Używam klasy CResize z CodeGuru, aby automatycznie zmienić rozmiar wszystkich elementów sterujących. Mówisz, jak chcesz, aby każda z formantów była zmieniana i wykonuje to zadanie za Ciebie.

Paradygmat zmiany rozmiaru ma określać, ile będzie się przesuwać po zmianie rozmiaru okna dialogowego.

SetResize(IDC_EDIT1, 0, 0, 0.5, 1); 
SetResize(IDC_EDIT2, 0.5, 0, 1, 1); 

Bardzo przydatny, gdy masz dużą liczbę okien dialogowych.

Source code