2008年2月9日 星期六

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());

标签: ,


2008年2月8日 星期五

终于将blog迁移完成了

从去年初开始将blog迁移到Blogger上,直到今天,才算终于完成了。

我原来的blog在Linux伊甸园上(巴蛮子的新破茅屋),开始有迁移的想法是在去年初,主要的原因是Linux伊甸园提供的Blog服务经常当机,并且每次出了故障之后,总会有一些文章丢失(这几个月陆续按以前的一些本地“备份”来重新发帖,才发现差不多丢了1/3)。

但一直也不直到迁移到哪里去好,试过blogbus, CSDN, chinaunix,最后基本上觉得Blogger功能上比较适合我这Blog的风格,而且Blogger提供的版面编辑功能还是挺好使的。

但中间又犹豫、反复,一方面因为国内常常无法访问blogspot.com,另一方面otto老大又热情地邀请我回去,我也在试用linuxeden

但最终Blogger的"自定义发布位置"这一功能让我觉得还是采用Blogger了:我可以在其它地方申请一个网站,然后采用ftp/sftp发布方式,将所有文章发布到这里(目前的镜像是 http://bamanzi.inlsd.org/blog ),这样一方面可以解决blogspot.com无法访问的问题,另一方面我可以通过ftp将所有文章备份下来。

不过搬迁过来,文章不会在其它地方出现,访问的人也少了。反正这一年我写得也少了,凑合着过吧。

标签:


2008年1月29日 星期二

《X档案》和《老友记》剧本CHM

在box.net上申请了一个账号,将《X档案》和《老友记》剧本CHM传了上去。

http://public.box.net/bamanzi

这个账号本来是为了上传ScrapBook中保存的文摘才申请的——我在ScrapBook的网站上看见了ScrapBox.net这个扩展的扩展。

网页速度有点慢,但上传、下载还不是太差。

以后一些非技术的东西或者体积比较大点的东西就传到这里吧。技术方面的东西还是在 http://bamanzi.inlsd.org

标签: , ,


2008年1月24日 星期四

pidgin: 让MSN支持发送自定义表情的补丁(附win32版本)

在Planet Debian TW上看见的Jesse提供了一个pidgin补丁版本(Debian sid), 其中MSN协议可以发送自定义表情图标了(原来只能接收),补丁来自http://developer.pidgin.im/ticket/1187

向他询问了一下之后,我编译了一个win32版本:
http://bamanzi.inlsd.org/gnuwin32/pi...-win32.tar.bz2

需要先安装官方的2.3.1

先在主窗口"工具- Smiley"里面配置自定义表情,然后(目前好像得先重启pidgin)就可以在MSN的聊天窗口里使用这些表情了。


标签: ,


2008年1月17日 星期四

pidgin飞信插件的win32版本

感谢gradetwo昨天放出了pidgin上飞信插件的源代码,俺今晚有空,编译了一个win32版本。

pidgin-fetion-0.96-win32.tar.bz2
(可用于pidgin-2.3.1,解压后将libfetion.dll放到x:\Program Files\Pidgin\plugins\下,重启pidgin即可)

代码只需要做一点小修改: fetion-0.96-win32.patch


编译方法:

  1. 先按pidgin网站的win32版本编译 说明编译pidgin. 注意以下几点:
    1. 并不一定需要安装cygwin,cygwin安装起来比较麻烦。其实可以从tcl网站下载一个msys + mingw就可以了;
    2. 主要w32api版本要在3.9以上。老版本在编译pidgin\win32\gtkdocklet-win32.c时会报告BITMAPV5HEADER没有定义;
    3. 如果没有安装perltcl,不一定要按网站上说的那样去下载安装,直接修改libpurple\\plugins\Makefile.mingwpidgin\plugins\Makefile.mingw,注释掉相关行就行了
  2. 在libpurple下解压fetion-0.96的源代码(即存在pidgin-2.3.1/libpurple/fetion目录)
  3. 打上补丁fetion-0.96-win32.patch
  4. 执行make -f Makefile.mingw,编译得到libfetion.dll


标签: , ,


2008年1月12日 星期六

多媒体和即时通讯方面的几个新玩意

这几天发现了多媒体和即时通讯(这两类也算网民们用电脑最普遍的用途吧)方面的几个新玩意:

网络电视GMLive (开发团队blog使用说明)
目前支持MMS, sopcast, nslive等几种流媒体,UI还比较简单

网络视频nslive (LinuxToy上的介绍作者的Blog, 安装方法说明)
上面提到过的一种流媒体。支持可用性上做的不太好,那个安装说明也够难找的。

Flash Player 9.0 (Debian包)
新版本支持Linux下的全屏了(并且支持硬件缩放hardware scaling)

Audacious
喜欢Winamp/XMMS的可以用这个了( XMMS -> BMP -> Audacious,功能界面都差不多,都可以用winamp的skin;BMPx和XMMS2却是另外一条路了)。至于功能方面,id3 tag的乱码还是避免不了的,除非自己改代码;另外我现在看重网络音频的支持了(比如电台或者last.fm),很多时候懒得自己去下载mp3文件。
飞信的pigdin插件 (可以放到$HOME/.purple/plugins/或者/usr/lib/purple-2)
当然是第三方开发的。目前有基本功能:对聊或者发短信。最近几天作者gradetwo改 进很频繁,代码还没有放出来。我已经迫不及待要编译win32版本了:在Windows上时如果MSN、QQ、Google Talk、飞信、V网伴侣这些都打开,机器都没法玩了。也不知道现在这些软件怎么搞的,为了界面漂亮一点点,都要拼图片来做,搞得这些软件好用内存相当严 重。还是用pidgin一统天下好。

MusicTracker
A Pidgin 'now playing' plugin to advertise the songs you are listening to in your status message.
MSN客户端KMess发布1.5正式版本
经过两个pre版本后,KMess终于发布了1.5正式版本,主要解决了文件传输过慢问题,新增了对用户自定义表情图片(emoticons)的发送支持。

标签: , , ,


2008年1月9日 星期三

做了一次系统升级

节前在Debian Package of the Day上看到debfoster的介绍,说是比deborphan可以更进一步清理系统不必要的包,就拉下来玩玩,没想到用它删了一些包之后,使用GNOME时系统老是僵死,除了鼠标箭头,其它啥反应没有(包括Ctl-Alt-Backspace),只能按电源键。

折腾了几日不见起色,干脆就apt-get dist-upgrade再apt-get upgrade了,反正有近半年没做大面积更新了。这次下载了1000多个包,530多M,可折腾了些时间。

结果如下:
总而言之,不太爽,不过系统死机的问题倒是解决了。

标签: , ,


2007年12月28日 星期五

对字符集和编码的一些错误认识

字符集和编码一直很头疼的一块,最近为了搞培训,研究了一下,发现以前确实有很多不明白甚至是错误的认识:
参考文档

标签: ,


2007年12月27日 星期四

Firefox 3上使用旧扩展

目前还有很多插件不支持Firefox 3,如果你实在想用,可以修改下面两个设置:
user_pref("extensions.checkCompatibility", false);
user_pref("extensions.checkUpdateSecurity", false);
这样Firefox升级或者安装新扩展时就不会检查兼容性和签名了(检查扩展的签名是Fx3新增的功能)。不过扩展不一定能正常工作,比如Google工具栏就不成。

可以将这两行加在profile下prefs.js(请先关闭Firefox),也可以在about:config中手工增加这两项。

标签:


2007年12月25日 星期二

Firefox 3上如何添加 del.icio.us 书签

以前我为了几台机器、几个操作系统上书签的同步烦心不已,即使安装了Foxmarks同步器还得留神用哪个覆盖哪个,而Google工具栏提供的书签功能也不太好用。后来开始使用del.icio.us的书签服务,加上del.icio.us Bookmarks扩展,终于很满意了。

Firefox 3出来了beta 1之后,我就基本上开始用新版本了,毕竟很多功能很不错,内存占用比原来少了(也许是目前安装的扩展还比较少),再说反正以后要切的。不过目前还是两个版本都用。

但目前很多扩展都还不支持Firefox 3(而且Firefox 3开始要求对扩展进行签名了,不能象以前那样简单地下载xpi包后自己来改改版本匹配申明就说不定可以使用),有些扩展倒也罢了,但现在del.icio.us 似乎变成必须了 :-)

