找回密码
 注册创意安天

[转]wxWidgets和MFC混合编程

[复制链接]
发表于 2009-7-30 15:43 | 显示全部楼层 |阅读模式
王薯熟
普通会员

发贴: 17
积分: 0
来自:
注册日期: 2008-01-18
  发表时间: 2008-02-26 11:27:46  

--------------------------------------------------------------------------------
wxWidgets和MFC混合编程

很多文章都讲到了将MFC程序迁移到wxWidgets上(首先要读的也许是IBM developerWorks上这篇 将MFC应用程序移植到Linux),但对于一个比较大的程序,要一下子完成移植也显得有些艰巨。所以我在琢磨有没有可能在一个程序中同时使用这两种技术(同时我看中了wxWidgets上使用wxPython时给应用程序带来的可扩展性,有兴趣的可以查看wxPython中的这个embed示例)。

wxWidgets的代码库中倒是有一个wx和MFC混合的例子(发布出来的2.6的代码包里面好像没有,2.8才有),它演示了如何在一个程序中分别有wx和MFC的窗口(分属于wxFrame和CFrameWnd类)。

但它没有解答的问题是:怎样将一个wx的控件放到MFC上面去,或者反过来。

在这个例子中,如果你想将wx的窗口作为应用程序开始时显示的窗口,就需要这个:
m_pMainWnd = new CDummyWindow((HWND) wxTheApp->GetTopWindow()->GetHWND());
如果你了解MFC对窗口的封装,就知道它基本没有自己的东西,CWnd这些类基本上没有自己的数据成员,基本上都是调用Windows API(只是把那些API中的HWND参数给省略了。所以任何一个Windows桌面上的窗口,要体现为一个CWnd类对象是很容易的,只需要调用CWnd::FromHwnd()或者CWnd::Attach()就可以了,示例中的CDummyWindow就是这样做的。基于这样的思路,我们很容易把其它的wx控件通过CDummyWindow放到MFC控件中去。
wxTreeCtrl * wxtree = new wxTreeCtrl(.....)
CDummyWindow *dummy = new CDummyWindow((HWND)wxtree->GetHWND());
dummy->SetParent(this);

我们需要其实不要CDummyWindow也没有问题,只要这样:
wxTreeCtrl * wxtree = new wxTreeCtrl(....)
::SetParent(HWND)wxtree->GetHWND(), m_hWnd);
但这里有另外一个问题: 创建一个wxWindow对象时是必须给出一个parent的,而这个parent又必
必须是wxWindow类型(除非为NULL)。

反过来要将MFC的东西放到wx上面就可以那么好运了,虽然也可以用上面这一招将MFC的控件显示出来,
但这些控件低于wx来说是透明的,你没法利用到wxSplitterWindow的分割功能,没法利用上各种layout manager/sizer。

在wxWidgets For MFC Programmers(from wxWidgets Wiki)中讲述了如何将一个CWnd转换为wxWindow对象:

wxWindow * win = new wxWindow();
win->SetHWND((WXHWND)hWnd);
win->AdoptAttributesFromHWND();
win->Reparent(wxGetApp().GetTopWindow());
<---- 以上言论仅代表本人立场 ---->



__________________


我的名字是---各位同学请跟我读---:王~~薯~~熟~~



   

Liveck
普通会员

发贴: 17
积分: 0
来自:
注册日期: 2007-06-13
  发表时间: 2008-05-10 09:45:04  

--------------------------------------------------------------------------------
顶wx还是很好用的咩
<---- 以上言论仅代表本人立场 ---->


   

不累的王

普通会员

发贴: 339
积分: 0
来自:
注册日期: 2006-05-26
  发表时间: 2008-05-11 18:10:23  

--------------------------------------------------------------------------------

WX……还行吧,跨平台,社区也挺火

WX的缺点就是用了太多宏,学了MFC一些拧巴的东西

Qt的类之间的继承关系更好一些。


<---- 以上言论仅代表本人立场 ---->



__________________


  “……机器人罗诺,现在我要对你下达最新指令了。”
  “是,主人。我都等了三万年了呢。”
  “你还记得回地球的航路吧?”



   

Liveck
普通会员

发贴: 17
积分: 0
来自:
注册日期: 2007-06-13
  发表时间: 2008-05-11 22:12:08  

--------------------------------------------------------------------------------
wx也是在不断的改进,现在已经比以前好多了吧……
MFC的风格已经少了一点点了,嘿嘿
<---- 以上言论仅代表本人立场 ---->


   

神经病浪游者
普通会员

发贴: 19
积分: 0
来自:
注册日期: 2006-11-15
  发表时间: 2008-05-12 09:25:38  

--------------------------------------------------------------------------------

如果不是版权有许多问题的话,我宁愿用Qt,不过,你们试过在Windows下面编译Qt么?

<---- 以上言论仅代表本人立场 ---->



__________________
……在许多种类的动物中,由于雄性争夺雌性而发生的争斗,往往使我们的养禽场涂上血迹。
您需要登录后才可以回帖 登录 | 注册创意安天

本版积分规则

Archiver|手机版|小黑屋|创意安天 ( 京ICP备09068574,ICP证100468号。 )

GMT+8, 2024-11-18 09:48

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表