文档章节

wxwidgets开发组件制作为ActiveX控件

流逝的风
 流逝的风
发布于 2012/04/29 23:21
字数 535
阅读 1273
收藏 2

主要思路:

在MFC中如果要创建wxwidgets 的窗口为MFC窗口的子窗口就要把MFC的窗口封装成wxwindow,即做一个虚拟窗口。同理如果要在wxwidgets上使用MFC窗口并把wxwidgets窗口作为MFC窗口的父窗口也要把wxwidgets 窗口封装成MFC窗口做一个虚拟化。因为wxwidgets的窗口在windows系统中最终是调用windows系统函数进行窗口的创建。MFC的窗口也是最终调用windowsAPI进行创建。这使得两个框架在底层窗口的创建时相同的。

具体的创建步骤如下:

  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主要是为了进行消息循环。

    2.在MFC的ActiveXCtrl窗口中创建系统OnCreate消息,OnCreate消息中的具体代码如下:

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窗口。然后以这个虚拟窗口为我们要创建的窗口的父亲,这样就能创建我们自己需要的窗口了。具体的代码已经分享。   

 3.最后在MFC创建的窗口类ActiveXCtrl的析构函数中完成对wxwidgets窗口的关闭处理。

CFreeChartActiveXCtrl::~CFreeChartActiveXCtrl()
{
	// TODO: 在此清理控件的实例数据。
	m_pApp->OnExit();
	m_pApp->CleanUp();
	wxApp::SetInstance(NULL);
	delete m_pApp;
	wxModule::CleanUpModules();
}

至此一个wxwidgets窗口移植到ActiveX中的工作就完成了。希望对同样需要进行wxwidgets窗口封装成ActiveX控件的朋友有所帮助。

© 著作权归作者所有

流逝的风
粉丝 10
博文 2
码字总数 1107
作品 0
南京
私信 提问
加载中

评论(4)

流逝的风
流逝的风 博主

引用来自“luoagzn”的评论

佩哥,请教一下,我如果wxwidgets创建dll,dll的控件嵌入到主程序的窗体中,应该怎么做呢?下面是我照着网上的代码弄的,有问题,调用dll的控件嵌入到主窗体都会出现访问冲突,应该怎么解决?


我想框架中加入动态库中的GUI,进行插件开发,下面是代码,为什么wxCreateDynamicObject失败?请高手解答,谢谢!

=== LIBRARY: plugin.h ===
// My base class for plugins...

#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include <wx/dynload.h>
#include <wx/dynlib.h>

#if defined(WXUSINGDLL) && (defined(WXMAKING_MY_DLL) ||
defined(WXUSING_MY_DLL))
#if defined(WXMAKING_MY_DLL)
#define WXP_EXPORTED_FROM_APP_TO_PLUGIN WXEXPORT
#elif defined(WXUSING_MY_DLL)
#define WXP_EXPORTED_FROM_APP_TO_PLUGIN WXIMPORT
#endif
#else
#define WXP_EXPORTED_FROM_APP_TO_PLUGIN
#endif

#define WXDLL_ENTRY_FUNCTION() \
extern "C" WXEXPORT const wxClassInfo *wxGetClassFirst(); \
const wxClassInfo *wxGetClassFirst() { \
return wxClassInfo::GetFirst(); \
}

class WXP_EXPORTED_FROM_APP_TO_PLUGIN Plugin: public wxButton
{
DECLARE_ABSTRACT_CLASS(Plugin)

};

IMPLEMENT_ABSTRACT_CLASS(Plugin, wxButton)

===

=== LIBRARY: test_plugin.h ===
// My test plugin...

#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "plugin.h"

class MyPlugin: public Plugin
{
DECLARE_DYNAMIC_CLASS(MyPlugin)

};

WXDLL_ENTRY_FUNCTION();

===

=== LIBRARY: test_plugin.cpp ===

#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "test_plugin.h"

IMPLEMENT_DYNAMIC_CLASS(MyPlugin, Plugin)

===

