Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Изменение размера формы мышкой [D7, WinXP]


Страницы:   1 2 3

Дмитрий_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 - изменение вертикального размера окна сверху, как если бы пользователь навел указатель мыши на верхнюю границу рамки окна и изменял размеры.

Работу по определению "волшебных" констант оставлю на Вас. Должен же быть простор для творчества. :)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо