Вверх ↑
Этот топик читают: Гость
Ответов: 1535
Рейтинг: 176
#31: 2013-01-22 22:40:27 ЛС | профиль | цитата
Наверное всё-таки расчёты были не верными. Попробовал поэкспериментировать с VisualShape, так поведение уже другое. Но тоже стремится к нулю.
Add(MainForm,520980,217,49)
{
Width=702
Height=486
link(onCreate,14795528:doWork1,[])
}
Add(ChildPanel,14795528,273,63)
{
}
BEGIN_SDK
Add(EditMulti,11519715,28,21)
{
WorkCount=1
Width=496
Height=459
link(doWork1,4266222:doData,[(52,27)(52,230)])
}
Add(Panel,16673103,399,392)
{
Top=5
Width=791
Height=562
Color=16711680
BorderWidth=0
BevelInner=0
BevelWidth=0
}
Add(MoveWindow,4813781,413,49)
{
link(Handle,8217273:Handle,[(419,37)(398,37)(398,92)(370,92)])
}
Add(Math,16498202,245,280)
{
OpType=2
ResultType=0
PColor(Op2,16733695)
link(onResult,5558418:Wire1,[])
link(Op2,8217273:Width,[(258,116)(328,116)])
}
Add(Math,1268462,287,287)
{
OpType=2
ResultType=0
link(onResult,5558418:Wire2,[])
link(Op2,8217273:Height,[(300,129)(335,129)])
}
Add(Hub,4830515,210,280)
{
OutCount=4
link(onEvent1,16498202:doOperation,[])
link(onEvent2,1268462:doOperation,[])
link(onEvent3,7699264:doCalc,[])
link(onEvent4,14759686:doCalc,[])
}
Add(MathParse,7699264,336,294)
{
DataCount=3
MathStr="%2-(%2-%3)*%1"
ResultType=0
PColor(X3,16711935)
link(onResult,5558418:Wire3,[])
link(X1,10751850:Var2,[])
link(X2,8217273:MouseX,[(349,184)(356,184)])
link(X3,8217273:Left,[(356,184)(342,184)])
}
Add(MathParse,14759686,385,301)
{
DataCount=3
MathStr="%2-(%2-%3)*%1"
ResultType=0
PColor(X3,11184640)
link(onResult,5558418:Wire4,[])
link(X1,10751850:Var3,[(391,267)])
link(X2,8217273:MouseY,[(398,187)(363,187)])
link(X3,8217273:Top,[(405,187)(349,187)])
}
Add(MathParse,6410142,56,273)
{
@Hint=#47:Используем скролл для изменения масштаба +-0.01|
MathStr="((%1>0)*(%2+0.01))+
(((%1<0)and(%2>0.0))*(%2-0.01))
"
Default=1
link(onResult,14657662:doWork2,[])
link(X2,9462090:Var1,[(69,265)(95,265)(95,336)])
AddHint(-17,130,200,26,@Hint)
}
Add(Hub,7146596,112,273)
{
link(onEvent1,9344723:doWork2,[])
link(onEvent2,4830515:doEvent1,[])
}
Add(GetDataEx,10751850,336,262)
{
Angle=3
link(Data,7269437:Result,[(324,267)(324,396)(167,396)])
}
Add(MemFifo,8753638,161,294)
{
link(onData,7269437:doOperation,[(200,300)(200,341)(149,341)(149,356)])
}
Add(Math,7269437,161,350)
{
OpType=3
link(Op1,9462090:Var2,[])
link(Op2,8753638:Value2,[])
}
Add(GetDataEx,9462090,161,331)
{
link(Data,8753638:Value1,[])
}
Add(HubEx,9344723,144,273)
{
Angle=1
link(onEvent,8753638:doValue,[(148,300)])
}
Add(Hub,7262469,112,224)
{
link(onEvent1,9344723:doWork1,[(148,230)])
link(onEvent2,14657662:doWork1,[(138,237)(138,257)(102,257)])
}
Add(HubEx,14657662,98,273)
{
link(onEvent,7146596:doEvent1,[])
}
Add(CableEvent,11282654,280,42)
{
Count=4
link(Wire1,8217273:doWidth,[])
link(Wire2,8217273:doHeight,[])
link(Wire3,8217273:doLeft,[])
link(Wire4,8217273:doTop,[])
}
Add(CableWork,5558418,434,280)
{
Count=4
link(Cable,11282654:Cable,[(457,286)(457,101)(268,101)(268,48)])
}
Add(VisualShape,8217273,322,42)
{
Left=25
Top=10
Width=275
Height=265
Point(Width)
Point(Height)
Point(Left)
Point(Top)
Point(doWidth)
Point(doHeight)
Point(doLeft)
Point(doTop)
Point(MouseX)
Point(MouseY)
Point(onMouseWheel)
Point(doSetFocus)
Point(onMouseDown)
Point(Handle)
Point(onMouseMove)
link(onMouseWheel,6410142:doCalc,[(480,48)(480,448)(44,448)(44,279)])
link(onMouseDown,4813781:doMove,[])
link(onMouseMove,8217273:doSetFocus,[(386,62)(386,69)(310,69)(310,76)])
}
Add(DoData,4266222,63,224)
{
Data=Integer(1)
link(onEventData,7262469:doEvent1,[])
}
END_SDK
------------ Дoбавленo в 19.20:
Да, нет, расчёты верны, это похоже на индивидуальное поведение VisualShape. Хотя, это надо спросить у его авторов.
------------ Дoбавленo в 20.12:
nesco, если параллельно подключить багер к координатам мыши картинки, то можно увидеть, как проявляются посторонние координаты. Так картинка, имеет например максимум 500 пикселей, а в крайне правом положении формы после нужных (как мне кажется) координат над картинкой, проявляются координаты глобального масштаба (экрана), например в 1200 пикселей. Проверено. Вот почему картинка уплывала влево. То же самое и с Y-координатой мыши.
------------ Дoбавленo в 22.38:
Вставил дополнительный учёт в схеме, позицию мыши к позиции родительской формы. Вроде заработало.

Add(MainForm,520980,259,49)
{
Width=614
Height=472
Point(Left)
Point(Top)
}
Add(ChildPanel,14795528,259,98)
{
link(Data1,520980:Left,[])
link(Data2,520980:Top,[])
}
BEGIN_SDK
Add(EditMulti,11519715,28,21)
{
WorkCount=1
DataCount=2
Width=566
Height=375
link(doWork1,5260458:doLoad,[(46,27)(46,83)])
}
Add(Image,11537535,259,77)
{
Width=560
Height=440
Color=12639424
ViewStyle=1
Point(onMouseDown)
Point(onMouseWheel)
Point(doSetFocus)
Point(doWidth)
Point(doHeight)
Point(doLeft)
Point(doTop)
Point(ImageWidth)
Point(ImageHeight)
Point(Left)
Point(Top)
Point(Width)
Point(Height)
Point(Handle)
Point(MouseX)
Point(MouseY)
link(onMouseDown,4813781:doMove,[])
link(onMouseWheel,342210:In,[])
}
Add(Panel,16673103,91,336)
{
Width=559
Height=441
Color=16711680
BorderWidth=0
BevelInner=0
BevelWidth=0
}
Add(Hub,9194805,140,77)
{
OutCount=3
link(onEvent1,11537535:doLoad,[])
link(onEvent2,11537535:doSetFocus,[(196,90)(196,97)])
link(onEvent3,6563661:doCalc,[(168,97)(168,124)(79,124)(79,181)])
}
Add(MoveWindow,4813781,406,84)
{
link(Handle,11537535:Handle,[(412,72)(396,72)(396,141)(314,141)])
}
Add(Img_Loader,5260458,91,77)
{
link(onLoad,9194805:doEvent1,[])
}
Add(Math,16498202,259,231)
{
OpType=2
ResultType=0
PColor(Op2,16733695)
link(onResult,5558418:Wire1,[])
link(Op2,9514427:Var2,[])
}
Add(Math,1268462,301,238)
{
OpType=2
ResultType=0
link(onResult,5558418:Wire2,[])
link(Op2,16575302:Var2,[(314,207)(279,207)])
}
Add(MathParse,7699264,392,245)
{
DataCount=3
MathStr="%2-(%2-%3)*%1"
ResultType=0
PColor(X3,16711935)
link(onResult,5558418:Wire3,[])
link(X1,10751850:Var2,[])
link(X3,11537535:Left,[(412,181)(286,181)])
}
Add(MathParse,14759686,476,252)
{
DataCount=3
MathStr="%2-(%2-%3)*%1"
ResultType=0
PColor(X3,11184640)
link(onResult,5558418:Wire4,[])
link(X1,10751850:Var3,[(482,225)])
link(X3,11537535:Top,[(496,152)(293,152)])
}
Add(MathParse,6410142,119,224)
{
@Hint=#47:Используем скролл для изменения масштаба +-0.01|
MathStr="((%1>0)*(%2+0.05))+
(((%1<0)and(%2>0.0))*(%2-0.05))
"
Default=1
link(onResult,14657662:doWork2,[])
link(X2,9462090:Var1,[(132,216)(158,216)(158,315)])
}
Add(Hub,7146596,175,224)
{
link(onEvent1,564344:doWork2,[])
link(onEvent2,8636872:doEvent1,[])
}
Add(GetDataEx,10751850,392,220)
{
Angle=3
link(Data,7269437:Result,[(383,225)(383,370)(265,370)])
}
Add(MemFifo,8753638,259,273)
{
Count=1
link(onData,7269437:doOperation,[(298,279)(298,320)(247,320)(247,335)])
}
Add(MathParse,6563661,91,175)
{
DataCount=4
MathStr="min(%2/%1 , %4/%3)"
PColor(X2,170)
PColor(X4,5635925)
link(onResult,13670200:doEvent1,[])
link(X1,9514427:Var1,[(97,138)])
link(X2,11537535:Width,[(104,145)(300,145)])
link(X3,16575302:Var1,[(111,152)])
link(X4,11537535:Height,[(118,159)(307,159)])
}
Add(GetDataEx,9514427,266,133)
{
PColor(Data,16733695)
link(Data,11537535:ImageWidth,[])
}
Add(GetDataEx,16575302,273,147)
{
link(Data,11537535:ImageHeight,[])
}
Add(Math,7269437,259,329)
{
OpType=3
link(Op1,9462090:Var2,[])
}
Add(GetDataEx,9462090,259,310)
{
link(Data,8753638:Value1,[])
}
Add(HubEx,14657662,161,224)
{
link(onEvent,7146596:doEvent1,[])
}
Add(CableEvent,11282654,231,98)
{
Count=4
link(Wire1,11537535:doWidth,[])
link(Wire2,11537535:doHeight,[])
link(Wire3,11537535:doLeft,[])
link(Wire4,11537535:doTop,[])
}
Add(CableWork,5558418,525,231)
{
Count=4
link(Cable,9138729:In,[])
}
Add(Hub,13670200,140,175)
{
link(onEvent1,564344:doWork1,[(204,181)])
link(onEvent2,14657662:doWork1,[(165,188)])
}
Add(HubEx,564344,200,224)
{
Angle=1
link(onEvent,8753638:doValue,[(204,279)])
}
Add(Hub,8636872,231,231)
{
OutCount=4
link(onEvent1,16498202:doOperation,[])
link(onEvent2,1268462:doOperation,[])
link(onEvent3,8194395:doCalc,[])
link(onEvent4,11030232:doCalc,[])
}
Add(MathParse,8194395,343,245)
{
MathStr="%1-%2"
ResultType=0
PColor(X2,16711935)
link(onResult,7699264:doCalc,[])
link(X1,11537535:MouseX,[(349,195)(321,195)])
link(X2,11519715:Data1,[(356,51)(34,51)])
}
Add(MathParse,11030232,434,252)
{
MathStr="%1-%2-40"
ResultType=0
PColor(X2,16711935)
link(onResult,14759686:doCalc,[])
link(X1,11537535:MouseY,[(440,166)(328,166)])
link(X2,11519715:Data2,[(447,37)(41,37)])
}
Add(LineBreak,7725584,77,224)
{
Color=12639424
link(Out,6410142:doCalc,[])
Primary=[342210,266,-133]
}
Add(LineBreak,13818505,189,98)
{
Color=65280
link(Out,11282654:Cable,[])
Primary=[9138729,357,133]
}
END_SDK
Add(Button,13924186,161,98)
{
Left=565
Top=5
Width=35
Height=40
link(onClick,3153243:doExecute,[])
}
Add(ODialog,3153243,210,98)
{
StartDir="C:UsersLAPictures"
FileName="DSC01692.JPG"
link(onExecute,14795528:doWork1,[])
}
Но это всё равно не дело, нужно исправлять баг.
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#32: 2013-01-22 23:08:44 ЛС | профиль | цитата
ser_davkin писал(а):
Но это всё равно не дело, нужно исправлять баг

Не все можно исправить, и ты это прекрасно знаешь.
карма: 22

0
Ответов: 8885
Рейтинг: 823
#33: 2013-01-23 17:58:04 ЛС | профиль | цитата
ser_davkin, "эффект" наблюдается только при скролле мышки, при управлении с клавиатуры -- картинка относительно мышки не перемещается Наверное карты путает непрерывная установка фокуса на картинку, а без фокуса скролл не работает
nesco, можете-ли сделать на мышку отдельный глобальный компонент
code_30164.txt
карма: 19

0
файлы: 1code_30164.txt [5.1KB] [434]
Разработчик
Ответов: 26061
Рейтинг: 2120
#34: 2013-01-23 18:54:58 ЛС | профиль | цитата
Леонид писал(а):
можете-ли сделать на мышку отдельный глобальный компонент

Да я же вроде уже делал такой и выкладывал. Не помню, как точно назывался, что-то типа Хука на мышь
карма: 22

0
Ответов: 8885
Рейтинг: 823
#35: 2013-01-23 19:31:10 ЛС | профиль | цитата
nesco, добавить бы в MouseEvent эти хуки: onMouseDown, onMouseUp, onMouseWheel --цены бы не было
карма: 19

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#36: 2013-01-23 19:41:06 ЛС | профиль | цитата
Леонид писал(а):
onMouseDown, onMouseUp, onMouseWheel --цены бы не было

