From: Roode, E. <er...@ba...> - 2007-05-04 13:27:24
|
Say I create a dll containing a library of custom controls (written in C++, C#, whatever). How can I use these controls in a Win32::GUI program? Thanks in advance, Eric |
From: Robert M. <rob...@us...> - 2007-05-04 20:45:45
|
Glenn Linderman wrote: > On approximately 5/4/2007 6:25 AM, came the following characters from > the keyboard of Roode, Eric: >> Say I create a dll containing a library of custom controls (written in >> C++, C#, whatever). How can I use these controls in a Win32::GUI >> program? > > Or even say someone else creates such a dll, how can I use it/them? Assuming that this is a "standard" control library that registers the classes that it needs on loading etc., then off the top of my head (no code available right now). You need to (1) Use LoadLibrary to load the DLL (2) call the (internal) Win32::GUI::_new() function as a class constructor, passing in the (Win32) Class name take the control needs as one of the arguments - this in turn calls CreateWindow(). (3) Use SendMessage to send instructions to the control and get information back from it. The Win32::GUI::Scintilla class (Scintilla.pm) should have most of the detail that you need. Rob. -- Robert May Win32::GUI, a perl extension for native Win32 applications http://perl-win32-gui.sourceforge.net/ |
From: Roode, E. <er...@ba...> - 2007-05-07 15:44:39
|
Okay, I've done pretty much what you said: I've loaded the DLL (successfully). I've created a class to represent my control. In that class's new() function, I invoke Win32::GUI->_new. In my main program, I position the control as usual. The control is not rendered properly. Its "text" attribute is displayed on the main window, just as a Label would appear. I get no errors, but no features either. Question: What is the "type" parameter to _new? All the controls in Win32::GUI.pm load constants from deep in the bowels of XS. What should it be for my custom control? For my test control, I used the RoundButton control at http://www.ondotnet.com/pub/a/dotnet/2002/03/18/customcontrols.html?page =3D2 . My perl code to wrap it is as follows: use strict; package RoundButton; use Win32::GUI; use Tie::Hash; our @ISA =3D ('Tie::StdHash'); my $dll =3D Win32::GUI::LoadLibrary('RoundButton.dll') or die "Cannot load dll file"; sub new { my $class =3D shift; my $const =3D Win32::GUI::constant("WIN32__GUI__STATIC", 0); my $self =3D Win32::GUI->_new($const, $class, @_); return $self; } Why did I load Tie::Hash? Because _new() ties its argument class. I don't know why, or what to implement with the tie. Why did I choose WIN32__GUI__STATIC? It's the constant that is used in the Scintilla control. <shrug> My main program is as follows: use strict; use Win32::GUI; use RoundButton; my $mw =3D Win32::GUI::Window->new(-name =3D> 'mainwin', -text =3D> 'RoundButton Test', -height =3D> 200, -width =3D> 300); my $lbl =3D $mw->AddLabel(-name=3D>'lbl', -top =3D> 30, -left =3D> 20, -width =3D> 100, -height =3D> 20, -text =3D> 'Ready.'); my $rb =3D RoundButton->new(-parent=3D>$mw, -left=3D>20, -top=3D>100, -height=3D>60, -width=3D>100, -text=3D>'Howdy'); $mw->Show; Win32::GUI::Dialog; exit; sub mainwin_Terminate { return -1; } Any illumination you can give would be much appreciated.=20 Eric =20 -----Original Message----- From: Robert May [mailto:rob...@us...]=20 Sent: Friday, May 04, 2007 4:45 PM To: Glenn Linderman; per...@li... Cc: Roode, Eric Subject: Re: [perl-win32-gui-users] Using custom controls/widgets Glenn Linderman wrote: > On approximately 5/4/2007 6:25 AM, came the following characters from=20 > the keyboard of Roode, Eric: >> Say I create a dll containing a library of custom controls (written=20 >> in >> C++, C#, whatever). How can I use these controls in a Win32::GUI >> program? >=20 > Or even say someone else creates such a dll, how can I use it/them? Assuming that this is a "standard" control library that registers the classes that it needs on loading etc., then off the top of my head (no code available right now). You need to (1) Use LoadLibrary to load the DLL (2) call the (internal) Win32::GUI::_new() function as a class constructor, passing in the (Win32) Class name take the control needs as one of the arguments - this in turn calls CreateWindow(). (3) Use SendMessage to send instructions to the control and get information back from it. The Win32::GUI::Scintilla class (Scintilla.pm) should have most of the detail that you need. Rob. -- Robert May Win32::GUI, a perl extension for native Win32 applications http://perl-win32-gui.sourceforge.net/ |
From: Robert M. <rob...@us...> - 2007-05-16 22:34:53
|
Roode, Eric wrote: > Okay, I've done pretty much what you said: > > I've loaded the DLL (successfully). > I've created a class to represent my control. > In that class's new() function, I invoke Win32::GUI->_new. > In my main program, I position the control as usual. > > The control is not rendered properly. Its "text" attribute is > displayed on the main window, just as a Label would appear. > I get no errors, but no features either. > > Question: What is the "type" parameter to _new? All the controls > in Win32::GUI.pm load constants from deep in the bowels of XS. > What should it be for my custom control? > > For my test control, I used the RoundButton control at > http://www.ondotnet.com/pub/a/dotnet/2002/03/18/customcontrols.html?page=2 OK, so I think we've had a disconnect on our definition of a 'control library'. That is not a 'standard' win32 control library (at least by my terminology) - it's not a window, with a window class that can be created using CreateWindow() and controlled using SendMessage(). It's some .NET dll. I'm way out of my depth when it comes to using anything above the Win32 API, but from a quick web search, and assuming that your building RoundButton.dll yourself (I couldn't see a download link) - then there may be a way to do it. Sadly I cna't find the particular article I was reading, but the steps appear to go something like this: (1) Create the DLL (you've already done this) (2) Register the DLL as callable via the .NET COM interop layer (there's a tool REGASM to do this, or, I beleive, a tickbox on one of the Visual Studio dialogs that would have the same effect) (3) You might now be able to use the library, using Win32::GUI::AxWindow to host the control. Afraid I can't offer more than that, as I say I'm out of my depth here. Rob. |