В первом случае кастомный контрол, просто отслеживается положение мышки в заданном квадратике, после чего положение помечается картинкой.
Если внимательно почитаешь там на сайте дальше примеры то все станет ясно.
Если думать лениво, то можно у него же зарегистрироваться на форуме и скачать скрипт joystickLite.
Во втором просто стандартные чекбоксы и картинка на фоне.
благодарю.
Следующая проблема с дотнетом 🙂 :
сам механизм управления я сделал, двигаешь по конролу двигается шарик, но!
возникла проблема с привязкой самого бегунка к мышке:
- не понятно как сделать что бы он 100% был над объектом (я рисую обычный PictureBox и ставлю туда где стоит мышка)
- не могу разобраться как сделать прозрачным бекграунд у PictureBox. если ставить вот так ControlPoint.BackColor=(dotNetclass "System.Drawing.Color"😉.fromARGB 0 0 0 0 где параметр альфы вроде как тоже нулевой, но все равно бекграунд виден.
- не понятно как двигать саму картинку параметр Location двигает картинку внутри контейнера PictureBox-а, а не по форме.
- не понятно как сделать что бы он 100% был над объектом (я рисую обычный PictureBox и ставлю туда где стоит мышка)
возможно сам PictureBox который ты пытаешься отрисовать поверх перехватывает событие - клик мышки, и оно не доходит до объекта под ним. См. ниже, этот метод не имеет этого недостатка.
не могу разобраться как сделать прозрачным бекграунд у PictureBox.
PictureBox не поддерживает прозрачный бакграунд,
Используй событие "paint", и при отрисовке прямоугольника рисуй на нем курсор методом DrawImage
в событиях мышки прямоугольника mouseDown и mouseMove вызываем метод sender.refresh() для его перерисовки.
параметр Location двигает картинку внутри контейнера PictureBox-а,
Параметр Location двигает PictureBox относительно формы.
Savin DenisПараметр Location двигает PictureBox относительно формы.
ага. он двигает относительно формы. но все равно внутри контейнера. вот на моей прошлой картинке синий кружочек двигается (сама картинка 20 на 20, а PictureBox 40 на 40) и когда она заходит за серую область его не видно)
но так или иначе начал делать твой способ. но не совсем втыкнул как его перересовывать.
пока имею такое:
fn morphcount=
(
reader = dotNetClass "System.Drawing.Point"
reader=ControlBackBrow.MousePosition
d= ControlBackBrow.PointToClient reader
positionX=d.X
positionX=d.Y
if d.X<0 then d.X=0
if d.X>100 then d.X=100
if d.Y<0 then d.Y=0
if d.Y>100 then d.Y=100
print ((d.X as string)+" "+(d.Y as string))
)
on ControlBackBrow MouseDown arg do
(
morphcount()
down=true
)
on ControlBackBrow MouseMove arg do
(
if down==true then
(
morphcount()
)
)
on ControlBackBrow MouseUp do
(
down=false
)
on ControlBackBrow Paint arg do
(
squareTargetPng=(dotNetClass "system.drawing.bitMap").fromFile ("C:\\work\\Scripts\\controll\\img\\squareTarget.png")
arg.graphics.drawimage squareTargetPng 35 37
)
dnControl=(dotNetObject "control")
--DotNet functions
fn dnColor c:[0,0,0] a:255 = ((dotNetClass "system.drawing.color").FromArgb a c.x c.y c.z)
fn dnSize s:[10,10]=(dotNetObject "system.drawing.size" s.x s.y)
fn dnPoint p:[0,0]=(dotNetObject "system.drawing.point" p.x p.y)
fn dnPointF p:[0,0]=(dotNetObject "system.drawing.pointF" p.x p.y)
fn dnRec p:[0,0] s:[10,10]=(dotNetObject "system.drawing.rectangle" p.x p.y s.x s.y)
--Bitmaps
bitMapPath ="G:\\MaxScripts\\DotNet JoyStick\\assets\\"
square100Bmp=(dotNetClass "system.drawing.bitMap").fromFile (bitMapPath+"square100.bmp")
squareTargetPng=(dotNetClass "system.drawing.bitMap").fromFile (bitMapPath+"squareTarget.png")
fn clampVal sender val =
(
minMaxX=[0,sender.width]
minMaxY=[0,sender.height]
valX=val.x
valY=val.y
--Clamp the ranges
if valX<minMaxX[1] do valX=minMaxX[1]
if valX>minMaxX[2] do valX=minMaxX[2]
if valY<minMaxY[1] do valY=minMaxY[1]
if valY>minMaxY[2] do valY=minMaxY[2]
[valX,valY]
)
fn controlLabelPaint sender arg=
(
g=arg.graphics
v = sender.PointToClient sender.MousePosition
v=clampVal sender v
g.DrawImage squareTargetPng (dnPoint p:[v.x-12,v.y-12])
)
form=dotNetObject "maxCustomControls.maxForm"
--Create the label
dnLabel=dotNetObject "label"
dnLabel.bounds=dotNetObject "system.drawing.rectangle" 10 10 100 100
dnLabel.backGroundImage=square100Bmp
--Add the label to the form.
form.controls.add dnLabel
-------------------------------------------------------
--Variable used in mouseMove handler.
global mouseIsDown=false
--Add event handlers for the form.
fn formMouseDown sender arg=
(
--Check to see which mouse button is being pressed.
mouseIsDown=true
sender.refresh()
)
fn formMouseUp sender arg=
(
mouseIsDown=false
)
fn formMouseMove sender arg=
(
if mouseIsDown do sender.refresh()
)
--Add the event handlers.
dotNet.addEventHandler dnLabel "mouseDown" formMouseDown
dotNet.addEventHandler dnLabel "mouseUp" formMouseUp
dotNet.addEventHandler dnLabel "mouseMove" formMouseMove
dotNet.addEventHandler dnLabel "paint" controlLabelPaint
--Set the life time of the control to #dotNet so that it is not garbage collected with the rest of Max script.
dotNet.setLifeTimeControl dnLabel #dotNet
--Show the form
form.show()
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
FDS
примеры можно привести вот такие:
здесь точно дотнетовские контролры.
или вот в этом ролике есть селектор, там просто нарисованые прямоугольники которыми можно выделять кости:
http://somosposmodernos.com/blog/?p=94
вопрос такой. подтолкните ка в какую сторону копать, что то мои поиски не увенчались успехом.
Savin Denis
Если внимательно почитаешь там на сайте дальше примеры то все станет ясно.
Если думать лениво, то можно у него же зарегистрироваться на форуме и скачать скрипт joystickLite.
Во втором просто стандартные чекбоксы и картинка на фоне.
FDS
Следующая проблема с дотнетом 🙂 :
сам механизм управления я сделал, двигаешь по конролу двигается шарик, но!
возникла проблема с привязкой самого бегунка к мышке:
- не понятно как сделать что бы он 100% был над объектом (я рисую обычный PictureBox и ставлю туда где стоит мышка)
- не могу разобраться как сделать прозрачным бекграунд у PictureBox. если ставить вот так ControlPoint.BackColor=(dotNetclass "System.Drawing.Color"😉.fromARGB 0 0 0 0 где параметр альфы вроде как тоже нулевой, но все равно бекграунд виден.
- не понятно как двигать саму картинку параметр Location двигает картинку внутри контейнера PictureBox-а, а не по форме.
Вложения
Savin Denis
PictureBox не поддерживает прозрачный бакграунд,
Используй событие "paint", и при отрисовке прямоугольника рисуй на нем курсор методом DrawImage
в событиях мышки прямоугольника mouseDown и mouseMove вызываем метод sender.refresh() для его перерисовки.
Параметр Location двигает PictureBox относительно формы.
FDS
но так или иначе начал делать твой способ. но не совсем втыкнул как его перересовывать.
пока имею такое:
fn morphcount= ( reader = dotNetClass "System.Drawing.Point" reader=ControlBackBrow.MousePosition d= ControlBackBrow.PointToClient reader positionX=d.X positionX=d.Y if d.X<0 then d.X=0 if d.X>100 then d.X=100 if d.Y<0 then d.Y=0 if d.Y>100 then d.Y=100 print ((d.X as string)+" "+(d.Y as string)) ) on ControlBackBrow MouseDown arg do ( morphcount() down=true ) on ControlBackBrow MouseMove arg do ( if down==true then ( morphcount() ) ) on ControlBackBrow MouseUp do ( down=false ) on ControlBackBrow Paint arg do ( squareTargetPng=(dotNetClass "system.drawing.bitMap").fromFile ("C:\\work\\Scripts\\controll\\img\\squareTarget.png") arg.graphics.drawimage squareTargetPng 35 37 )Вложения
Savin Denis
Вот что-то такое должно получиться: