wxWidgets初学者导引(3)——wxWidgets应用程序初体验
3 wxWidgets应用程序初体验
本文中所有的体验,在Code::Blocks中进行。
为了在Code::Blocks中编译运行C++写的wxWidgets程序,需要再做些设置。
首先,需要在环境变量里添加一个wxWidgets根目录环境变量。设置方法类似于2.3中设置PATH变量的方法。在Win7中,右击桌面上的“计算机”图标,选菜单中的“属性”,在“系统属性”对话框中,完成如下图从1到5的一系列操作。新增的变量命名为wxwin,值为X:\wxWidgets-3.0.0。
接下来的设置要在Code::Blocks中进行。
打开Code::Blocks,选择菜单Settings->Global Variables…,在设置default下新建立一个wx变量,在Build-in fields:下,base中填入“${wxwin}”(wxwin是刚才设置好的一个变量),include中填入“${wxwin}\include”,lib中填入“${wxwin}\lib”,这些都是开发中需要用到的“环境”中的一部分。
3.1 由“空项目”建立和运行GUI应用程序
下面将“白手起家”,由建立“空项目”开始,做一个简单的应用。程序改编自在线教程《wxWidgets tutorial》(http://zetcode.com/gui/wxwidgets/)的“First programs in wxWidgets”部分的第一个程序。这个教程,将作为建议学习方案中的主教程之一。
3.1.1 建立项目
建立项目的过程是:
(1)通过菜单“File”->“New”->“Project…”,选择“Empty project”建一个空项目
(2)点击“go”按钮后,有一个欢迎界面,点击“next”,出现下图,填入项目名。我建立的项目名称为wxTest。
(3)点击“next”后,要求选择编译器及生成的目标文件类型,照下图选择
(4)点击“Finish”后,将生成一个空项目,如图
(5)点击菜单File->New->File...为项目新建一个源程序文件。在连续出现的几个对话框中,选择要增加的文件类型是“C/C++ source”(即源文件),再一个对话框中选择语言是“C++”。接着,在下图所示的对话框中,给出带完整路径的源文件名(本例中用main.cpp),注意将Debug复选框选中。
(6)点击“Finish”后,将下面的源程序输入(或粘贴)到文件main.cpp中。
- #include <wx/wx.h>
- class Simple : public wxFrame
- {
- public:
- Simple(const wxString& title);
- };
- Simple::Simple(const wxString& title)
- : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
- {
- Centre();
- }
- class MyApp : public wxApp
- {
- public:
- virtual bool OnInit();
- };
- IMPLEMENT_APP(MyApp)
- bool MyApp::OnInit()
- {
- Simple *simple = new Simple(wxT("Simple"));
- simple->Show(true);
- return true;
- }
加入了源代码之后的项目如下图所示:
可以暂时不考虑程序中的语句是什么意思。能完成运行程序的完整过程,是我们当前的任务。能运行程序了,后面再看“门道”。
下面将对这个项目进行编译,进而看到运行结果。
3.1.2 编译和运行项目
选择菜单“Build”中的“Build”选项(或者工具栏中的相应按钮)对项目进行编译、连接。程序第一行即出现错误。错误提示是:
- fatal error: wx/wx.h: No such file or directory
也就是说,找不到要包含的头文件wx\wx.h。
这需要设置“搜索路径”解决。选菜单Project->Build options...,在选项卡Search directories中,设置Compiler。通过“Add”增加目录X:\wxWidgets-3.0.0\lib\gcc_dll\mswud和X:\wxWidgets-3.0.0\include,结果如下图所示:
接着Build,将不再有语法错误。
出现的一大堆错误提示,来自于连接环节,问题是找不到库文件。
选菜单Project->Build options...,在选项卡Linker settings中,需要加入要连接的“目标文件”。如图所示,通过Add按钮加入X:\wxWidgets-3.0.0\lib\gcc_dll文件夹中的所有.a文件(实际上,选择其中几个需要的就可以了。因为不知道究竟需要哪几个,全选是最省事的办法):
然后再编译,0 errors, 0 warnings。成功!
但是运行程序时,会出现错误,如下图:
按提示来,在X:\wxWidgets-3.0.0\lib\gcc_dll中找到wxmsw30ud_gcc_custom.dll文件,将其拷贝到项目所在文件夹,再运行,就看到了期盼的窗口,如图所示。
出现上面的运行错误,原因是我在Linker settings加入的是lib\gcc_dll文件夹中的.a文件,这些属于“动态链接库”(这个术语自己百度去吧)。这种方式的好处在于编译速度快,目标代码小,但是在编译好的程序运行时,必须要能找到需要的.dll文件。最简单的办法,就是拷贝.dll文件。
这个程序很短,结果也只是一个空空的窗口,但是作为掌握编译、运行窗口程序的案例,却也是足够的了。
以上的设置和文件复制,“有经验”之后可以提前完成。上面的描述方法,是考虑到希望读者对各个环节的问题,能多些感觉。
3.2 利用Code::Blocks的向导建立应用
另一种在Code::Blocks中建立wxWidgets Project的方法,是通过“向导”开发应用。这种方法用得不是很多,可以作为了解。
本节下面的材料,非作者原创,整理自http://www.cnzui.com/archives/962。
利用向导开发的具体步骤是:
(1)通过菜单“File”->“New”->“Project…”,选择最后面的wxWidgets project。
(2)点击“Go”进入工程配置向导,首先会出来一个欢迎窗口,直接next后,选择安装好wxWidgets版本。
注:Code::Blocks 13.12中,已经有了对wxWidgets 3.0.x的支持。需要选对版本,否则能够继续生成应用程序,但是不能正确连接和运行。
(3)按“Next”,然后输入项目名“wxtest”,选择保存项目的文件夹。
(4)继续“Next”,输入作者和及一些版权说明信息。
(5)继续“Next”,选择GUI设计工具和程序类型,用wxSmith和Dialog based。
(6)按“Next”,接下来的就是wxWidgets环境的一些设置了,这里我们输入刚才设置的wxWidgets根目录,直接填入“$(#wx)”就可以了。
(7)按“Next”,这里我们看到默认就是选择了MinGW编译器了,下面的我们只做Debug版本,所以只选上“Create “Debug” configuration”。
(9)继续“Next”,接下来要选择怎么使用wxWidgets库,这里根据你编译的wxWidgets库是什么样的来。
后注:在wxWidgets Library Setting部分,三个勾都打上。这样,只要在编译时SHARED=1,满足了Use wxWidgets DLL,使用动态链接接库的要求;用MONOLITHIC=1,满足了wxWidgets is built as a monolithic library,构建单一库;而UNICODE=1,满足支持宽字符串Enable unicode。也就是说,当初编译wxWidgets时用:mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=debug和mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=release,就可以满足生支供调试和发布的代码两项要求。
(10)按“Next”,因为选择了“Configure Advanced Options”,所以要对使用wxWidgets库做更多的设置,这里我们选上我们使用lib方式调用(要求编译wxWidgets时用SHARED=0参数,生成了静态库文件)。
(11)按“Next”进到最后一步,我们选择需要用到的库,不知道的话全部选上。
(12)点击“Finish”,工程随即建立成功。
这时可以查看项目中自动生成的文件,其中有.cpp的源文件,也有.h的头文件。再细读,和3.1中输入的程序长得差不多。
其实,向导的作用,就是通过一系列的选择,由向导程序自动生成应用程序。
如上步骤创建的应用程序的运行的结果是:
在编译和运行时,都有可能出现一些错误。这一般不是程序本身的问题,而是Code::Blocks的编译环境和运行的支持文件不全而造成的。
请参阅3.1.2小节,可能会帮助你排除问题,让程序正确运行。
http://blog.csdn.net/sxhelijian/article/details/26164181
wxWidgets初学者导引(3)——wxWidgets应用程序初体验的更多相关文章
- wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验
wxWidgets刚開始学习的人导引全文件夹 PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wx ...
- wxWidgets初学者导引(2)——下载、安装wxWidgets
wxWidgets初学者导引全目录 PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxSmith ...
- 微信小程序初体验,入门练手项目--通讯录,部署上线(二)
接上一篇<微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器>:https://www.cnblogs.com/chengxs/p/9898670.html 开发微信小程序最尴尬 ...
- 【尝新】微信小程序初体验
文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/?t=1474644089434 根据文档地址中下载微信开发工具后,按照文档指引可以创建一个快速体验的小d ...
- 微信小程序初体验(上)
版权声明:本文由练小习原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/204 来源:腾云阁 https://www.qclo ...
- Win手机安卓程序初体验
老大说快看博客园,Windows手机可以装安卓程序了. 啊,真的么?可以在我的撸妹1520上愉快的玩COC了么?我还可以愉快的看小说,不对,是听小说,哈哈,安卓君的三千万程序兵,等着老夫来一一临幸你们 ...
- 微信小程序初体验--封装http请求
最近看了一下微信小程序,大致翻了一下,发现跟angular很相似的,但是比angular简单的很多具体可参考官方文档 https://mp.weixin.qq.com/debug/wxadoc/dev ...
- wx小程序初体验
小程序最近太火,不过相比较刚发布时,已经有点热度散去的感觉,不过这不影响我们对小程序的热情,开发之前建议通读下官网文档,附链接:https://mp.weixin.qq.com/debug/wxado ...
- 微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器(一)
内容: 一.前言 二.相关概念 三.开始工作 四.启动项目起来 五.项目结构 六.设计理念 七.路由 八.部署线上后端服务 同步交流学习社区: https://www.mwcxs.top/page/4 ...
随机推荐
- leetcode-combination sum and combination sum II
Combination sum: Given a set of candidate numbers (C) and a target number (T), find all unique combi ...
- HDU 1425 sort hash+加速输入
http://acm.hdu.edu.cn/showproblem.php?pid=1425 题目大意: 给你n个整数,请按从大到小的顺序输出其中前m大的数. 其中n和m都是位于[-500000,50 ...
- CleanCode代码整洁之道培训总结(2015-03-14)
为期四天的CleanCode培训时间非常短.非常难准确掌握一些知识.但让我对代码有了一个又一次的认识和启示:之前也有看过设计模式.重构之类的书,看完之后也有一些感触,过后在写代码中还是不能应用进来,事 ...
- js进阶 12-3 如何实现元素跟随鼠标移动
js进阶 12-3 如何实现元素跟随鼠标移动 一.总结 一句话总结:获取鼠标位置,将鼠标位置设置为元素偏移即可. 1.用什么事件获取鼠标位置? 用mousemove可以获取鼠标移动的时候的位置 $(d ...
- POJ 1287 Networking (ZOJ 1372) MST
http://poj.org/problem?id=1287 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=372 和上次那题差 ...
- BZOJ 1695 [Usaco2007 Demo]Walk the Talk 链表+数学
题意:链接 方法:乱搞 解析: 出这道题的人存心报复社会. 首先这个单词表-先上网上找这个单词表- 反正总共2265个单词.然后就考虑怎么做即可了. 刚開始我没看表,找不到怎么做,最快的方法我也仅仅是 ...
- zookeeper无法启动"Unable to load database on disk"
自己的虚拟机集群.一次强制关机后,发现slave2的zookeeper起不来了 http://blog.csdn.net/ashic/article/details/47088299 下午5点29:5 ...
- activiti自己定义流程之整合(五):启动流程时获取自己定义表单
流程定义部署之后,自然就是流程定义列表了,但和前一节一样的是,这里也是和之前单独的activiti没什么差别.因此也不多说.我们先看看列表页面以及相应的代码,然后在一步步说明点击启动button时怎样 ...
- 通过binlog日志统计dml语句,找出操作频繁的表
mysqlbinlog --no-defaults --base64-output=decode-rows -v -v mysql-bin.000002 |awk '/###/{if($0~/UPDA ...
- 小强的HTML5移动开发之路(40)——jqMobi中实践header定义的几种方式
一.定义全局的header 这个header是所有panel默认的header,需要在<div id="afui">内部,也就是和<div id="co ...