[Delphi] Problem z przyklejaniem formy

0

Mam formę, która w onCreate ma:

Constraints.MinHeight := 400;
Constraints.MinWidth  := 600;

Czyli blokuję w ten sposób możliwość zmiany rozmiaru okna poniżej ustawionych tutaj wysokości i szerokości. Chciałem dodać do tego okna możliwość "przyklejania" do krawędzi ekranu, znalazłem temat w FAQ i dodałem:

procedure WndPosChanging(var Msg : TWMWINDOWPOSCHANGING); message WM_WINDOWPOSCHANGING;


procedure TForm1.WndPosChanging(var Msg: TWMWINDOWPOSCHANGING);
begin
  if Msg.WindowPos.x < (Screen.WorkAreaLeft + 15) then
    Msg.WindowPos.X := Screen.WorkAreaLeft;

  if Msg.WindowPos.y < (Screen.WorkAreaTop + 15) then
    Msg.WindowPos.Y := Screen.WorkAreaTop;

  if Msg.WindowPos.y > (Screen.WorkAreaHeight - Height - 15) then
    Msg.WindowPos.y := Screen.WorkAreaHeight - Height;

  if Msg.WindowPos.x > (Screen.WorkAreaWidth - Width - 15) then
    Msg.WindowPos.x := Screen.WorkAreaWidth - Width;
end;

Stało się jednak coś, czego nie spodziewałem się. Okno przykleja się pięknie ale nie działa blokada rozmiaru ustawiona powyżej.

Ktoś ma jakiś pomysł jak to rozwiązać ???

0

Witam,
wygląda na to że gdy obsługujesz komunikat WM_WINDOWPOSCHANGING nie sa obsługiwane Constraints.
Musisz sobie w tej funkcji dopisać obsługe ograniczeń ręcznie.
Msg.WindowPos.cx
Msg.WindowPos.cy
to nowa szerokośc i wysokość okna.
Taka funkcja powinna działać tak jak potrzebujesz:

procedure TForm1.WndPosChanging(var Msg: TWMWINDOWPOSCHANGING);
begin
  if Msg.WindowPos.x < (Screen.WorkAreaLeft + 15) then
    Msg.WindowPos.X := Screen.WorkAreaLeft;

  if Msg.WindowPos.y < (Screen.WorkAreaTop + 15) then
    Msg.WindowPos.Y := Screen.WorkAreaTop;

  if Msg.WindowPos.y > (Screen.WorkAreaHeight - Height - 15) then
    Msg.WindowPos.y := Screen.WorkAreaHeight - Height;

  if Msg.WindowPos.x > (Screen.WorkAreaWidth - Width - 15) then
    Msg.WindowPos.x := Screen.WorkAreaWidth - Width;

  if Msg.WindowPos.cx < Constraints.MinWidth then
    Msg.WindowPos.cx := Constraints.MinWidth+1;

  if Msg.WindowPos.cy < Constraints.MinHeight then
    Msg.WindowPos.cy := Constraints.MinHeight+1;

end;

Oczywiście obsługe ograniczenia wielkości okna od góry musisz sobie analogicznie dopisać ;)
Pozdrawiam

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