<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><blockquote type="cite" class=""><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">Mac Programmer a écrit :</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">> (1) How does one create a true cross-platform custom control, meaning</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">>  a control that functions both with WinForms and Cocoa?</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">As others have tried and discovered, you really can't.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">> It appears as though in the .Net world most custom controls are </font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">> UserControl descendants, which would apparently mean that the custom </font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">> control is WinForms-only. Is there some other way?</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">Since UserControl relies entirely on the Win32 APIs to draw themselves,</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">and Cocoa has its own way of "talking to the metal", I would say that it</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">is highly unlikely.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">If you then consider that the Cocoa UI is so much more sophisticated in</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">the facilities it provides, with things like Core Animation, you would</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">have to ask how would you include the functionality of one framework in</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">a control based on the other?</font></div></blockquote><br><div>Actually, that's what WinForms on Mac does, calling functions in the Carbon framework, so I don't know why it would be any different with Cocoa.</div><div><br></div><div>But really, if cross-platform custom controls are not the norm, how then is Mono a useful cross-platform tool? Most of my projects involve custom controls, but if using them means WinForms, then Mono starts looking more like a Windows emulator and maybe it would make more sense to tell users just to get Windows and run the real thing.</div><div><br></div><div><br></div><div><blockquote type="cite" class=""><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica"> From the start, Windows RAD design tools have always "encouraged" the </font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">writing of all your code in the form class. <br></font></div></blockquote><br></div><div>Not sure I would assign even a small part of the blame on RAD tools like Delphi. It's pretty easy to prevent this from happening. Just include a requirement for a project that says something like "Core functionality/calculating engine/whatever must also be available to use in a console app, DLL, COM Automation server, Web app (pick any one)". That will pretty much sever the head from the body.</div><div><br></div><div><br></div><div><blockquote type="cite" class=""><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">The Controller class will only resemble Winforms classes if you are used </font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">to writing your event handlers on the form class. We have been using the </font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">MVP pattern, in C#, for a number of years now and our forms are purely </font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">visual design, there is absolutely no interaction code in the form </font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">classes; that is taken care of by the Presenter and Interactor classes </font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">that are part of our frameworks.</font></div></blockquote><br></div><div>Here's some nib-less code that creates the controls rather than nibbing them out of the ether.</div><div><br></div><div><div>type</div><div><div>  MainForm = class(Cocoa.Object)</div><div>  private</div><div>    mainWindow : Cocoa.Window;</div><div>    button1 : Cocoa.Button;</div><div><br></div><div>    method button1_Click(sender: System.Object; e: System.EventArgs);</div><div>  public</div><div>    method InitializeComponent;</div><div>  end;</div><div><br></div><div><br></div><div>implementation</div><div><br></div><div><br></div><div>method MainForm.InitializeComponent; </div><div>begin</div><div>  mainWindow := new Cocoa.Window(new Cocoa.Rect(200, 200, 400, 300),</div><div>                                 WindowStyle.Resizable or </div><div>                                 WindowStyle.Closable or </div><div>                                 WindowStyle.Titled,</div><div>                                 BackingStoreType.Buffered, True);</div><div>  mainWindow.Title := 'Hey, there!';</div><div><br></div><div>  button1 := new Cocoa.Button(new Cocoa.Rect(200, 20, 82, 32));</div><div>  button1.BezelStyle := BezelStyle.Rounded;</div><div>  button1.Title := 'Blank';</div><div>  button1.Action += new System.EventHandler(button1_Click);</div><div><br></div><div>  mainWindow.View.AddSubView(button1);</div><div>  mainWindow.Show();</div><div>end;</div><div><br></div><div><br></div><div>method MainForm.button1_Click(sender: System.Object; e: System.EventArgs);</div><div>begin</div><div>  button1.Title := 'Pushed';</div><div>end;</div><div><br></div></div></div><div><br></div><div>Thanks.</div><div><br></div><div>-Phil</div><div><br></div></body></html>