![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменение размера формы мышкой [D7, WinXP]
Дмитрий_05 © (2005-06-07 20:03:00)Как измененять размеры формы мышкой, когда у формы нет бордюра?
Дмитрий_05 (2005-06-08 17:19:00) [41]Спасибо огромное!
-=XP=- (2005-06-08 17:17:00) [42]Form.Constraints.MinHeight := 100;
Form.Constraints.MinWidth := 100;
Дмитрий_05 (2005-06-08 17:14:00) [43]Abessalom Спасибо! Работает! А как сделать чтобы окно было с минимальной высотой и шириной? т.е. чтобы меньше этих значений уже не делалось окно...
Юрий Зотов (2005-06-08 00:43:00) [44]> Дмитрий_05 (07.06.05 22:25) [7]
Повторить ответ? Хорошо, повторяю - обрабатывайте WM_NCHITTEST. Будут Вам и стрелочки, и вообще полное счастье будет.
Abessalom (2005-06-07 23:08:00) [45]
> if Result = HTCLIENT then
> Result := HTCAPTION
Ну это, если честно, лишнее;) Осталось из оригинала
Abessalom (2005-06-07 22:52:00) [46]constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
BorderStyle := bsNone;
BorderWidth := 2;
end;
procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
var
P: TPoint;
R: TRect;
B: Integer;
begin
inherited;
with Message do
if Result = HTCLIENT then
Result := HTCAPTION
else begin
P := Point(XPos, YPos);
R := BoundsRect;
if PtInRect(R, P) then begin
B := BorderWidth;
InflateRect(R, -B, -B);
if not PtInRect(R, P) then begin
if P.X < R.Left then
Result := HTLEFT
else if P.X > R.Right then
Result := HTRIGHT;
if P.Y < R.Top then
if Result = HTLEFT then
Result := HTTOPLEFT
else if Result = HTRIGHT then
Result := HTTOPRIGHT
else
Result := HTTOP
else if P.Y > R.Bottom then
if Result = HTLEFT then
Result := HTBOTTOMLEFT
else if Result = HTRIGHT then
Result := HTBOTTOMRIGHT
else
Result := HTBOTTOM;
end;
end;
end;
end;
Дмитрий_05 (2005-06-07 22:25:00) [47]Мне это понятно... вот как сделать саму ту облать, при наведении на которую будет изменяться размер, а еще курсор мышки будет меняться на две стрелочки побокам...
Юрий Зотов (2005-06-07 21:26:00) [48]Все же я бы не рекомендовал пользоваться недокументированными способами. Тем более, когда есть нормальный. И когда этот нормальный способ ничуть не сложнее. Скорее, даже проще.
:о)
-=XP=- (2005-06-07 21:23:00) [49]Подбирать недокументриванные констаньы в диапазоне 0..65535
Они там рядом - в диапазоне от $f000 до $f02f, если мне не изменяет память. Давно это было. А Дмитрий пусть старается - рутина тоже полезна иногда. ;)
Или эти границы лучше еще как-то задавать?
Практически все события, связанные с указателем мыши, сопровождаются координатами X и Y.
const
BorderWidth = 5; // Это "мнимая" ширина Вашей границы
(X < BorderWidth) - Левая граница
(X > Form.Width - BorderWidth) - Правая граница
(Y > BorderWidth) - Верхняя граница
(Y < Form.Height - BorderWidth) - Нижняя граница
До углов, надеюсь, сами додумаетесь?
Юрий Зотов (2005-06-07 20:54:00) [50]Подбирать недокументриванные констаньы в диапазоне 0..65535, конечно, можно, но есть опасение что это занятие займет некоторую часть жизни.
К счастью, есть и документированный способ - обрабатывать WM_NCHITEST и возвращать нужные значения. Детали см. в справке по WM_NCHITEST.
Дмитрий_05 (2005-06-07 20:35:00) [51]а изменение по горизонтали какая константа??? А еще вот что, если сделать так: по краям положить Image, и при клике и перемещении курсора по нему изменять размер окна. Или эти границы лучше еще как-то задавать?
-=XP=- (2005-06-07 20:20:00) [52]Hint:
SendMessage(Form.Handle, WM_SYSCOMMAND, $f00e, 0);
читать как
SendMessage(Form.Handle, WM_SYSCOMMAND, <Const>, 0);
-=XP=- (2005-06-07 20:19:00) [53]Рамка окна для того и предназначена, чтобы можно было изменять размер окна.
Если же хотите отказаться от рамки, обрабатывайте сообщение MouseDown, определяйте, в какой области окна было произведено нажатие, и, в зависимости от этого - выполняйте код:
ReleaseCapture;
SendMessage(Form.Handle, WM_SYSCOMMAND, $f00e, 0);
где <Const> - константа, определяющая способ перемещения/изменения размеров окна, например,
$0f12 - перемещение всего окна, как если бы пользователь перетаскивал окно за заголовок.
$f00e - изменение вертикального размера окна сверху, как если бы пользователь навел указатель мыши на верхнюю границу рамки окна и изменял размеры.
Работу по определению "волшебных" констант оставлю на Вас. Должен же быть простор для творчества. :)