Added wxDllWidget from Vaclav Slavik which allows wx widgets derived

from wxWindow to be loaded from a C++ .dll (or .so) and be used in a
wxPython program, without the widget having to be SWIGged first.

Various updates for distribs


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12890 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2001-12-06 19:59:37 +00:00
parent d30f093006
commit 4a61305d36
14 changed files with 1218 additions and 5 deletions

View File

@@ -0,0 +1,19 @@
CXX = c++
CXXFLAGS = `wx-config --cxxflags` -fPIC -I.
LDFLAGS = `wx-config --libs`
all: test_prg test_dll.so
test_prg: dllwidget.o test_prg.o
$(CXX) $(LDFLAGS) -o $@ dllwidget.o test_prg.o
test_dll.so: test_dll.o
$(CXX) $(LDFLAGS) -shared -o $@ $<
%.o : %.cpp
$(CXX) -c $(CXXFLAGS) -o $@ $<
clean:
rm -f *.o *.so test_prg

View File

@@ -0,0 +1,32 @@
WXDIR = $(WXWIN)
WXUSINGDLL = 1
PROGRAM = test_dll
OBJECTS = test_dll.obj
!include $(WXDIR)\src\makevc.env
$(PROGRAM).dll : $(OBJECTS)
$(link) @<<
-out:$(PROGRAM).dll
-dll $(LINK_DEBUG_FLAGS) $(WINLINKFLAGS)
$(OBJECTS)
$(WXLIB)
<<
clean:
del $(OBJECTS)
del $(PROGRAM).dll
del $(PROGRAM).exp
del $(PROGRAM).lib
del $(PROGRAM).pdb
test:
@echo -out:$(PROGRAM).dll
@echo -dll $(LINK_DEBUG_FLAGS) $(WINLINKFLAGS)
@echo $(OBJECTS)
@echo $(WXLIB)

View File

@@ -0,0 +1,54 @@
#include <wx/defs.h>
#include <wx/window.h>
#include <wx/msgdlg.h>
#include "../dllwidget.h"
class TestWindow : public wxWindow
{
public:
TestWindow(wxWindow *parent, long style)
: wxWindow(parent, -1)
{
SetBackgroundColour(wxColour("white"));
}
int HandleCommand(int cmd, const wxString& param)
{
if (cmd == 1)
{
SetBackgroundColour(wxColour("red"));
Refresh();
}
if (cmd == 2)
{
SetBackgroundColour(wxColour(param));
Refresh();
}
else if (cmd == 3)
{
wxMessageBox("Message from embedded widget:\n\n" + param);
}
return 0;
}
private:
DECLARE_ABSTRACT_CLASS(TestWindow)
};
IMPLEMENT_ABSTRACT_CLASS(TestWindow, wxWindow)
//DECLARE_DLL_WIDGET(TestWindow)
static int SendCommandToTestWindow(wxWindow *wnd, int cmd, const wxString& param)
{
return wxStaticCast(wnd, TestWindow)->HandleCommand(cmd, param);
}
BEGIN_WIDGET_LIBRARY()
REGISTER_WIDGET(TestWindow)
END_WIDGET_LIBRARY()

View File

@@ -0,0 +1,82 @@
#!/usr/bin/env python
from wxPython.wx import *
from wxPython.dllwidget import wxDllWidget, wxDllWidget_GetDllExt
#----------------------------------------------------------------------
class TestFrame(wxFrame):
def __init__(self):
wxFrame.__init__(self, None, -1, "Test wxDllWidget")
menu = wxMenu()
menu.Append(101, "Send command &1")
menu.Append(102, "Send command &2")
menu.Append(103, "Send command &3")
menu.AppendSeparator()
menu.Append(110, "E&xit")
mb = wxMenuBar()
mb.Append(menu, "&Test")
self.SetMenuBar(mb)
EVT_MENU_RANGE(self, 101, 109, self.OnSendCommand)
EVT_MENU(self, 110, self.OnExit)
panel = wxPanel(self, -1)
panel.SetFont(wxFont(12, wxSWISS, wxNORMAL, wxBOLD))
st = wxStaticText(panel, -1,
"The widget below was dynamically imported from\n"
"test_dll.dll or test_dll.so with no prior knowledge\n"
"of it's contents or structure by wxPython.")
self.dw = dw = wxDllWidget(panel, -1,
"test_dll" + wxDllWidget_GetDllExt(),
"TestWindow",
size=(250, 150))
# The embedded window is the one exported from the DLL
print dw.GetEmbeddedWindow().GetClassName()
# This shows that we can give it a child from this side of things.
# You can also call any wxWindow methods on it too.
wxStaticText(dw.GetEmbeddedWindow(), -1,
"Loaded from test_dll...", pos=(10,10))
sizer = wxBoxSizer(wxVERTICAL)
sizer.Add(wxStaticLine(panel, -1), 0, wxGROW)
sizer.Add(st, 0, wxGROW|wxALL, 5)
sizer.Add(dw, 1, wxGROW|wxALL, 5)
panel.SetSizer(sizer)
panel.SetAutoLayout(true)
sizer.Fit(self)
sizer.SetSizeHints(self)
def OnExit(self, evt):
self.Close()
def OnSendCommand(self, evt):
ID = evt.GetId() - 100 # use the menu ID as the command
param = ""
if ID == 2:
dlg = wxTextEntryDialog(self, "Enter a colour name to pass to the embedded widget:")
if dlg.ShowModal() == wxID_OK:
param = dlg.GetValue()
dlg.Destroy()
self.dw.SendCommand(ID, param)
#----------------------------------------------------------------------
if __name__ == "__main__":
app = wxPySimpleApp()
frame = TestFrame()
frame.Show(true)
app.MainLoop()