1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

dotnet controls

Тема в разделе "MAXScript", создана пользователем FDS, 28 июн 2012.

Модераторы: Savin Denis
  1. FDS

    FDS Мастер

    С нами с:
    24.04.2008
    Сообщения:
    922
    Симпатии:
    195
    Баллы:
    110
    И так задвача: Сделать контролы в отдельном окне которые будут управлять чем то, даже пусть грубо позицией чайника.
    примеры можно привести вот такие:

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

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

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

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    В первом случае кастомный контрол, просто отслеживается положение мышки в заданном квадратике, после чего положение помечается картинкой.
    Если внимательно почитаешь там на сайте дальше примеры то все станет ясно.
    Если думать лениво, то можно у него же зарегистрироваться на форуме и скачать скрипт joystickLite.

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

    FDS Мастер

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

    Вложения:

    • 2760182.jpg
      2760182.jpg
      Размер файла:
      49,1 КБ
      Просмотров:
      93
  4. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    возможно сам PictureBox который ты пытаешься отрисовать поверх перехватывает событие - клик мышки, и оно не доходит до объекта под ним. См. ниже, этот метод не имеет этого недостатка.


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


    Параметр Location двигает PictureBox относительно формы.
     
  5. FDS

    FDS Мастер

    С нами с:
    24.04.2008
    Сообщения:
    922
    Симпатии:
    195
    Баллы:
    110
    ага. он двигает относительно формы. но все равно внутри контейнера. вот на моей прошлой картинке синий кружочек двигается (сама картинка 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
    	)
     

    Вложения:

    • 2761682.jpg
      2761682.jpg
      Размер файла:
      7,2 КБ
      Просмотров:
      81
  6. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Только события также дот-нетовские должны быть

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

    Код:
    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()
     
Модераторы: Savin Denis

Поделиться этой страницей