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:
19
wxPython/demo/dllwidget/Makefile
Normal file
19
wxPython/demo/dllwidget/Makefile
Normal 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
|
32
wxPython/demo/dllwidget/makefile.vc
Normal file
32
wxPython/demo/dllwidget/makefile.vc
Normal 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)
|
||||
|
54
wxPython/demo/dllwidget/test_dll.cpp
Normal file
54
wxPython/demo/dllwidget/test_dll.cpp
Normal 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()
|
82
wxPython/demo/dllwidget/test_prog.py
Normal file
82
wxPython/demo/dllwidget/test_prog.py
Normal 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()
|
Reference in New Issue
Block a user