Если найду исходники, то постараюсь, но в MouseEvent это без перехвата сделать сложно. Но вроде onMouseDown, onMouseUp в
последней версии Хука были, хотя сейчас точно не помню
карма: 22

0
Ответов: 3349
Рейтинг: 233
#37: 2013-01-23 19:52:11 ЛС | профиль | цитата
MouseHook
------------ Дoбавленo в 19.52:
RawInput и здесь есть
карма: 1

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#38: 2013-01-23 19:53:34 ЛС | профиль | цитата
Ivann, есть версия без dll, она там и нафиг не нужна. Нашел, мой компонент называется GMouseHook
карма: 22

0
файлы: 1gmousehook_002.zip [1.7KB] [303]
Ответов: 3349
Рейтинг: 233
#39: 2013-01-23 19:56:43 ЛС | профиль | цитата
nesco, Тогда делал на базе KeyHook
карма: 1

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#40: 2013-01-24 01:35:00 ЛС | профиль | цитата
А ведь действительно, координаты курсора в окне выдаются только по MouseMove, в любых других режимах выдаются глобальные координаты, но эта собака зарыта где-то в глубоко в KOL-е. Но ковырять KOL смысла нет, и поэтому, лучше сразу привязаться к глобальным координатам
карма: 22

0
Ответов: 1535
Рейтинг: 176
#41: 2013-07-31 09:45:32 ЛС | профиль | цитата
Galkov писал(а):
Правильно отражаются.
Какие координаты винда контролу дала, такие он и передал (см. WndProcMouse).

Galkov,по-твоему всё так и должно быть? Тогда почему по MouseMove выдаёт координаты правильно, а в onMouseWheel - нет?

