|
Вопрос # 1 858/ вопрос открыт / |
|
Здравствуйте, эксперты!
Как сделать чтобы форма перемещалась только в заданной области относительно рабочего окна или относительно mainform
 |
Вопрос задал: seryoga (статус: 1-ый класс)
Вопрос отправлен: 28 августа 2008, 11:44
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, seryoga!
Вообще то такое поведение считается плохим решением. Но сделать можно. в private часть обявления формы добавляем такое
private
procedure MyMove(var msg:TMessage); message WM_MOVE);
потом жмём Ctrl+Shift+C
Появиться обработчик этого события. Оно будет вызываться всегда, как только пользователь попытается передвинуть форму. В самом обработчике анализируем свойства Left, top, width, height и принимаем решение. Если фома выходит за границы - просто двигаем назад, присвоив нужное значение свойствам.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 28 августа 2008, 13:08
|
Ответ #2. Отвечает эксперт: Feniks
Здравствуйте, seryoga!
Все очень просто. Для этого надо ловить и обрабатывать сообщение WM_MOVING от Windows, которое посылается при перемещении формы.
Сначало в блоке Type добовляете запись:
TWmMoving = record
Msg: Cardinal;
fwSide: Cardinal;
lpRect: PRect;
Result: Integer;
end;
Потом в блок private вашей формы добавляете объявление обработчика этого сообщения:
procedure WMMoving(var msg: TWMMoving); message WM_MOVING;
И уже в самом implementation пишем сам обработчик:
procedure TForm1.WMMoving(var msg: TWMMoving);
var
BlockRect: TRect;
begin
BlockRect.Left := 100;
BlockRect.Top := 100;
BlockRect.Right := 600;
BlockRect.Bottom := 600;
// BlockRect := Screen.WorkareaRect;
// compare the new form bounds in msg.lpRect^ with r and modify it if
// necessary
if msg.lprect^.left < BlockRect.left then
OffsetRect(msg.lprect^, BlockRect.left - msg.lprect^.left, 0);
if msg.lprect^.top < BlockRect.top then
OffsetRect(msg.lprect^, 0, BlockRect.top - msg.lprect^.top);
if msg.lprect^.right > BlockRect.right then
OffsetRect(msg.lprect^, BlockRect.right - msg.lprect^.right, 0);
if msg.lprect^.bottom > BlockRect.bottom then
OffsetRect(msg.lprect^, 0, BlockRect.bottom - msg.lprect^.bottom);
inherited;
end;
Имя переменной BlockRect типа записи как раз и отвечает за координаты допустимой зоны для перемещения формы.
P.S. Желаю удачи.
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 28 августа 2008, 13:16
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 28 августа 2008, 13:39; участников в обсуждении: 1.
|
Feniks (статус: Бакалавр), 28 августа 2008, 13:39 [#1]:
А для того, что вообще заблокировать перемещение формы, используйте сдежующий код:
type
TyourForm = class(TForm)
private
{ Private declarations }
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
end;
procedure TyourForm.WMNCHitTest(var Message: TWMNCHitTest);
begin
inherited;
with Message do
if Result = HTCAPTION then
Result := HTNOWHERE;
end;
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|