Render.ru

dotnet controls

FDS

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


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

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

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

Savin Denis

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

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

FDS

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

Вложения

Savin Denis

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


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


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

FDS

Мастер
Рейтинг
154
#5
Параметр 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
#6
Только события также дот-нетовские должны быть

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

Код:
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()
 
Сверху