Вверх ↑
Этот топик читают: Гость
Ответов: 1938
Рейтинг: 627
#1: 2015-01-20 23:05:45 ЛС | профиль | цитата
Элемент в стадии разработки.
Нужна помощь в доработки элемента.
Элемент отображает рамку изменяющую размер при перетаскивании за края и углы. В архиве приведен пример изменения размеров интерфейсных элементов.
capture_01202015_221802.png
Проблема в "мерцании" краев (правый и нижний) при перетаскивании за края и углы изменяющие кроме размера, положение элемента (Left,Top).
Для тестирования проделайте следующее (см. схему в архиве):
1. Двойным кликом по интерфейсному элементу (к примеру PaintBox-у).
2. Зажмите (левой кнопкой мыши) левый средний квадрат рамки изменения размера.
3. Подвигайте курсором, правый край "мерцает".
4. При изменении размеров правым средним квадратом такого нет.

Пробовал разные варианты изменения размеров и положения элемента, но проблему решить не получилось. Возможно нужно как то "заморозить" компонент в момент изменения позиции и размера:
#pas
190 Control.Left := tpos.x;
191 Control.Width := Control.Width + t;
чтоб не происходила перерисовка, но вот как не знаю.
Что смотреть в pas файле:

#pas
113 procedure THIFrameSize._work_doSet; // делаем элемент видимым, устанавливаем позицию

214 function THIFrameSize.onMessage; // обработка сообщений

245 WM_LBUTTONDOWN: // при клике на квадрат начинаем изменять размер элемента resize := true

226 WM_MOUSEMOVE: // посылаем позицию курсора ChangeSize(p);

145 procedure THIFrameSize.ChangeSize; // изменяем размер

197 case iRGN of // в зависимости от того за какой квадрат тягают

203 5: change := SetLeft; // в моем примере это левый средний квадрат

184 function SetLeft: boolean; // вот тут и изменяем позицию и размер

221 WM_SIZE: // а тут подгоняем квадратики (регионы) под размер элемента

Архив с элементом и схемой для тестирования

P.S. На остальное в коде не обращайте внимание: "в стадии разработки".

карма: 9

3
файлы: 2capture_01202015_221802.png [285.7KB] [852], framesize_2015_01_28.zip [40.3KB] [545]
Голосовали:LainX, Konst, Kazbek17
vip
#1.1контекстная реклама от партнеров
Ответов: 4666
Рейтинг: 516
#2: 2015-01-21 06:11:08 ЛС | профиль | цитата
sla8a, глянь в архив kolfrmdesign.zip может чего сгодиться.

карма: 6

0
файлы: 1kolfrmdesign.zip [21.1KB] [203]
Ответов: 757
Рейтинг: 111
#3: 2015-01-21 10:15:09 ЛС | профиль | цитата
sla8a, Посмотри тему http://forum.d2h.ru/forum.html?q=3&p=268526
Еще попробуй при изменении положения и размеров посылать контролу только одно сообщение MoveWindow
https://msdn.microsoft.com/en-us/library/windows/desktop/ms633534(v=vs.85).aspx
карма: 1

0
Ответов: 4341
Рейтинг: 677
#4: 2015-01-21 11:38:01 ЛС | профиль | цитата
Да, вроде это должно помочь.
Предполагаю, нужно в двух местах:
- изменение размера конечного компонента по onResize. У тебя это делается по очереди двумя компонентами (PosWindow, SizeWindow), нужно одним (у нас есть такая возможность?). Это уберет мерцание самого компонента, которое в общем не очень заметно, так как перекрывается рамкой.
- изменение размера рамки в ChangeSize. Опять же, функции SetLeft и остальные выполняют последовательно изменение позиции и размера. Нужно сделать так, чтобы они только вычисляли нужные значения, а в конце один раз вызвать MoveWindow.
карма: 25

0
Ответов: 9906
Рейтинг: 351
#5: 2015-01-21 12:55:39 ЛС | профиль | цитата
Вообще-то, SetWindowPos меняет сразу все координаты "одним махом".
Скажем, как-то так:
Add(PosWindow,4537334,406,140)
{
link(Handle,2712927:Var2,[])
}
Add(SizeWindow,8984922,455,140)
{
link(Handle,2712927:Var3,[(461,124)])
}
Add(Memory,9799820,329,203)
{
link(onData,7796527:doSet,[])
}
Add(FrameSize,7796527,441,203)
{
Align=
Color=255
Font=255
ParentFont=255
Visible=255
Enabled=255
Cursor=255
TabOrder=255
Ctl3D=255
WinStyle=255
Name=255
Hint=255
HintManager=255
Layout=255
WidthScale=255
HeightScale=255
BoxSize=7
Position=1
Point(onResize)
Point(Left)
Point(Top)
Point(Width)
Point(Height)
Point(doAlign)
link(onResize,7669386:doResize,[(480,216)(480,230)(424,230)(424,279)])
link(Left,4537334:CurrentLeft,[(447,194)(412,194)])
link(Top,4537334:CurrentTop,[(454,187)(419,187)])
link(Width,8984922:CurrentWidth,[])
link(Height,8984922:CurrentHeight,[])
}
Add(InlineCode,7669386,434,273)
{
WorkPoints=#8:doResize|
DataPoints=#6:Handle|4:Left|3:Top|5:Width|6:Height|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|30:uses Windows, kol,Share,Debug;|0:|5:type |0:|27:THiAsmClass = class(TDebug)|9: private|0:|8: public|21: Handle:THI_Event;|19: Left:THI_Event;|18: Top:THI_Event;|20: Width:THI_Event;|21: Height:THI_Event;|46: procedure doResize(var _D:TData; _I:word);|4:end;|0:|14:implementation|0:|31:procedure THiAsmClass.doResize;|33:var hnd:THandle; X,Y,W,H:integer;|5:begin|33: hnd := ReadInteger(_D, Handle);|29: X := ReadInteger(_D, Left);|28: Y := ReadInteger(_D, Top);|30: W := ReadInteger(_D, Width);|31: H := ReadInteger(_D, Height);|43: SetWindowPos(hnd,0,X,Y,W,H,SWP_NOZORDER);|4:end;|0:|4:end.|
link(Handle,10080483:Var3,[(440,249)])
link(Left,7796527:CurrentLeft,[])
link(Top,7796527:CurrentTop,[])
link(Width,7796527:CurrentWidth,[])
link(Height,7796527:CurrentHeight,[])
}
Add(GetDataEx,10080483,371,244)
{
Angle=3
link(Data,9799820:Value,[(335,249)])
}
Add(GetDataEx,2712927,406,119)
{
Angle=3
link(Data,10080483:Var1,[(377,124)])
}
Мне показалось, что мигают "квадратики", а не окно...

------------ Дoбавленo в 12.33:
Кстати, что за хрень ты понаписал в FrameSize.INI
Так дела не делаются...


------------ Дoбавленo в 12.55:
Хмм... Оказывается народ все это уже написал
С MoveWindow работает также (а параметров меньше)... Как мне показалось
карма: 9

0
Ответов: 1938
Рейтинг: 627
#6: 2015-01-28 20:15:26 ЛС | профиль | цитата
Спасибо всем кто отписался, но проблему пока решить не получилось.
Изначально я предполагал что проблема ("мерцание") в изменении позиции и размера элемента, но
опробовав различные варианты (MoveWindow, SetWindowPos, BoundsRect), окончательно запутался.
Сейчас в элементе при любом изменении размера используется BoundsRect, можете ради теста опробовать и MoveWindow (в элементе строка есть), но разницы особой нет. В результате осталась видимая разница при перетаскиванием за левый центральный ("мерцание") и правый центральный квадрат (нормально). Можно сделать вывод что проблема не в том как изменяется размер.

Подозрение на мышиные координаты. Способ получения разный (строки: 134 - 161). Может кто посмотрит и пнет в нужную сторону?

Архив с элементом и примером в первом посте (обновил).
Galkov писал(а):
что за хрень ты понаписал в FrameSize.INI
Еще какая хрень, но давайте пока закроем на это глаза.
Galkov писал(а):
Мне показалось, что мигают "квадратики", а не окно...
В "квадратиках" и проблема (у меня всегда проблемы с изложением своих мыслей).

andrestudio писал(а):
глянь в архив
За архив спасибо, кое что благодаря ему подправил.

карма: 9

0
6
Сообщение
...
Прикрепленные файлы
(файлы не залиты)