=== APP: test.cpp ===
// My test app

#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "wx/dynlib.h"

#include "plugin.h"

#ifdef WIN_DLL
#define TEST_PLUGIN (_T("plugins/test_plugin.dll"))
#else
#define TEST_PLUGIN (_T("plugins/test_plugin.so"))
#endif

class MyApp: public wxApp
{
public:
virtual bool OnInit( void );

};

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit( void )
{
wxFrame *frame = new wxFrame( NULL, wxID_ANY, _T("Test") );

wxDynamicLibrary lib( TEST_PLUGIN );
if( !lib.IsLoaded() )
{
fprintf( stderr, "### wxDynamicLibrary: ERROR ### \n" );
}
else
{
fprintf( stderr, ">>> wxDynamicLibrary: ok <<< \n" );

Plugin *but = (Plugin*)
wxCreateDynamicObject( _T("MyPlugin") );
if( but )
{
but->Create( frame, 500, _T("MyPlugin Button") );
}
else
fprintf( stderr, "### wxCreateDynamicObject: ERROR ###
\n" );
}

frame->Show( true );

return true;
}

===

你好 !!对于wxwidgets插件开发我也没有研究过。。不过我想你先要确认一下你的dll文件没有问题。通过正常的方法是用dll中的函数没有问题。然后在试动态加载。。
l
luoagzn
佩哥,请教一下,我如果wxwidgets创建dll,dll的控件嵌入到主程序的窗体中,应该怎么做呢?下面是我照着网上的代码弄的,有问题,调用dll的控件嵌入到主窗体都会出现访问冲突,应该怎么解决?


我想框架中加入动态库中的GUI,进行插件开发,下面是代码,为什么wxCreateDynamicObject失败?请高手解答,谢谢!

=== LIBRARY: plugin.h ===
// My base class for plugins...

#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include <wx/dynload.h>
#include <wx/dynlib.h>

#if defined(WXUSINGDLL) && (defined(WXMAKING_MY_DLL) ||
defined(WXUSING_MY_DLL))
#if defined(WXMAKING_MY_DLL)
#define WXP_EXPORTED_FROM_APP_TO_PLUGIN WXEXPORT
#elif defined(WXUSING_MY_DLL)
#define WXP_EXPORTED_FROM_APP_TO_PLUGIN WXIMPORT
#endif
#else
#define WXP_EXPORTED_FROM_APP_TO_PLUGIN
#endif

#define WXDLL_ENTRY_FUNCTION() \
extern "C" WXEXPORT const wxClassInfo *wxGetClassFirst(); \
const wxClassInfo *wxGetClassFirst() { \
return wxClassInfo::GetFirst(); \
}

class WXP_EXPORTED_FROM_APP_TO_PLUGIN Plugin: public wxButton
{
DECLARE_ABSTRACT_CLASS(Plugin)

};

IMPLEMENT_ABSTRACT_CLASS(Plugin, wxButton)

===

=== LIBRARY: test_plugin.h ===
// My test plugin...

#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "plugin.h"

class MyPlugin: public Plugin
{
DECLARE_DYNAMIC_CLASS(MyPlugin)

};

WXDLL_ENTRY_FUNCTION();

===

=== LIBRARY: test_plugin.cpp ===

#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "test_plugin.h"

IMPLEMENT_DYNAMIC_CLASS(MyPlugin, Plugin)

===

=== APP: test.cpp ===
// My test app

#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "wx/dynlib.h"

#include "plugin.h"

#ifdef WIN_DLL
#define TEST_PLUGIN (_T("plugins/test_plugin.dll"))
#else
#define TEST_PLUGIN (_T("plugins/test_plugin.so"))
#endif

