wxwidgets開發組件製做爲ActiveX控件

主要思路:web

在MFC中若是要建立wxwidgets 的窗口爲MFC窗口的子窗口就要把MFC的窗口封裝成wxwindow,即作一個虛擬窗口。同理若是要在wxwidgets上使用MFC窗口並把wxwidgets窗口做爲MFC窗口的父窗口也要把wxwidgets 窗口封裝成MFC窗口作一個虛擬化。由於wxwidgets的窗口在windows系統中最終是調用windows系統函數進行窗口的建立。MFC的窗口也是最終調用windowsAPI進行建立。這使得兩個框架在底層窗口的建立時相同的。windows

具體的建立步驟以下:框架

  1. 經過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控件的朋友有所幫助。
相關文章
相關標籤/搜索