Форум: "Начинающим";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
ВнизИзменение размеров формы на определенную величину Найти похожие ветки
← →
kutuzov47 © (2006-12-12 16:23) [0]Т.е. размер формы может меняться только, допустим, на 30 по высоте и на 20 по ширине. Как это реализовать? Заранее спасибо
← →
Elen © (2006-12-12 16:40) [1]Form1.constraints.Maxwidth:=20;Form1.constraints.Maxheight:=30; Кажись
← →
kernel © (2006-12-12 16:43) [2]У формы в свойствах в Constraints есть MaxHeight, MinHeight, MaxWidht, MinWidht.
← →
kutuzov47 © (2006-12-12 16:54) [3]Имеется в виду, что размер может быть любой. При изменении размера формы ее высота, например, должна меняться на строго определенную величину. Т.е. dHeight равно 30, например, а сама высота может быть любой. При этом ширина и высота должны меняться одновременно: изменили высоту на dHeight, ширина должна поменяться на dWidth.
← →
novill © (2006-12-12 17:00) [4]а банальное onresize не катит?
if Form1.Width mod 30 <> 0 then Form1.Width := (Form1.Width div 30)*30;
← →
kutuzov47 © (2006-12-12 17:06) [5]Ну я так и делал, но меня очень смущает то, что край формы все время мигает при этом
← →
novill © (2006-12-12 17:11) [6]> [5] kutuzov47 © (12.12.06 17:06)
какой стеснительный :)
Если не нравится, то можно через орбработку сообщений окну, смотри в сторону WM_MOVING, WM_MOVE
← →
kutuzov47 © (2006-12-12 17:14) [7]
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:18) [8]> [7] kutuzov47 © (12.12.06 17:14)
математикой воспользоваться ;)
← →
kutuzov47 © (2006-12-12 17:37) [9]Блин, ничего придумать путевого не могу. Помогите плз
← →
novill © (2006-12-12 17:44) [10]ты словами поведение формы опиши.
← →
kutuzov47 © (2006-12-12 17:52) [11]В общем, я написал так
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;
Но форма ведет себя как-то неадекватно при ресайзе. Дергается вся
← →
kutuzov47 © (2006-12-12 17:53) [12]Сорри, выложил не тот код
← →
kutuzov47 © (2006-12-12 17:54) [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;
← →
novill © (2006-12-12 18:04) [14]я вот не пойму этих строчек
NewHeight:=(NewWidth div 30)*20;
NewWidth:=(NewHeight div 20)*30;
← →
kutuzov47 © (2006-12-12 18:07) [15]ну это изменение высоты пропорционально нирине
← →
kutuzov47 © (2006-12-12 18:12) [16]Ладно, сформулирую задачу по-другому.
У меня есть форма размерами 777 на 594. Мне нужно, чтобы размер этой формы мог быть только таким:777+37;594+27....777+n*37;594+n*27.
← →
kutuzov47 © (2006-12-12 18:20) [17]Ладно, сформулирую задачу по-другому.
У меня есть форма размерами 777 на 594. Мне нужно, чтобы размер этой формы мог быть только таким:777+37;594+27....777+n*37;594+n*27.
← →
$Pl@Sh © (2006-12-12 20:07) [18]
> kutuzov47 © (12.12.06 18:20) [17]
>
> Ладно, сформулирую задачу по-другому.
> У меня есть форма размерами 777 на 594. Мне нужно, чтобы
> размер этой формы мог быть только таким:777+37;594+27...
> .777+n*37;594+n*27.
Та формулировка была лучше...
← →
Наиль © (2006-12-12 21:33) [19]> Но форма ведет себя как-то неадекватно при ресайзе. Дергается
> вся
к [13] добавь проверку того, какая величина изменилась ширна или высота (сравнение с текущими величинами).
Если изменились оба, то считать изменением наибольшее из них.
Если изменилась ширина, то выполняешь первое из двух указанных в [13] условий, если нет, то второе.
← →
novill © (2006-12-13 09:52) [20]> 777+n*37;594+n*27.
тогда, считаешь (height-777) div 37 и (width-594) div 27
из этих двух значение выбираешь одно (например максимальное) и уже в соответствии с ним устанавливаешь размеры
← →
DVM © (2006-12-13 10:22) [21]
> 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 10:43) [22]> [21] DVM © (13.12.06 10:22)
верно. он правда в ту степь все равно не полезет.
Ты случайно не помнишь как перехватить отрисовку прямоугольника что при движении и изменении размеров?
← →
DVM © (2006-12-13 10:50) [23]
> Ты случайно не помнишь как перехватить отрисовку прямоугольника
> что при движении и изменении размеров?
В смысле перехватить?
← →
novill © (2006-12-13 11:01) [24]> [23] DVM © (13.12.06 10:50)
Вот что я имею в виду: после того как пользователь "схватил" форму за угол, чтобы изменить размер или за заголовок, чтобы преместить, появляется тонкая прямоугольная рамка, которая двигается/изменяет размеры следуя движениям мыши. А форма изменяется только, когда левую кнопку мыши отпускают.
Некоторые программы могут уже в процессе "таскания" ограничивать положение/размеры только набором заданных значений.
← →
DVM © (2006-12-13 11:14) [25]
> 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;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.045 c