Nemo Napisano Lipiec 15, 2018 Autor Zgłoś Udostępnij Napisano Lipiec 15, 2018 Chciałbym aby okno podczas zmiany rozmiarów przez użytkownika nie miało mniejszych wymiarów niż MINCX i MINCY. Więc robie tak: case WM_SIZE: if(LOWORD(lParam)<MINCX) MoveWindow(hWnd, x, y, MINCX, height, TRUE); if(HIWORD(lParam)<MINCY) MoveWindow(hWnd, x, y, width, MINCY, TRUE); return 0; Ale to wszystko miga - jak można zapobiedz temu miganiu? ps znalazłem jeszcze coś takiego jak WM_SIZING ale to też za wiele mi nie pomogło Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Omega Napisano Lipiec 15, 2018 Zgłoś Udostępnij Napisano Lipiec 15, 2018 Musisz odebrać komunikat WM_SIZING, który odpowiada za zmianę rozmiaru, która z koleii odbywa się aktualnie. I tak jeśli rozmiar przekroczy, lub bedzie rowny rozmiarowi, który jest minimalny dla tej chwili to wstaw do jakiejś zmiennej globalnej że został przekroczony limit. I tak obsługuj tez komunikat WM_NCHITTEST, który w sobie musi zwracać do procedury wartość z funkcji DefWindowProc. Po wykonaniu tej funkcji sprawdzasz czy zmienna globalna nie akceptuje dalszego zmniejeszenia ramki. Jeśli nie to sprawdzasz dalej czy result ze wspomnianej funkcji dla procedury obsługi okna wynosi HTRIGHT , HTLEFT, HTTOP, HTTOPLEFT i HTTOPRIGHT. Jeśli tak to zwróć wartośćw result zero. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Nemo Napisano Lipiec 15, 2018 Autor Zgłoś Udostępnij Napisano Lipiec 15, 2018 Sory. przeczytalem kilka razy to co napisałes zrobiłem coś i nic się nbie dzieje. Prawdopodobnie źle to zrobiłem więc byłbym wdzięczny za gotowy kod. Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Omega Napisano Lipiec 16, 2018 Zgłoś Udostępnij Napisano Lipiec 16, 2018 Zrobiłem cholerny błąd wpisując do tego obsługę WM_NCHITTEST. Stary, wystarczy odpowiednia obsługa WM_SIZING. Przyznam szczerze że dopiero teraz się tego nauczyłem. Chodzi o to że LParam'etr tego komunikatu przetszymuje wskaźnik do struktury RECT. I wystarczy sprawdzić czy dolna krawędź (rect.bottom) i prawa (rect.right) jest mniejsza lub równa od minimalnej długości limitowanej przez ciebie. Jeśli tak, to musisz przypisać rect.bottom, lub rect.right limitowaną wielkość. Mogę dać przykład tylko w delphi, bo praktycznie tylko w nim programuje (w porywach tez w asemblerze): if msg=WM_SIZING then begin R:=POINTER(LParam); //zmienna R to PRect, czyli zwykły rect, ale jako wskaźnik If R^.bottom<=MinCY then R^.bottom:=MinCY; If R^.Right<=MinCX then R^.right:=MinCX; Result:=1; //w tym komunikacie należy zawsze zwrócić wartość true dla procedury okna end; Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Nemo Napisano Lipiec 16, 2018 Autor Zgłoś Udostępnij Napisano Lipiec 16, 2018 Dzieki. Delphi znam więc spoko. Ja słabo znam angielski a raczej wcale go nei znam i nie zawsze wszystko rozumie co jest w helpie. Z tego WM_SIZING doszlem tylko do tego RECT i ze trzeba zwrocicc TRUE - tylko nie wiedzialem ze trzeba nadpsiac RECT :> Wiec jeszcze raz wielke dzieki ;) Cytuj Link do komentarza Udostępnij na innych stronach More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.