主要思路:web
在MFC中若是要建立wxwidgets 的窗口爲MFC窗口的子窗口就要把MFC的窗口封裝成wxwindow,即作一個虛擬窗口。同理若是要在wxwidgets上使用MFC窗口並把wxwidgets窗口做爲MFC窗口的父窗口也要把wxwidgets 窗口封裝成MFC窗口作一個虛擬化。由於wxwidgets的窗口在windows系統中最終是調用windows系統函數進行窗口的建立。MFC的窗口也是最終調用windowsAPI進行建立。這使得兩個框架在底層窗口的建立時相同的。windows
具體的建立步驟以下:框架
經過MFC嚮導自動建立一個ActiveX控件工程。在自動生成的控件ActiveXCtrl類構造函數中添加以下代碼:函數
int argc = 0; char ** argv = NULL; m_pApp = new FreeChartApp(); wxApp::SetInstance(m_pApp); wxEntryStart(argc,argv); m_pApp->OnInit();
構造這個wxwidgets的App主要是爲了進行消息循環。this
2.在MFC的ActiveXCtrl窗口中建立系統OnCreate消息,OnCreate消息中的具體代碼以下:spa
int CFreeChartActiveXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here RECT rectActiveX; this->GetWindowRect(&rectActiveX); m_pActiveXWindow = new wxWindow(); // We create a dummy window m_pActiveXWindow->SetHWND((WXHWND)this->m_hWnd); // We set the ActiveX HWND m_pActiveXWindow->AdoptAttributesFromHWND(); wxGetApp().SetTopWindow(m_pActiveXWindow); m_chartPanel = new wxChartPanel(m_pActiveXWindow,wxID_ANY,NULL,wxPoint(0,0),wxSize(rectActiveX.right - rectActiveX.left, rectActiveX.bottom - rectActiveX.top)); wxBoxSizer* boxSizer = new wxBoxSizer( wxVERTICAL ); m_pActiveXWindow->SetSizer(boxSizer); boxSizer->Add(m_chartPanel, 1, wxALL|wxGROW); //m_chartPanel->SetChart(CreateBarChart()); return 0; }
在OnCreate消息中獲取MFC ActiveXCtrl窗口的句柄,根據獲取的ActiveXCtrl窗口的句柄進行wxwidgets窗口的構建及把ActiveXCtrl窗口虛擬成wxwidgts窗口。而後以這個虛擬窗口爲咱們要建立的窗口的父親,這樣就能建立咱們本身須要的窗口了。具體的代碼已經分享。 code
3.最後在MFC建立的窗口類ActiveXCtrl的析構函數中完成對wxwidgets窗口的關閉處理。orm
CFreeChartActiveXCtrl::~CFreeChartActiveXCtrl() { // TODO: 在此清理控件的實例數據。 m_pApp->OnExit(); m_pApp->CleanUp(); wxApp::SetInstance(NULL); delete m_pApp; wxModule::CleanUpModules(); }至此一個wxwidgets窗口移植到ActiveX中的工做就完成了。但願對一樣須要進行wxwidgets窗口封裝成ActiveX控件的朋友有所幫助。