zmiana rozmiarów (resize) formy ale w którą stronę?

0

Witam.
No właśnie. Zdarzenie oncanresize informuje o nowych szerokości i wysokości komponentu, formy. W zalezności od tej informacji podejmujemy w programie decyzję czy zezwolić na taką zmianę lub tez w jakim zakresie zezwolić. Czasem może się zdarzyć, że do tego potrzebne jest by wiedzieć w którą strone następuje zmiana, w szczególności czy top i left okienka się zmieniają czy nie? (jesli łapiemy myszką za lewy górny róg to się zmieniają jesli za prawy dolny to nie) Skąd zatem uzyskać informacje bardziej szczegółowe na temat zmian typu resize? Ot choćby te czy top i left się zmeiniają?

0

jak okno zmniejszasz to zmianie ulega Width i Height. Jak przesuwasz to zmienia się left i top. Przesuwanie formy nie jest zmianą rozmiaru dlatego Left, Top ignorujemy. Resize tyczy się tylko i wyłącznie prawej i dolnej krawędzi.

0

osobiscie radzil bym przechwycic komunikat WM_SIZING i WM_MOVING...
bedziesz mial wieksze pole manewru.
dodatkowo:
gdy w systemie jest wylaczona opcja "Pokazuj zawartosc okna podczas przeciagania", to w trakcie zmiany rozmiaru czy pozycji jest wyswietlana tylko ramka, w tym czasie program nie wykonuje zadnej czynnosci i uzywajac OnCanResize nie masz nad ramka zadnej kontroli. a jak sobie zalozysz hooka, to bedziesz mogl ja bez problemu kontrolowac:) ....

pozdrawiam

0

Heh, chciałbym byś miał rację ale neistety mylisz sie niemal we wszytskim co napisałeś.

Oleksy_Adam napisał(a)

jak okno zmniejszasz to zmianie ulega Width i Height.

Nie prawda. By się o tym przekonać wystarczy złapać za lewy górny róg i przeciągać , wówczas zmienia się zarówno width i height jak i top left. Niestety o ile w zdarzeniu oncanresize mamy możliwość ustalenia width i height to wartości top i left nie możemy ustalić.

Oleksy_Adam napisał(a)

Przesuwanie formy nie jest zmianą rozmiaru dlatego Left, Top ignorujemy.

Nie. Przesuwanie okna jest zmianą rozmiaru w rozumieniu zdarzeń Twincontrol(więc i formy). Zdarzenie oncanresize jest wywoływane przy przesuwaniu bez zmian rozmiaru.

Oleksy_Adam napisał(a)

Resize tyczy się tylko i wyłącznie prawej i dolnej krawędzi.

No włsnie nie prawda. Jesli to co robimy z prawym dolnym rogiem myszką zmieniając sam rozmiar okna zrobimy z lewym górnym rogiem uzyskamy zmianę top, left oraz width i height o czym już wspomniałem wczesniej.

A zatem moje pytanie brzmi: Jak kontrolować left i top analogicznie do kontroli width i height w zdarzeniu oncanresize?

Cimak => dzięki, spróbuję:)

0

trzymaj, powinno sie przydac ;]

  public
    { Public declarations }
    procedure Moving(var Message: TMessage); message WM_MOVING;
    procedure Sizing(var Message: TMessage); message WM_SIZING;
    procedure Changing(var Message: TMessage); message WM_ENTERSIZEMOVE;
  end;

[...]

procedure TForm1.Moving(var Message:TMessage);
var PR:PRect;
begin
PR := Pointer(Message.LParam);
{...}
{PR to po prostu Rect, wiec jesli przypiszesz jakies zmiany, np PR.Left:=0; to przy przesuwaniu formy zawsze forma bedzie miala left=0}
end;

procedure TForm1.Sizing(var Message:TMessage);
var PR:PRect;
begin
PR := Pointer(Message.LParam);

case Message.WParam of
        WMSZ_TOP:
        WMSZ_BOTTOM:
        WMSZ_LEFT:
        WMSZ_RIGHT:
        WMSZ_BOTTOMLEFT:  
        WMSZ_BOTTOMRIGHT:      
        WMSZ_TOPLEFT: 
        WMSZ_TOPRIGHT: 
end; //Case
end;

procedure TForm1.Changing(var Message: TMessage);
begin
{ta procedura zostanie wywolana jednorazowo, jeszcze zanim cokolwiek sie zmieni.
np przy kliknieciu na belke tytulowa.
niestety chyba nie ma mozliwosci wykrycia, czy rozpoczeto przesuwanie czy zmiana rozmiaru}
end;
0

Wielkie dzięki Cimak. To jest to o co mi chodziło [browar]

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