GUI 经典名库wxWidgets对于按键事件的处理,和同类产品相比,有个小的、但很折磨人的不同之处:如果焦点位于某个控件(子窗体)之上,那么当时发生的 wxKeyEvent事件只发给那个子窗体,而主窗体拦截不到,也无法处理,这在一些时候带来了很大麻烦。我坚信这个功能决不是因为没有必要而被 wxWidgets刻意取消的,这不是“你应该修改程序逻辑”的问题,因为从前用过的VB和Delphi都提供了这种功能,就是主窗体有一个 KeyPreview属性,设置为真之后,主窗体本身就可以先一步得到任何控件上的按键事件,进行处理。
如果安装wxPack就能用,那该是更好的事。他们首先要体验的,是用wxWidgets做出程序来,而不是在编译wxWidgets中遇上一堆问题,然后就没有然后了。
用最新的wxPack,安装了wxWidgets2.8.12,观察库文件,确实该有的都有了。用Code::Blocks12.11中wxWidgets2.8.x向导做出两个测试的程序,却都在运行时发生了内存溢出的问题。分析原因,应该是GCC版本问题。wxPack安装的wxWidgets2.8.12是用GCC4.4.1编译的,而我的CodeBlocks12.11中用GCC4.7.1,溢出不意外。这一点,有网友给出评论,“不用wxpack是对的,wxPack is no longer recommended for use, as it is built with a much older version of GCC.”
下载、编译wxWidgets3.0.0,已经不是什么问题(见前文),只编译了用于生成Debug目标文件版本库文件。
但是用Code::Blocks在编出程序时,却出了问题。
先在Code::Blocks中建立wxWidgets Project,用向导整出个程序来玩,这是刚开始能做的事。但是,Code::Blocks12.11中,最高版本只能建立wxWidgets2.8.x版的应用,编译时,总找不到libwxmsw28ud.a等文件。难怪,这里只有libwxmsw30ud.a。该在Code::Blocks中能够修改设置,不想找了。
建立,wxWidgets3.0.0中的应用,成了需要做的事情。实际上,要运行书中和网络中找到的案例,不能靠向导。
Wxpack环境搭建:
各种步骤弄完之后。我开始测试第一个程序。
5.问题:
就是这个。新建wx程序就会出现的。我没改任何东西。
当我编译的时候,可以进行编译了,但是编译出现50个错误。
如下:
Wxpack编程实例:
求大神们一定要指点下,不然第一个小程序都无法实现,就无法再学习了。
建一个空项目,如图1:
图1
我建的项目,名称为minimal。将项目上的源文件minimal.cpp拷贝到项目所在文件夹中,在codeBlocks中项目名上点右键,选Add file...将这个文件加入项目。文件mondrian.xpm是图标文件,也一并拷贝过去(不做,后面也需要补上)。另外,在文件minimal.cpp上点右键,选properties...,在对话框中将文件的只读属性去掉。加入源文件后的界面如图2所示:
图2
如果这时编译,会有一堆错误,首先面对的问题,编译时找不到需要的头文件。
选菜单setting->Global variables...,保证配置类似图3(根据你安装wxWidgets的目录):
图3
选菜单Project->Build options...,在选项卡Search directories中,设置Compiler,如图4所示:
图4
这时再编译,将不再有语法错误,但一大堆问题,来自于连接环节,问题是找不到库文件。
选菜单Project->Build options...,在选项卡Linker settings中,加入X:\wxWidgets-3.0.0\lib\gcc_dll文件夹中的所有.a文件,如图5所示:
图5
然后再编译,成功!
但是运行程序时,会出现错误,如图6:
图6
按提示来,在X:\wxWidgets-3.0.0\lib\gcc_dll中找到那wxmsw30ud_gcc_custom.dll文件,将其拷贝到项目所在文件夹,看到了期盼的窗口,如图7所示。
图7
出现图6的错误,原因是我在Linker settings加入的是lib\gcc_dll文件夹中的.a文件,这些属于“动态链接库”(这个术语自己百度去吧)。这种方式的好处在于编译速度快,目标代码小,但是在编译好的程序运行时,必须要能找到需要的.dll文件。最简单的办法,就是拷贝.dll文件。