Notifications
Clear all

[Closed] max rollout floater in .net form

as i promised here is a snippet how to put rollout floater into .net form:


  fn CreateUser32Assembly forceRecompile:on =
(
	if (forceRecompile or 
		(classof ::User32Assembly) != dotNetObject or 
		((::User32Assembly.GetType()).ToString()) != "System.Reflection.Assembly") do
	(
		source = "using System;
"
		source += "using System.Runtime.InteropServices;
"
		source += "class User32
"
		source += "{
"
		source += " [DllImport(\"User32.DLL\", EntryPoint=\"GetWindowLong\")]
"
		source += " public static extern Int32 GetWindowLong(IntPtr hWnd, Int32 index);
"
		source += " [DllImport(\"User32.DLL\", EntryPoint=\"SetWindowLong\")]
"
		source += " public static extern Int32 SetWindowLong(IntPtr hWnd, Int32 index, Int32 newVal);
"
		source += " [DllImport(\"User32.DLL\", EntryPoint=\"SetWindowLong\")]
"
		source += " public static extern Int32 SetWindowLongPtr(IntPtr hWnd, Int32 index, IntPtr dwNewLong);
"
		source += " [DllImport(\"user32.dll\")]
"
		source += " public static extern bool SetWindowPos(IntPtr hWnd, int hWndArg, int Left, int Top, int Width, int Height, int hWndFlags);
"
		source += "}
"

		csharpProvider = dotnetobject "Microsoft.CSharp.CSharpCodeProvider"
		compilerParams = dotnetobject "System.CodeDom.Compiler.CompilerParameters"
						
		compilerParams.GenerateInMemory = true
		compilerResults = csharpProvider.CompileAssemblyFromSource compilerParams #(source)
		::User32Assembly = compilerResults.CompiledAssembly
	)
	::User32Assembly.CreateInstance "User32"
)
global User32 = CreateUser32Assembly()
fn setOwnerWindow main title = if (hwnd = windows.getChildHWND 0 title) != undefined do 
(
	hwnd = dotnetobject "IntPtr" hwnd[1]
	main = dotnetobject "IntPtr" main
	::User32.SetWindowLongPtr hwnd -8 main -- set ownership
	::User32.SetWindowPos hwnd 0 0 0 0 0 0x3 -- set z-top
	hwnd
)

try(closeRolloutFloater max_float) catch()
try(destroydialog max_rol) catch()
try(win.close()) catch()

win = dotNetObject "MaxCustomControls.MaxForm"
win.size = dotNetObject "System.Drawing.Size" 200 270
win.Location = dotNetObject "System.Drawing.Point" 900 150
win.StartPosition = win.StartPosition.Manual
win.text = "Max Form"

	
rollout max_rol "Radius"
(
	local sph
	spinner sp "Radius: " fieldwidth:60 align:#right
	on max_rol open do with undo off 
	(
		sph = sphere radius:(random 10 40) isselected:on
		sp.controller = sph.radius.controller = bezier_float()
	)
--	on max_rol resized val do (if sp.pos.x != val.x-25 do sp.pos.x = val.x-25)
	fn close = (if isvalidnode sph do with undo off delete sph)
)
rollout hem_rol "Hemisphere" rolledup:on
(
	spinner sp "Hemisphere: " range:[0,1,0] scale:0.01 fieldwidth:60 align:#right 
	bitmap bm bitmap:(bitmap 160 100 color:blue)
	
	on hem_rol open do with undo off 
	(
		sp.controller = max_rol.sph.hemisphere.controller = bezier_float()
	)
)
	
win.showmodeless()

p = win.RectangleToScreen win.ClientRectangle
max_float = newRolloutFloater "Max Floater" (p.width-10) p.height p.left -1000

--win.tag = dotnetmxsvalue #(max_rol)
win.tag = dotnetmxsvalue #(max_rol)

addrollout max_rol max_float 
addrollout hem_rol max_float rolledup:on
--createdialog max_rol p.width p.height p.left p.top bgcolor:white style:#()
--win.tag.value[2] = setOwnerWindow win.handle max_rol.title
win.tag.value[2] = setOwnerWindow win.handle max_float.title

GWL_STYLE 		= -16 
WS_BORDER	   = 0x00800000
WS_DLGFRAME	 = 0x00400000
WS_THICKFRAME   = 0x00040000
WS_POPUP		= 0x80000000
WS_CHILD		= 0x40000000
WS_DISABLED	 = 0x08000000
 
f = ::User32.GetWindowLong win.tag.value[2] GWL_STYLE

f = bit.xor f (WS_BORDER + WS_DLGFRAME + WS_THICKFRAME + WS_CHILD + WS_POPUP)
::User32.SetWindowLong win.tag.value[2] GWL_STYLE f

p = win.RectangleToScreen win.ClientRectangle
::User32.SetWindowPos win.tag.value[2] 0 p.x p.y (win.tag.value[1].width+20) p.height 0
win.Focus()

fn onMove s a =
(
	p = s.RectangleToScreen s.ClientRectangle
	::User32.SetWindowPos s.tag.value[2] 0 p.x p.y (win.tag.value[1].width+20) p.height 0
)
dotnet.addEventHandler win "Move" onMove
fn onResized s a =
(
	p = s.RectangleToScreen s.ClientRectangle
	::User32.SetWindowPos s.tag.value[2] 0 p.x p.y (win.tag.value[1].width+20) p.height 0
)
dotnet.addEventHandler win "Resize" onResized
fn onClosing s a =
(
	s.tag.value[1].close()
)
dotnet.addEventHandler win "Closing" onClosing
  

owner window doesn’t lose focus!

ps. i didn’t have a time to clean it up.

1 Reply

brilliant big D. was wondering if its possible to embed the pflow view inside the viewport. (but i doubt theres a handle to each viewport is there?) i have posted the same in 3d max forum :- http://forums.cgsociety.or g/showthread.php?f=6&t=850606

any help is appreciated thanks