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

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

Изменение размеров формы на определенную величину [D7, WinXP]


Страницы:   1 2

kutuzov47 ©   (2006-12-12 16:23:00) 

Т.е. размер формы может меняться только, допустим, на 30 по высоте и на 20 по ширине. Как это реализовать? Заранее спасибо


DVM   (2006-12-13 11:14:00) [1]


> novill ©   (13.12.06 11:01) [24]

А, понятно. Вот погляди, код, когда то я делал панель задач, там почти то же что тебе надо.

function OnSizing(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
 prc: PRect;
 rcBorder: TRect;
 nWidthNew, nHeightNew: integer;
begin
 bStartSizingMoving:=true;
 prc := PRect(lParam);
 rcBorder := Rect(0, 0, TaskBarSettings.szMinDockSize.cx, TaskBarSettings.szMinDockSize.cy);

 if TaskBarSettings.szSizeInc.cx <> 0 then
   begin
     nWidthNew  := ((prc^.Right - prc^.Left) - (rcBorder.Right - rcBorder.Left)
       + TaskBarSettings.szSizeInc.cx div 2) div TaskBarSettings.szSizeInc.cx
         * TaskBarSettings.szSizeInc.cx;

     if (nWidthNew < 2*TaskBarSettings.szSizeInc.cx) and (nWidthNew > (rcBorder.Right - rcBorder.Left)) then
        nWidthNew:=34;

     if (nWidthNew < TaskBarSettings.szSizeInc.cx) then
        nWidthNew:=nWidthNew + (rcBorder.Right - rcBorder.Left);
   end
 else
   nWidthNew  := prc^.Right - prc^.Left;

 if TaskBarSettings.szSizeInc.cy <> 0 then
   begin
   
     nHeightNew := ((prc^.Bottom - prc^.Top) - (rcBorder.Bottom - rcBorder.Top)
       + TaskBarSettings.szSizeInc.cy div 2) div TaskBarSettings.szSizeInc.cy
         * TaskBarSettings.szSizeInc.cy + 4;

     if (nHeightNew < 2*TaskBarSettings.szSizeInc.cy) and (nHeightNew > (rcBorder.Bottom - rcBorder.Top))
     then nHeightNew:=34;

     if (nHeightNew < TaskBarSettings.szSizeInc.cy) then
        nHeightNew:=nHeightNew + (rcBorder.Bottom - rcBorder.Top) - 4;
   end
 else
   nHeightNew := prc^.Bottom - prc^.Top;
 case wParam of
   WMSZ_LEFT: prc^.Left := prc^.Right - nWidthNew;
   WMSZ_TOP: prc^.Top := prc^.Bottom - nHeightNew;
   WMSZ_RIGHT: prc^.Right := prc^.Left + nWidthNew;
   WMSZ_BOTTOM: prc^.Bottom := prc^.Top + nHeightNew;
 end;

 Result:=0;
end;

Т.е. Меняем значения в prc^. и получаем нужный эффект.

То же для WM_MOVING у меня было так:


function OnMoving(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
 prc            : PRect;
 pt             : TSmallPoint;
 tbEdgeProposed : TTaskBarEdge;
 w, h           : Integer;
begin
 bStartSizingMoving:=true;
 prc := PRect(lParam);
 pt := GetMessagePosition;
 tbEdgeProposed := CalcProposedState(pt);
 if ((EdgeProposedPrev <> tbeFloat) and (tbEdgeProposed = tbeFloat)) then
   begin
     prc^ := TaskBarSettings.rcFloat;
     w := prc^.Right - prc^.Left;
     h := prc^.Bottom - prc^.Top;
     with prc^ do
       begin
         Left   := pt.X - w div 2;
         Top    := pt.Y ;
         Right  := pt.X + w div 2;
         Bottom := pt.Y + h;
       end;
   end;
 EdgeProposedPrev := tbEdgeProposed;
 GetRect(tbEdgeProposed, prc^);
 OnTaskBarStateChange(true, tbEdgeProposed);

 Result := 0;
end;


novill   (2006-12-13 11:01:00) [2]

> [23] DVM ©   (13.12.06 10:50)


Вот что я имею в виду: после того как пользователь "схватил" форму за угол, чтобы изменить размер или за заголовок, чтобы преместить, появляется тонкая прямоугольная рамка, которая двигается/изменяет размеры следуя движениям мыши. А форма изменяется только, когда левую кнопку мыши отпускают.

Некоторые программы могут уже в процессе "таскания" ограничивать положение/размеры только набором заданных значений.


DVM   (2006-12-13 10:50:00) [3]


> Ты случайно не помнишь как перехватить отрисовку прямоугольника
> что при движении и изменении размеров?

В смысле перехватить?


novill   (2006-12-13 10:43:00) [4]

> [21] DVM ©   (13.12.06 10:22)

верно. он правда в ту степь все равно не полезет.

Ты случайно не помнишь как перехватить отрисовку прямоугольника что при движении и изменении размеров?


DVM   (2006-12-13 10:22:00) [5]


> novill ©   (12.12.06 17:11) [6]
> > [5] kutuzov47 ©   (12.12.06 17:06)
>
> какой стеснительный :)
>
> Если не нравится, то можно через орбработку сообщений окну,
>  смотри в сторону WM_MOVING, WM_MOVE

Почему WM_MOV***? WM_SIZING ему надо.


novill   (2006-12-13 09:52:00) [6]

> 777+n*37;594+n*27.

тогда, считаешь (height-777) div 37 и (width-594) div 27
из этих двух значение выбираешь одно (например максимальное) и уже в соответствии с ним устанавливаешь размеры


Наиль   (2006-12-12 21:33:00) [7]

> Но форма ведет себя как-то неадекватно при ресайзе. Дергается
> вся

к [13] добавь проверку того, какая величина изменилась ширна или высота (сравнение с текущими величинами).
Если изменились оба, то считать изменением наибольшее из них.
Если изменилась ширина, то выполняешь первое из двух указанных в [13] условий, если нет, то второе.


$Pl@Sh   (2006-12-12 20:07:00) [8]


> kutuzov47 ©   (12.12.06 18:20) [17]
>
> Ладно, сформулирую задачу по-другому.
> У меня есть форма размерами 777 на 594. Мне нужно, чтобы
> размер этой формы мог быть только таким:777+37;594+27...
> .777+n*37;594+n*27.


Та формулировка была лучше...


kutuzov47   (2006-12-12 18:20:00) [9]

Ладно, сформулирую задачу по-другому.
У меня есть форма размерами 777 на 594. Мне нужно, чтобы размер этой формы мог быть только таким:777+37;594+27....777+n*37;594+n*27.


kutuzov47   (2006-12-12 18:12:00) [10]

Ладно, сформулирую задачу по-другому.
У меня есть форма размерами 777 на 594. Мне нужно, чтобы размер этой формы мог быть только таким:777+37;594+27....777+n*37;594+n*27.


kutuzov47   (2006-12-12 18:07:00) [11]

ну это изменение высоты пропорционально нирине


novill   (2006-12-12 18:04:00) [12]

я вот не пойму этих строчек

NewHeight:=(NewWidth div 30)*20;

NewWidth:=(NewHeight div 20)*30;


kutuzov47   (2006-12-12 17:54:00) [13]

procedure TfrmMain.FormCanResize(Sender: TObject; var NewWidth,
 NewHeight: Integer; var Resize: Boolean);
begin
 if NewWidth mod 30 <> 0 then begin
   NewWidth:=(NewWidth div 30)*30;
   NewHeight:=(NewWidth div 30)*20;
 end;
 if NewHeight mod 20<>0 then begin
   NewHeight:=(NewHeight div 20)*20;
   NewWidth:=(NewHeight div 20)*30;
 end;
end;


kutuzov47   (2006-12-12 17:53:00) [14]

Сорри, выложил не тот код


kutuzov47   (2006-12-12 17:52:00) [15]

В общем, я написал так
if Width mod 30 <> 0 then begin
   Width:=(Width div 30)*30;
   Height:=(Width div 30)*20;
 end;
if Height mod 20<>0 then begin
   Height:=(Height div 20)*20;
   Width:=(Height div 20)*30;
end;

Но форма ведет себя как-то неадекватно при ресайзе. Дергается вся


novill   (2006-12-12 17:44:00) [16]

ты словами поведение формы опиши.


kutuzov47   (2006-12-12 17:37:00) [17]

Блин, ничего придумать путевого не могу. Помогите плз


novill   (2006-12-12 17:18:00) [18]

> [7] kutuzov47 ©   (12.12.06 17:14)

математикой воспользоваться ;)


kutuzov47   (2006-12-12 17:14:00) [19]

procedure TfrmMain.FormCanResize(Sender: TObject; var NewWidth,
 NewHeight: Integer; var Resize: Boolean);
begin
 if NewWidth mod 30 <> 0 then NewWidth := (NewWidth div 30)*30;
end;

Сделал так, мигать перестало и все вроде бы шоколадно, но как теперь сделать так чтобы и высота и ширина менялись одновременно, за какой бы край формы я не тянул


novill   (2006-12-12 17:11:00) [20]

> [5] kutuzov47 ©   (12.12.06 17:06)

какой стеснительный :)

Если не нравится, то можно через орбработку сообщений окну, смотри в сторону WM_MOVING, WM_MOVE


Страницы:   1 2

Наверх

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