From 1f591b278dcf4e1c7c1f36b0cb8ac4a13fe29dc5 Mon Sep 17 00:00:00 2001 From: Zhang Yungui Date: Sun, 19 Feb 2012 20:22:04 +0800 Subject: [PATCH] Add MFC example. --- interface/example/mfcwnd/isimple.h | 16 + projects/msvc/mfcwnd_vc80.vcproj | 376 +++++++++++++++++++++++ projects/msvc/mfcwnd_vc90.vcproj | 376 +++++++++++++++++++++++ projects/swigvc/mfcwnd_vc80.vcproj | 294 ++++++++++++++++++ projects/swigvc/mfcwnd_vc90.vcproj | 294 ++++++++++++++++++ projects/x3py_vc80.sln | 21 ++ projects/x3py_vc90.sln | 21 ++ source/example/mfcwnd/Makefile | 15 + source/example/mfcwnd/mfcwnd.cpp | 64 ++++ source/example/mfcwnd/mfcwnd.h | 39 +++ source/example/mfcwnd/module.cpp | 18 ++ source/example/mfcwnd/swig/Makefile | 12 + source/example/mfcwnd/swig/mfcwnd.i | 14 + source/example/mfcwnd/swig/testmfcwnd.py | 40 +++ 14 files changed, 1600 insertions(+) create mode 100644 interface/example/mfcwnd/isimple.h create mode 100644 projects/msvc/mfcwnd_vc80.vcproj create mode 100644 projects/msvc/mfcwnd_vc90.vcproj create mode 100644 projects/swigvc/mfcwnd_vc80.vcproj create mode 100644 projects/swigvc/mfcwnd_vc90.vcproj create mode 100644 source/example/mfcwnd/Makefile create mode 100644 source/example/mfcwnd/mfcwnd.cpp create mode 100644 source/example/mfcwnd/mfcwnd.h create mode 100644 source/example/mfcwnd/module.cpp create mode 100644 source/example/mfcwnd/swig/Makefile create mode 100644 source/example/mfcwnd/swig/mfcwnd.i create mode 100644 source/example/mfcwnd/swig/testmfcwnd.py diff --git a/interface/example/mfcwnd/isimple.h b/interface/example/mfcwnd/isimple.h new file mode 100644 index 0000000..0d0223b --- /dev/null +++ b/interface/example/mfcwnd/isimple.h @@ -0,0 +1,16 @@ +#ifndef X3_EXAMPLE_ISIMPLE_H +#define X3_EXAMPLE_ISIMPLE_H + +#include + +const char* const clsidSimple = "78d30c77-e0f0-48a3-a489-dd4327759c27"; + +class ISimple : public x3::IObject +{ + X3DEFINE_IID(ISimple); + virtual bool createWnd(size_t hparent, int id) = 0; + virtual size_t getHandle() const = 0; + virtual void showMessage() = 0; +}; + +#endif \ No newline at end of file diff --git a/projects/msvc/mfcwnd_vc80.vcproj b/projects/msvc/mfcwnd_vc80.vcproj new file mode 100644 index 0000000..f25f136 --- /dev/null +++ b/projects/msvc/mfcwnd_vc80.vcproj @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/msvc/mfcwnd_vc90.vcproj b/projects/msvc/mfcwnd_vc90.vcproj new file mode 100644 index 0000000..521a934 --- /dev/null +++ b/projects/msvc/mfcwnd_vc90.vcproj @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/swigvc/mfcwnd_vc80.vcproj b/projects/swigvc/mfcwnd_vc80.vcproj new file mode 100644 index 0000000..d28b640 --- /dev/null +++ b/projects/swigvc/mfcwnd_vc80.vcproj @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/swigvc/mfcwnd_vc90.vcproj b/projects/swigvc/mfcwnd_vc90.vcproj new file mode 100644 index 0000000..4fb6804 --- /dev/null +++ b/projects/swigvc/mfcwnd_vc90.vcproj @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/x3py_vc80.sln b/projects/x3py_vc80.sln index 3ae57e6..49243a7 100644 --- a/projects/x3py_vc80.sln +++ b/projects/x3py_vc80.sln @@ -68,6 +68,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pltempl", "msvc\pltempl_vc8 EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pltempl", "swigvc\pltempl_vc80.vcproj", "{684595D9-1976-4FBA-B1A7-DA603C6E86A3}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mfcwnd", "msvc\mfcwnd_vc80.vcproj", "{9A4EEC89-D344-418A-A790-93CA83A9AEDF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mfcwnd", "swigvc\mfcwnd_vc80.vcproj", "{CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -236,6 +240,21 @@ Global {684595D9-1976-4FBA-B1A7-DA603C6E86A3}.Release|Win32.Build.0 = Release|Win32 {684595D9-1976-4FBA-B1A7-DA603C6E86A3}.Release|x64.ActiveCfg = Release|x64 {684595D9-1976-4FBA-B1A7-DA603C6E86A3}.Release|x64.Build.0 = Release|x64 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Debug|Win32.ActiveCfg = Debug|Win32 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Debug|Win32.Build.0 = Debug|Win32 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Debug|x64.ActiveCfg = Debug|x64 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Debug|x64.Build.0 = Debug|x64 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Release|Win32.ActiveCfg = Release|Win32 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Release|Win32.Build.0 = Release|Win32 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Release|x64.ActiveCfg = Release|x64 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Release|x64.Build.0 = Release|x64 + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}.Debug|Win32.ActiveCfg = Release|x64 + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}.Debug|x64.ActiveCfg = Release|x64 + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}.Debug|x64.Build.0 = Release|x64 + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}.Release|Win32.ActiveCfg = Release|Win32 + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}.Release|Win32.Build.0 = Release|Win32 + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}.Release|x64.ActiveCfg = Release|x64 + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -249,6 +268,7 @@ Global {942F8CF4-51D6-493B-99ED-D84B1E175464} = {FE126499-B277-4F68-8742-7C7016BFE09B} {ECFF677B-AC47-4EAF-AB40-0DE2E214A829} = {FE126499-B277-4F68-8742-7C7016BFE09B} {8472E301-AAB2-469A-AFBB-2C37AB475A18} = {FE126499-B277-4F68-8742-7C7016BFE09B} + {9A4EEC89-D344-418A-A790-93CA83A9AEDF} = {FE126499-B277-4F68-8742-7C7016BFE09B} {7E74A6C5-6A26-445E-B0B0-1E2FCB3D53B1} = {EDD410E7-5031-48A4-AEF2-955D3707E6DA} {A4FC6283-72CB-443D-886C-4B66A495E92C} = {EDD410E7-5031-48A4-AEF2-955D3707E6DA} {C3BFB183-930D-4320-A572-09AE25F8364E} = {EDD410E7-5031-48A4-AEF2-955D3707E6DA} @@ -259,6 +279,7 @@ Global {69FE98EF-8F19-4357-856A-3402EC459D77} = {7E74A6C5-6A26-445E-B0B0-1E2FCB3D53B1} {B2592248-5E51-460D-B7CE-0271799C4527} = {7E74A6C5-6A26-445E-B0B0-1E2FCB3D53B1} {684595D9-1976-4FBA-B1A7-DA603C6E86A3} = {7E74A6C5-6A26-445E-B0B0-1E2FCB3D53B1} + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F} = {7E74A6C5-6A26-445E-B0B0-1E2FCB3D53B1} {71C9ABD3-9DE0-492F-B5E4-55AB51E2E916} = {A4FC6283-72CB-443D-886C-4B66A495E92C} {5F35EECA-EB4D-43F3-BC01-BCDA3EA08B8F} = {A4FC6283-72CB-443D-886C-4B66A495E92C} {64998DFB-1AAE-44E2-AEB4-E2794249AA18} = {C3BFB183-930D-4320-A572-09AE25F8364E} diff --git a/projects/x3py_vc90.sln b/projects/x3py_vc90.sln index 818b776..54055b9 100644 --- a/projects/x3py_vc90.sln +++ b/projects/x3py_vc90.sln @@ -68,6 +68,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pltempl", "msvc\pltempl_vc9 EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pltempl", "swigvc\pltempl_vc90.vcproj", "{684595D9-1976-4FBA-B1A7-DA603C6E86A3}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mfcwnd", "msvc\mfcwnd_vc90.vcproj", "{9A4EEC89-D344-418A-A790-93CA83A9AEDF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mfcwnd", "swigvc\mfcwnd_vc90.vcproj", "{CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -236,6 +240,21 @@ Global {684595D9-1976-4FBA-B1A7-DA603C6E86A3}.Release|Win32.Build.0 = Release|Win32 {684595D9-1976-4FBA-B1A7-DA603C6E86A3}.Release|x64.ActiveCfg = Release|x64 {684595D9-1976-4FBA-B1A7-DA603C6E86A3}.Release|x64.Build.0 = Release|x64 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Debug|Win32.ActiveCfg = Debug|Win32 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Debug|Win32.Build.0 = Debug|Win32 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Debug|x64.ActiveCfg = Debug|x64 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Debug|x64.Build.0 = Debug|x64 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Release|Win32.ActiveCfg = Release|Win32 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Release|Win32.Build.0 = Release|Win32 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Release|x64.ActiveCfg = Release|x64 + {9A4EEC89-D344-418A-A790-93CA83A9AEDF}.Release|x64.Build.0 = Release|x64 + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}.Debug|Win32.ActiveCfg = Release|x64 + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}.Debug|x64.ActiveCfg = Release|x64 + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}.Debug|x64.Build.0 = Release|x64 + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}.Release|Win32.ActiveCfg = Release|Win32 + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}.Release|Win32.Build.0 = Release|Win32 + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}.Release|x64.ActiveCfg = Release|x64 + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -249,6 +268,7 @@ Global {942F8CF4-51D6-493B-99ED-D84B1E175464} = {FE126499-B277-4F68-8742-7C7016BFE09B} {ECFF677B-AC47-4EAF-AB40-0DE2E214A829} = {FE126499-B277-4F68-8742-7C7016BFE09B} {8472E301-AAB2-469A-AFBB-2C37AB475A18} = {FE126499-B277-4F68-8742-7C7016BFE09B} + {9A4EEC89-D344-418A-A790-93CA83A9AEDF} = {FE126499-B277-4F68-8742-7C7016BFE09B} {7E74A6C5-6A26-445E-B0B0-1E2FCB3D53B1} = {EDD410E7-5031-48A4-AEF2-955D3707E6DA} {A4FC6283-72CB-443D-886C-4B66A495E92C} = {EDD410E7-5031-48A4-AEF2-955D3707E6DA} {C3BFB183-930D-4320-A572-09AE25F8364E} = {EDD410E7-5031-48A4-AEF2-955D3707E6DA} @@ -259,6 +279,7 @@ Global {69FE98EF-8F19-4357-856A-3402EC459D77} = {7E74A6C5-6A26-445E-B0B0-1E2FCB3D53B1} {B2592248-5E51-460D-B7CE-0271799C4527} = {7E74A6C5-6A26-445E-B0B0-1E2FCB3D53B1} {684595D9-1976-4FBA-B1A7-DA603C6E86A3} = {7E74A6C5-6A26-445E-B0B0-1E2FCB3D53B1} + {CAA15F15-F0E3-46E8-836A-7BB0A097BF9F} = {7E74A6C5-6A26-445E-B0B0-1E2FCB3D53B1} {71C9ABD3-9DE0-492F-B5E4-55AB51E2E916} = {A4FC6283-72CB-443D-886C-4B66A495E92C} {5F35EECA-EB4D-43F3-BC01-BCDA3EA08B8F} = {A4FC6283-72CB-443D-886C-4B66A495E92C} {64998DFB-1AAE-44E2-AEB4-E2794249AA18} = {C3BFB183-930D-4320-A572-09AE25F8364E} diff --git a/source/example/mfcwnd/Makefile b/source/example/mfcwnd/Makefile new file mode 100644 index 0000000..e9a7ad7 --- /dev/null +++ b/source/example/mfcwnd/Makefile @@ -0,0 +1,15 @@ +ROOTDIR =../../.. +PKGNAME =example +PROJNAME =mfcwnd +CPPFLAGS += -D_AFXDLL + +include $(ROOTDIR)/config.mk + +#INCLUDES += -I$(INTERFACE_DIR)/otherpkg +#LIBS += -L$(LIBPATHFLAG)yourlibpath $(LIBFLAG)yourlibname$(LIBEND) + +ifdef VCBIN +include $(SRCPUB_DIR)/swig/Makefile.swig +else +all clean swig: # skip MFC project +endif diff --git a/source/example/mfcwnd/mfcwnd.cpp b/source/example/mfcwnd/mfcwnd.cpp new file mode 100644 index 0000000..709ba0d --- /dev/null +++ b/source/example/mfcwnd/mfcwnd.cpp @@ -0,0 +1,64 @@ +#include +#include "mfcwnd.h" + +CSimple::CSimple() +{ + m_pwnd = new CSimpleWnd(); +} + +CSimple::~CSimple() +{ + delete m_pwnd; +} + +bool CSimple::createWnd(size_t hparent, int id) +{ + AFX_MANAGE_STATE(AfxGetStaticModuleState()); + CWnd* pParent = CWnd::FromHandle(reinterpret_cast(hparent)); + + return !!m_pwnd->CreateEx(WS_EX_STATICEDGE, NULL, L"Test", + WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), pParent, + id ? id : AFX_IDW_PANE_FIRST); +} + +size_t CSimple::getHandle() const +{ + return reinterpret_cast(m_pwnd->GetSafeHwnd()); +} + +void CSimple::showMessage() +{ + ::MessageBox(m_pwnd->GetSafeHwnd(), L"Hello World MFC.", L"Test", MB_ICONINFORMATION); +} + +//------------------------------------------------ + +CSimpleWnd::CSimpleWnd() +{ +} + +CSimpleWnd::~CSimpleWnd() +{ +} + +BEGIN_MESSAGE_MAP(CSimpleWnd, CWnd) + ON_WM_PAINT() +END_MESSAGE_MAP() + +BOOL CSimpleWnd::PreCreateWindow(CREATESTRUCT& cs) +{ + if (!CWnd::PreCreateWindow(cs)) + return FALSE; + + cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, + ::LoadCursor(NULL, IDC_ARROW), reinterpret_cast(COLOR_WINDOW+1), NULL); + + return TRUE; +} + +void CSimpleWnd::OnPaint() +{ + CPaintDC dc(this); + + dc.TextOut(10, 10, L"Hello World MFC."); +} diff --git a/source/example/mfcwnd/mfcwnd.h b/source/example/mfcwnd/mfcwnd.h new file mode 100644 index 0000000..e702b6d --- /dev/null +++ b/source/example/mfcwnd/mfcwnd.h @@ -0,0 +1,39 @@ +#ifndef X3_EXAMPLE_SIMPLE_IMPL_H +#define X3_EXAMPLE_SIMPLE_IMPL_H + +#include +#include + +class CSimpleWnd : public CWnd +{ +public: + CSimpleWnd(); + virtual ~CSimpleWnd(); + +protected: + virtual BOOL PreCreateWindow(CREATESTRUCT& cs); + +protected: + afx_msg void OnPaint(); + DECLARE_MESSAGE_MAP() +}; + +class CSimple : public ISimple +{ + X3BEGIN_CLASS_DECLARE(CSimple, clsidSimple) + X3DEFINE_INTERFACE_ENTRY(ISimple) + X3END_CLASS_DECLARE() +protected: + CSimple(); + virtual ~CSimple(); + +private: + virtual bool createWnd(size_t hparent, int id); + virtual size_t getHandle() const; + virtual void showMessage(); + +private: + CSimpleWnd* m_pwnd; +}; + +#endif \ No newline at end of file diff --git a/source/example/mfcwnd/module.cpp b/source/example/mfcwnd/module.cpp new file mode 100644 index 0000000..0bec07c --- /dev/null +++ b/source/example/mfcwnd/module.cpp @@ -0,0 +1,18 @@ +#include +#include +#include + +#include "mfcwnd.h" + +XBEGIN_DEFINE_MODULE() + XDEFINE_CLASSMAP_ENTRY(CSimple) +XEND_DEFINE_MODULE_DLL() + +OUTAPI bool x3InitializePlugin() +{ + return true; +} + +OUTAPI void x3UninitializePlugin() +{ +} diff --git a/source/example/mfcwnd/swig/Makefile b/source/example/mfcwnd/swig/Makefile new file mode 100644 index 0000000..1a580a0 --- /dev/null +++ b/source/example/mfcwnd/swig/Makefile @@ -0,0 +1,12 @@ +ROOTDIR =../../../.. +PKGNAME =example +PROJNAME =mfcwnd +CPPFLAGS += -D_AFXDLL + +include $(ROOTDIR)/config.mk + +ifdef VCBIN +include $(SRCPUB_DIR)/swig/Makefile.swig +else +all clean swig: # skip MFC project +endif diff --git a/source/example/mfcwnd/swig/mfcwnd.i b/source/example/mfcwnd/swig/mfcwnd.i new file mode 100644 index 0000000..49b2f26 --- /dev/null +++ b/source/example/mfcwnd/swig/mfcwnd.i @@ -0,0 +1,14 @@ +%module mfcwnd +%{ +#ifndef PLUGIN_NAME +#define PLUGIN_NAME "mfcwnd" +#endif +%} +%include + +%{ +#include +%} + +%include +%template(Simple) x3::Object; diff --git a/source/example/mfcwnd/swig/testmfcwnd.py b/source/example/mfcwnd/swig/testmfcwnd.py new file mode 100644 index 0000000..7cb89b7 --- /dev/null +++ b/source/example/mfcwnd/swig/testmfcwnd.py @@ -0,0 +1,40 @@ +# This example illustrates how MFC UI interfaces can be used from Python. + +import wx +import example.mfcwnd as test + +class MyPanel(wx.Panel): + def __init__(self, parent): + wx.Panel.__init__(self, parent, -1) + self._child = test.Simple("") + + @property + def child(self): + return self._child + + def createWnd(self): + self._child.createWnd(self.Handle, 0) + self._win = wx.PyAxBaseWindow_FromHWND(self, self._child.getHandle()) + self.PostCreate(self._win) + +class MyFrame(wx.Frame): + def __init__(self, parent=None): + wx.Frame.__init__(self, parent, title='Test UI', size=(800,600)) + self.panel = MyPanel(self) + + button = wx.Button(self.panel, 1001, "ShowMessage") + button.SetPosition((15, 15)) + self.Bind(wx.EVT_BUTTON, self.OnShowMessage, button) + + def createWnd(self): + self.panel.createWnd() + + def OnShowMessage(self, event): + self.panel.child.showMessage() + +if __name__=='__main__': + app = wx.App() + frame = MyFrame() + frame.Show() + frame.createWnd() + app.MainLoop()