查看/搜索书签的功能倒简单,只要访问 http://del.icio.us/home 就可以了,网页上也有输入tag进行搜索的功能。

主要的问题是没法方便地添加书签了,以前只要在网上逛,看到不错的地方,按一下Ctrl+D或者点击工具栏的TAG按钮,就有一个对话框出来,当前网页的标题、其他人的tag都显示出来了,并且当前网页选中的文字还可以自动放入书签的说明栏。
del.icio.us

在del.icio.us的帮助中找了一下,发现可以用如下办法: 在书签栏上添加一个书签,其URL是:
javascript:location.href='http://del.icio.us/post?v=4;url='+encodeURIComponent(location.href)+';title='+encodeURIComponent(document.title)
(可以拖这个链接到书签栏,然后自己改名字)

详细的说明在这里: bookmarklet buttons for any browser

但“当前网页选中的文字还可以自动放入书签的说明栏”这一点还不能做到,不太爽。我试验了一下,发现多传一个notes参数就可以了: 在上述URL后面再添加一节:
+';notes='+encodeURIComponent(window.getSelection().toString())

结论: 拖下面这个链接到书签栏就可以了:
post to del.icio.us

标签: ,


2007年12月20日 星期四

找不到python24_d.lib怎么办(VC上编译wxPython)

