Zmiana rozmiaru formy tylko dla określonych wartości

0

Elo.

Mam taką zagwozdkę. Mam formę której szerokość użytkownik może sobie zmieniać, ale tylko dla określonych wartości i w pewien "dziarski" sposób. Już tłumaczę. Jak wiadomo gdy zmieniamy rozmiar okna najpierw rysuje nam się sama ramka zgodnie z pozycją kursora. Dopiero jak zwolnimy przycisk myszy, forma "fizycznie" zmieni rozmiar (o ile mamy w systemie wyłączone "pokazuj zawartość okien podczas przeciągania" czy jakoś tak, ale nie ważne. Chciałbym kontrolować zmianę rozmiaru okna już na poziomie rysowania tej ramki, czyli np. aby można było zmieniać rozmiar tylko co 40 pixeli (z pewnym marginesem aby użytkownik nie musiał dokładnie celować). Symulacja:

Forma ma Width powiedzmy 100. "Skok" rozmiaru co 40 pixeli:
Następuje zmiana rozmiaru (rysowanie ramki): 110 px (ramka zostaje na 100); 117px (ramka zostaje na 100); 130px (ramka zostaje na 100); 140 px (zgadza się, ramka wskakuje na 140 px); 156px (ramka pozostaje na 140)..... 180px (zgadza się, ramka wskakuje na 180); następuje "puszczenie" przycisku myszy, forma zmienia rozmiar na 180. Chyba wiadomo o co chodzi. Ale ja nie wiem jak to uzyskać. Tzn, moge przez OnCanResize, ale jak wiadomo, to jest wywołane dopiero w momencie zwolnienia przycisku myszy, czyli za późno. Szukając na forum, znalazłem coś takiego:

procedure Sizing(var Message: TMessage); message WM_SIZING;

To jest to czego potrzebuję, na bieżąco dostaję informację o szerokości rysowania ramki. Ale co dalej? Przydałby się jakiś prosty i szybki algorytm. Jest wieczór, cały dzień pracowałem przed komputerem i chyba stos mi się przepełnił, bo nie mogę wymyśleć nic sensownego :). Nie wiem właściwie czego szukam, nowy width powinien być chyba podzielny przez wartość "skoku":

procedure TMainForm.Sizing(var Message: TMessage);
 var
  PR:PRect;
  aNewWidth: Integer;
 const
  SKOK = 40;
begin
  PR := Pointer(Message.LParam);
  //bo w PRect są wartości względem rozmiarów ekranu
  aNewWidth := Pr.Right-Pr.Left;

  //co tutaj?
  if (....)<>(...) then
    Abort;
end;

Nie wiem co więcej napisać :) . W ogóle nie wiem czy PRect jest potrzebny, może w którymś z przychodzących parametrów Message jest aktualna szerokość ramki, jeszcze nie sprawdzałem. Co jak szerokość jest niewłaściwa? Abort? Czy jakieś Result muszę zwrócić w Message? To wszystko to ogólnie taki bajer, ale dla samej istoty programowania, jestem ciekaw jak to rozwiązać :)
Pozdrawiam wszystkich i każdego z osobna.

0

Jeżeli <ort>kożystasz </ort>z VCL to spróbuj w zdarzeniu OnCanResize i tam masz NewWidth i NewHeight, jeżeli WinApi to nie pamiętam ale spróbuj w WM_SIZING

0

Yyyy, chyba ktoś nie czytał mojego posta w całości ;)

0

Sorry , byłem trochę zmęczony ;-P i późno było i <ort><ort><ort>w ogóle </ort></ort></ort>:-D

procedure TMainForm.WMSizing(var Message: TMessage);
var
 lprc: PRect;
 NewRight,NewBottom: Integer;
begin
  NewRight:=(Mouse.CursorPos.X div 40)*40;
  NewBottom:=(Mouse.CursorPos.y div 40)*40;
  lprc := PRect(Message.LParam);
  lprc^.Right := NewRight;
  lprc^.Bottom := NewBottom;
end:

</ort>
0

I o to chodziło! Dzieki [browar]

0

Jeszcze pytanie za 100 punktów: Jak PRect zmapować aby użytkownik zmieniał wielkość ClientRect, czyli ciała formy a nie włącznie z obramowaniem?

Szukałem coś po googlach i znalazłem coś takiego z WMGetMinMaxInfo ale nie wiem czy to mi się przyda:
http://groups.google.pl/group/borland.public.delphi.vcl.components.using/browse_thread/thread/802c8fafccf7e551/385eea4013d6476d?hl=pl&lnk=st&q=delphi+WM_SIZING+clientrect#385eea4013d6476d

1 użytkowników online, w tym zalogowanych: 0, gości: 1