Render.ru
Поддержать

dotnet controls

FDS

Мастер
Рейтинг
154
И так задвача: Сделать контролы в отдельном окне которые будут управлять чем то, даже пусть грубо позицией чайника.
примеры можно привести вот такие:


здесь точно дотнетовские контролры.

или вот в этом ролике есть селектор, там просто нарисованые прямоугольники которыми можно выделять кости:
http://somosposmodernos.com/blog/?p=94

вопрос такой. подтолкните ка в какую сторону копать, что то мои поиски не увенчались успехом.

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
В первом случае кастомный контрол, просто отслеживается положение мышки в заданном квадратике, после чего положение помечается картинкой.
Если внимательно почитаешь там на сайте дальше примеры то все станет ясно.
Если думать лениво, то можно у него же зарегистрироваться на форуме и скачать скрипт joystickLite.

Во втором просто стандартные чекбоксы и картинка на фоне.

FDS

Мастер
Рейтинг
154
благодарю.
Следующая проблема с дотнетом 🙂 :
сам механизм управления я сделал, двигаешь по конролу двигается шарик, но!
возникла проблема с привязкой самого бегунка к мышке:
- не понятно как сделать что бы он 100% был над объектом (я рисую обычный PictureBox и ставлю туда где стоит мышка)
- не могу разобраться как сделать прозрачным бекграунд у PictureBox. если ставить вот так ControlPoint.BackColor=(dotNetclass "System.Drawing.Color"😉.fromARGB 0 0 0 0 где параметр альфы вроде как тоже нулевой, но все равно бекграунд виден.
- не понятно как двигать саму картинку параметр Location двигает картинку внутри контейнера PictureBox-а, а не по форме.

Вложения

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
- не понятно как сделать что бы он 100% был над объектом (я рисую обычный PictureBox и ставлю туда где стоит мышка)
возможно сам PictureBox который ты пытаешься отрисовать поверх перехватывает событие - клик мышки, и оно не доходит до объекта под ним. См. ниже, этот метод не имеет этого недостатка.


не могу разобраться как сделать прозрачным бекграунд у PictureBox.
PictureBox не поддерживает прозрачный бакграунд,
Используй событие "paint", и при отрисовке прямоугольника рисуй на нем курсор методом DrawImage
в событиях мышки прямоугольника mouseDown и mouseMove вызываем метод sender.refresh() для его перерисовки.


параметр Location двигает картинку внутри контейнера PictureBox-а,
Параметр Location двигает PictureBox относительно формы.

FDS

Мастер
Рейтинг
154
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
	)

Вложения

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
Только события также дот-нетовские должны быть

Вот что-то такое должно получиться:

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()