编译一个wxWidgets内嵌wxPython的示例工程时,编译器说需要python24_d.lib,因为懒得自己重新编译一遍python,在网上找到一个办法: 修改Python\include里面的python.h,把静态库都改成同一个(即将python24_d.lib改成python24.lib),其它.h文件也搜索Py_DEBUG,将两种模式下的处理搞成一致(比如不采用不同的引用计数函数),然后就OK了。

---------------------------------------
(下面是详细说明——我现在是越来越罗嗦了)
这几日在琢磨能不能直接采用wxPython搭建我们的下一版本的界面,各方面看都是我们要找的东西,除了一条: 如何将旧系统兼容进去(旧系统采用MFC+COM+Active Scripting技术搭建)。

于是我想先看看用MFC写的程序能不能集成wxPython,但google了半天没有任何信息,只好退而求其次查找wxWidgets上嵌入wxPython,倒是找到一个例子:
http://svn.wxwidgets.org/viewvc/wx/wxPython/trunk/samples/embedded/

它本来的Makefile是编译debug版的,这就需要python, wxWidgets和wxPython的debug版本动态库,好像网上对于Windows上都没有提供(不象Linux上还有python2.4-dbg, libwxgtk2.6-dbg可供安装),这就意味着必须完全自己来编译,编译时还有unicode,universal一大堆的选项,编译完了还有安装/配置的问题。

我烦了,就编译release版本吧,自己修改Makefile.vc,去掉了调试选项,编译出来了。但将embeded.exe放到wxPython的目录运行,它跟我报怨说版本不匹配,wxPython的是"debug,unicode,Visual C++....",而embeded.exe是"no debug,unicode,Visual C++..."。奇怪,怎么预编译的wxPython居然还是debug版本?

没办法,又回头来编译debug版本,但折腾了半天,最后碰到一个python24_d.lib过不去。看来非得自己编译python不可了。我不死心,又在网上搜了一阵,找到一个办法: 修改Python\include里面的python.h,把静态库都改成同一个,其它.h文件也搜索Py_DEBUG,将两种模式下的处理搞成一致(比如不采用不同的引用计数函数),然后就OK了。

标签: ,


2007年12月11日 星期二

PDF文件的分割与合并

装个pdftk就行了。

分割可以采用分段抽取来搞定:
pdftk wxPIA.pdf cat 114-146 output chapter04.pdf

合并:
pdftk chapter0*.pdf cat output part1.pdf

还可以将A文档的某些页和B文档的某些页拼起来:
pdftk A=one.pdf B=two.pdf cat A1-7 B1-5 A8 output combined.pdf

添加附件:
pdftk chapter01.pdf attach_files ../chapter-01/* output chapter01a.pdf

拆离附件:
pdftk chapter01a.pdf unpack_files output ./chapter-01/

更复杂的应用还是看项目主页上的文章吧。

另外, 这东西用到libgcj,估计部分是用java写的,反正运行起来有点慢。

标签: ,


This page is powered by Blogger. Isn't yours?

订阅 帖子 [Atom]