Вот, чтобы нагляднее было:
Add(MainForm,5808169,182,98)
{
Width=687
Height=492
link(onCreate,8314818:doSetFocus,[])
}
Add(Image,8314818,238,98)
{
Width=560
Height=440
Color=12639424
ViewStyle=1
Point(onMouseDown)
Point(onMouseWheel)
Point(doSetFocus)
Point(Handle)
Point(MouseX)
Point(MouseY)
Point(onMouseMove)
link(onMouseDown,4115405:doMove,[])
link(onMouseWheel,11009220:doStrCatDlm,[(306,118)(306,163)(241,163)(241,209)])
link(onMouseMove,9933815:doStrCatDlm,[(297,125)(297,155)(201,155)(201,251)])
}
Add(StrCatDelim,11009220,252,203)
{
Delimiter="-"
link(onStrCatDlm,14333605:doText,[])
link(Str1,7814758:Var2,[])
link(Str2,13465166:Var2,[])
}
Add(Label,14333605,315,203)
{
Left=570
Top=85
}
Add(MoveWindow,4115405,315,105)
{
link(Handle,8314818:Handle,[(321,93)(286,93)(286,142)(251,142)])
}
Add(StrCatDelim,9933815,217,245)
{
Delimiter="-"
link(onStrCatDlm,11894771:doText,[])
link(Str1,7814758:Var1,[(223,180)])
link(Str2,13465166:Var1,[(230,187)])
}
Add(Label,11894771,315,245)
{
Left=570
Top=110
}
Add(GetDataEx,7814758,252,175)
{
link(Data,8314818:MouseX,[])
}
Add(GetDataEx,13465166,259,182)
{
link(Data,8314818:MouseY,[])
}
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Ответов: 9906
Рейтинг: 351
#42: 2013-07-31 22:33:58 ЛС | профиль | цитата
ser_davkin писал(а):
Galkov,по-твоему всё так и должно быть?

Причем тут по-моему, по-твоему, или еще по-чьему то...
Читаем MSDN, и всего делов

WM_MOUSEMOVE Notification

The WM_MOUSEMOVE message is posted to a window when the cursor moves. If the mouse is not captured, the message is posted to the window that contains the cursor. Otherwise, the message is posted to the window that has captured the mouse.
A window receives this message through its WindowProc function.
....
Parameters

wParam -- Indicates whether various virtual keys are down. This parameter can be one or more of the following values.
MK_CONTROL - The CTRL key is down.
MK_LBUTTON - The left mouse button is down.
MK_MBUTTON - The middle mouse button is down.
MK_RBUTTON - The right mouse button is down.
MK_SHIFT - The SHIFT key is down.
MK_XBUTTON1 - Windows 2000/XP: The first X button is down.
MK_XBUTTON2 - Windows 2000/XP: The second X button is down.

lParam -- The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.
The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.
...

WM_MOUSEWHEEL Notification

The WM_MOUSEWHEEL message is sent to the focus window when the mouse wheel is rotated. The DefWindowProc function propagates the message to the window's parent. There should be no internal forwarding of the message, since DefWindowProc propagates it up the parent chain until it finds a window that processes it.
A window receives this message through its WindowProc function.
...
Parameters

wParam -- The high-order word indicates the distance the wheel is rotated, expressed in multiples or divisions of WHEEL_DELTA, which is 120. A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user.
The low-order word indicates whether various virtual keys are down. This parameter can be one or more of the following values.
MK_CONTROL - The CTRL key is down.
MK_LBUTTON - The left mouse button is down.
MK_MBUTTON - The middle mouse button is down.
MK_RBUTTON - The right mouse button is down.
MK_SHIFT - The SHIFT key is down.
MK_XBUTTON1 - Windows 2000/XP: The first X button is down.
MK_XBUTTON2 - Windows 2000/XP: The second X button is down.

lParam -- The low-order word specifies the x-coordinate of the pointer, relative to the upper-left corner of the screen. The high-order word specifies the y-coordinate of the pointer, relative to the upper-left corner of the screen
...

И нечего на Земляка поклеп устраивать
карма: 9

1
Голосовали:ser_davkin
Разработчик
Ответов: 26061
Рейтинг: 2120
#43: 2013-07-31 23:49:29 ЛС | профиль | цитата
Galkov писал(а):
Читаем MSDN

Ну, как всегда -- во всем виноваты мелкомягкие
карма: 22

0
Ответов: 9906
Рейтинг: 351
#44: 2013-08-01 14:01:37 ЛС | профиль | цитата
Ну да, как-то так...
"По-моему" оно может и не правильно, а "по-ихнему" получается, что - правильно. Вот такие они парни

Вообще-то, если мыша глобальная (типа -- форсмажор), то логично и координаты контрола иметь БЫ глобальные...

А у нас в элементной базе обертки над ClentToScreen - как-то и нет.
Хотя в каком-нибудь PosWindow это можно было бы и приклеить... Типа двух сокрытых нижних точек GlobalTop, GlobalLeft
Ну или св-во Client/Global для фокуса типа doOperation%OpType%
карма: 9

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