Skocz do zawartości

Zmiana rozmiaru okna


Nemo

Recommended Posts

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 9_9

Link do komentarza
Udostępnij na innych stronach

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.

Link do komentarza
Udostępnij na innych stronach

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;
Link do komentarza
Udostępnij na innych stronach

Dzieki.
Delphi znam więc spoko.
Ja słabo znam angielski a raczej wcale go nei znam 9_9 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 ;)

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...