class MyApp: public wxApp
{
public:
virtual bool OnInit( void );

};

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit( void )
{
wxFrame *frame = new wxFrame( NULL, wxID_ANY, _T("Test") );

wxDynamicLibrary lib( TEST_PLUGIN );
if( !lib.IsLoaded() )
{
fprintf( stderr, "### wxDynamicLibrary: ERROR ### \n" );
}
else
{
fprintf( stderr, ">>> wxDynamicLibrary: ok <<< \n" );

Plugin *but = (Plugin*)
wxCreateDynamicObject( _T("MyPlugin") );
if( but )
{
but->Create( frame, 500, _T("MyPlugin Button") );
}
else
fprintf( stderr, "### wxCreateDynamicObject: ERROR ###
\n" );
}

frame->Show( true );

return true;
}

===

西昆仑
西昆仑
佩哥,今天才看到你的文章,不错,收藏了~
双子座
双子座
佩哥在开源中国的处女作啊,顶起来¥¥¥
wxWidgets与其他工具库的比较(下)

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 GTK+ www.gtk.org; http://www.gtkmm.org); Kylix Lazarus Ultimate++ http:...

nardoo
2012/09/06
322
0
《wxWidgets跨平台程序开发》在国内出版

《wxWidgets跨平台程序开发》日前已由机械工业出版社出版,这是国内第一部介绍wxWidgets的中文力作,旨在更好地促进wxWidgets在国内的推广应用,解决了国内学习wxWidgets但却没有系统介绍wxW...

fanfanzhang
2012/12/01
2.1K
7
《wxWidgets跨平台程序开发》在国内出版

《wxWidgets跨平台程序开发》日前已由机械工业出版社出版,这是国内第一部介绍wxWidgets的中文力作,旨在更好地促进wxWidgets在国内的推广应用,解决了国内学习wxWidgets但却没有系统介绍wxW...

fanfanzhang
2012/12/01
83
0
配置winxp+eclispe cdt+WxWidgets 环境时的错误

D:/wxWidgets-2.8.11/build/msw/../../src/common/log.cpp:773: multiple definition of `wxSysErrorMsg(unsigned long)' D:\wxWidgets-2.8.11\lib\gcc_lib/libwxbase28u.a(baselib_log.o):l......

wolf2999
2010/06/23
486
2
wxWidgets3.0.0的静态编译

对于GUI编程,最早使用过VC6的MFC,之后使用过GTK,Java的Swing,前一段时间还摆弄过纯Windows原生的Win32 API,现在则开始折腾wxWidgets,但是这些技术的学习了解并没有做出像样的软件,基本都停留...

棋有此理
2013/12/11
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7 部署 redis 5.0.6 集群

环境 操作系统: CentOS7.7,关闭 firewalld 和 selinux Redis: 5.0.6 master 实例 10.0.4.110:6371 10.0.4.110:6372 10.0.4.110:6373 slave 实例 10.0.4.111:6371 10.0.4.111:6372 10.0.4.1......

俊赛潘安-才比管乐
12分钟前
3
0
怎么录制电脑上视频素材的声音

随着短视频的不断发展人们越来越喜欢利用空闲时间观看一些短视频用以打发零碎的时间,不少人发现这个机遇也匆匆走上制作短视频的道路,在制作短视频时配音是至关重要的,那你知道怎么在视频素...

cenfeng123
21分钟前
4
0
[springboot 开发单体web shop] 6. 商品分类和轮播广告展示

商品分类&轮播广告 因最近又被困在了OSGI技术POC,更新进度有点慢,希望大家不要怪罪哦。 上节 我们实现了登录之后前端的展示,如: 接着,我们来实现左侧分类栏目的功能。 商品分类|Produc...

IsaacZhang
21分钟前
3
0
java 静态代码块,代码块,构造方法执行顺序

回顾一下java的执行顺序 public class Demo { public Demo() { super(); System.out.println("this is Demo"); } static { System.out.println("this is static"); } { System.out.println("......

漫步行者
40分钟前
7
0
滴滴面试题答案思路

1.mysql 1.1.介绍下介绍下innodb的索引类型、数据结构 普通索引,唯一索引,主键索引:也就是聚簇索引,全文索引(FULLTEXT),聚集索引,非聚集索引等。 数据结构B+树: B+树特点 1.矮胖型,...

指尖Coding
43分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部