Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.81.58] |
|
Сообщ.
#1
,
|
|
|
Хочу сделать так, чтобы при изменении размера окна размер менялся по диагонали.
Т.е. увеличил ширину на 50 пикселей, на 50 увеличилась и высота. Уменьшили высоту на 10, ширина тоже уменьшилась на 10. Пишу так: procedure TForm1.FormCreate(Sender: TObject); begin HeightMinusWidth := Height-Width; end; procedure TForm1.FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean); var dX, dY: Integer; begin // ListBox1.Items.Add(IntToStr(NewWidth) + ' ' + IntToStr(NewHeight)); dX := NewWidth-Width; dY := NewHeight-Height; if (dX = 0) and (dY <> 0) then NewWidth := NewHeight-HeightMinusWidth; NewHeight := NewWidth+HeightMinusWidth; end; Так вот, если я меняю ширину - всё ок, пока я тяну. Как только отпускаю мышь, размер возвращается на прежний уровень. Потому что с какой-то радости OnCanResize вызывается ещё раз с NewHeight = старому (первоначальному) значению. Смотрю в ListBox1 (если раскомментировать эту строку): 368 549 - исходные значения 369 549 - тяну 369 550 - после моей обработки . . . 396 577 397 549 - тяну (почему тут старый Height, а не 577 ???) 397 578 - после моей обработки отпускаю мышь: 397 549 - высота не изменилась, изменилась только ширина, в итоге мой код сужает окно 368 549 - результат Если я тяну вверх-вниз, там вообще окно мерцать начинает... Что за ерудна?! Как сделать рабочий код? |
Сообщ.
#2
,
|
|
|
Вот такой код работает:
procedure TForm1.FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean); var dX, dY: Integer; begin // ListBox1.Items.Add(IntToStr(Width) + ', ' + IntToStr(Height) + ' / ' + IntToStr(NewWidth) + ', ' + IntToStr(NewHeight) + ' : ' + BoolToStr(Resize, True)); dX := NewWidth-Width; dY := NewHeight-Height; if (dX = 0) or (dY = 0) then Resize := False else begin NewWidth := Min(NewWidth, NewHeight-HeightMinusWidth); NewHeight := NewWidth+HeightMinusWidth; end end; Но он позволяет менять размер только через "уголок", но не через боковые грани. Добавлено А хочется сделать с боковыми гранями тоже... |
Сообщ.
#3
,
|
|
|
Можно использовать сообщение WM_SIZING
type TForm1 = class(TForm) ... protected procedure WMSizing(Msg:TMessage); message WM_SIZING; ... end; procedure TForm1.WMSizing(Msg:TMessage); begin case Msg.WParam of WMSZ_RIGHT: with pRect(Msg.LParam)^ do Bottom := Top + (Right - Left) + HeightMinusWidth; WMSZ_BOTTOM: with pRect(Msg.LParam)^ do Right := Left + (Bottom - Top) - HeightMinusWidth; ... //остальные варианты end; inherited; end; |
Сообщ.
#4
,
|
|
|
leo, да, спасибо.
Прикол в том, что я пробовал WM_SIZING, но не в Delphi, а в Lazarus. Там он почему-то не работает, т.е. WM_SIZING не вызывается вообще (и я подумал, что и в Delphi будет то же самое, но сейчас попробовал – работает). Я не понимаю почему, но факт такой. Не знаешь, почему такое может быть? Добавлено Кстати, тут прикол ещё в том, что если какая-то внешняя программа изменит размер окна (либо я нажму Win+Left, Win+Right, разверну окно на весь экран), то WM_SIZING не сработает. Ну MAXIMIZE ещё можно отловить через WM_SYSCOMMAND, но остальное уже геморнее. С этой точки зрения, конечно, CanResize (он же WM_WINDOWPOSCHANGING выгоднее), но тут возникает описанная выше проблема... |