王薯熟
普通会员
发贴: 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么?
<---- 以上言论仅代表本人立场 ---->
__________________
……在许多种类的动物中,由于雄性争夺雌性而发生的争斗,往往使我们的养禽场涂上血迹。 |
|