wxwidgets如何使用 wxwidgets开发界面

wxwidgets  时间:2021-07-23  阅读:()

wxwidgets用vc编译好还是gcc比编译好

谁让这个世界有很多平台,很多编译器呢。





  既然用vs何必用mignw?   一般你用wxWidgets,那首先确定在哪个OS平台上使用?Windows,Linux,Mac OS X.....   然后再考虑在这个OS上该选用何种编译器。





  最后考虑选什么IDE   所谓的跨平台也只是在源码层级上,所以才需要在特定平台上使用特定的编译器重新构建库   BTW,就算同一系列编译器,也不一定二进制兼容的。







  C/C++感兴趣的,欢迎来百度codeblocks吧玩

wxwidgets程序出错

内存不能为read或者written的错误,一般而言是越界非法访问的问题。

而且我觉得吧,编译的问题和用哪个IDE是没关系的,关键在你使用的编译器和库版本。

检查2.8的bug说明和你所使用的库的版本编译说明。

如果还是无法解决,那么用内存检测工具检查吧。

提示:你可以重点看看使用了wx内置数据结构的地方,和stl有些差别,容易造成问题。

如何搭建mingw,codeblock和wxwidgets环境

Blocks + wxWidgets两个同是支持跨平台的IDE和框架,使得跨平台的编程非常方便。

然而Code::Blocks虽然包含了对wxWidgets的支持,但是却没有包含wxWidgets的构建环境,我们必须手动进行配置。

如何隐藏wxwidgets控件

如果要实现动态的显示/隐藏控件的功能,当调用了show/hide之后,必须使得窗口大小变化才会真正生效。

但是在往wxSizer中添加控件时为其指定了wxRESERVE_SPACE_EVEN_IF_HIDDEN属性,则不需要改变窗口大小,就能实时地动态显示/隐藏该控件。

如何使用 wxwidgets开发界面

wxWidgets是一个跨平台的软件开发包。

它诞生于1992年,最初的名子是wxWindows,但由于Microsoft的抗议,在2004年改名为wxWidgets。

它最初是被设计成跨平台的GUI软件开发包,但后来随着越来越多的人参与进来,为wxWidgets加入了许多非GUI的功能,如多线程(MultiThread)、网络(Network)等。

并且从最初的只支持C++语言,逐渐发展成为支持数种语言(如Python、Perl、C#、Basic等)。

因此,现在的wxWidgets已经不再是单纯的跨平台的GUI软件开发包,而是一个可以支持多种操作系统平台的能够在多种语言中使用的通用跨平台软件开发包。

由于wxWidgets最开始是为C++而设计的,因此,本文主要讨论了wxWidgets在C++中的使用。

为什么选择wxWidgets? 目前支持C++的软件开发包非常多,比较有名的除了wxWidgets外,还有一些其它的软件开发包,如MFC、QT、ACE等。

即然有这么多开发包,那么我们为什么要使用wxWidgets呢?在给出答案之前,让我们首先来看一看上述的三种软件开发包的特性。

1. ? ? ? MFC MFC是Microsoft提供的软件开发包。

MFC虽然十分强大,但它只能运行在Windows下运行。

而且它是收费的。

2. ?QT QT是由Trolltech 公司开发的一套跨平台软件开发包。

它和wxWidgets类似,但是QT只在linux下免费,而在Windows或Unix下使用QT要向Trolltech公司支付版权费。

3. ?ACE ACE虽然是免费开源的,但是它没有提供GUI功能。

? ? 从以上三个软件开发包可以看出,它们虽然有各自的优势,但是它们或多或少地都会使开发受到限制。

而使用wxWidgets将不会有以上所述的问题。

wxWidgets和MFC、QT、 ACE的特性对比如表1所示。

注:其中免费中的“是/否”代表QT在linux平台上的Free Edition是免费的,而在windows和unix下使用QT是收费的。

而开源中的“是/否”代表QT有一个基于GPL的开源版本,但要进行商业开发,需要使用它的商业版本。

使用wxWidgets编写程序 学习一种编程语言的最好方法就是用它去编写程序,学习wxWidgets也不例外。

由于wxWidgets的主要功能是实现跨平台的GUI,因此,本文主要从GUI入手,讨论wxWidgets在C++中如何编写跨平台的应用程序 1. ?应用程序类的建立 使用wxWidgets建立系统需要一个类来描述整个应用程序。

这个类必须从wxApp类继承。

class MyApp : public wxApp ? //应用程序类 { public: ? ? virtual bool OnInit(); // 在应用程序启动时调用,如果返回false,退出应用程序 }; 这个类只覆盖了wxApp的一个虚方法OnInit。

可以用这个方法在程序启动时做一些验证,如果验证失败,可以通过返回false退出应用程序。

当然,由于这个函数是应用程序的入口点,所以建立主窗体的工作要在这个函数中完成。

2. 建立窗体类 ? ? wxWidgets中关于窗体的类很多,如果要建立一般窗体的话,可以从wxFrame继承。

? class MyFrame : public wxFrame //窗体类 { public: ? ? MyFrame(const wxString& title); // 窗体的构造函数 }; 3. 向窗体中加入控件 ? ? 在本文中向这个窗体加入了一个菜单条(Menu Bar)、一个状态条、一个Panel和一个按钮。

一般我们会在主窗体的构造函数中加入这些控件。

? MyFrame::MyFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title) { ? ? wxMenu *fileMenu = new wxMenu; ?// 建立“文件”菜单? ? ? wxMenu *helpMenu = new wxMenu; // 建立“帮助”菜单 ? ? // 向菜单中添加子项 ? ? helpMenu->Append(wxID_ABOUT, _T("关于"tF1"), _T("显示关于对话框")); ? ? fileMenu->Append(wxID_EXIT, _T("退出"tAlt-X"), _T("退出应用程序")); ? ? wxMenuBar *menuBar = new wxMenuBar(); ?// 建立一个菜单条 ? ? menuBar->Append(fileMenu, _T("文件")); ?//将“文件”菜单加入到菜单条 ? ? menuBar->Append(helpMenu, _T("帮助")); ?//将“帮助”菜单加入到菜单条 ? ? SetMenuBar(menuBar); ?//将菜单条放到窗体上 ? ? wxPanel *panel = new wxPanel(this); ? //建立一个Panel ? ? wxButton *button = new wxButton(panel, wxID_ABOUT, "关于", wxPoint(20, 20), wxSize(50, 30)); ?//建立一个Button ? ? CreateStatusBar(2); ?//建立一个两栏的状态栏 ? ? SetStatusText(_T("欢迎使用wxWidgets!")); ?//设置状态栏的文本 ? ? 在数组sample_xpm中描述了sample.ico的属性和图标本身。

如X代表红色; o代表黄色等。

然后在源程序中通过include “sample.xpm”引用这个资源文件。

要想从这个资源文件中装载图标。

可使用SetIcon(wxICON(sample)); wxICON读取资源文件,而SetIcon将这个图标设置为frame的标题栏图标。

要想将ico文件转换为这种资源文件,可使用一个免费软件XnView进行转换。

5. 显示主窗体 ? ? 显示主窗体非常简单,只需要将上面建立的MyFrame类实例化,并调用wxFrame的Show方法显示即可。

这些代码可以写在MyApp类的OnInit方法中。

bool MyApp::OnInit() { ? ? //建立MyFrame类的实例 ? ? MyFrame *frame = new MyFrame(_T("第一个wxWidgets程序")); ? ? frame->Show(true); ?//显示主窗体 ? ? return true; ?//必须返回true,否则应用程序将退出 } 在以上代码中Show方法有一个参数,如果为true,则以模式窗口的形式显示,否则以非模式窗口的形式显示。

6. 向窗体中加入事件 到目前为止,这个程序的界面已经完成了,但还未响应任何事件,下面就详细阐述如何向这个应用程序中加入事件代码。

? ? 对于事件来说,一般都会由两部分组成。

(1)调用事件部分 当程序发生某个动作时,如点击按钮;选中某个控件,可能需要执行一段代码。

而这段代码一般是由系统负责调用的,也就是说系统通过事件函数指针调用相应的代码。

(2)事件函数本身 ? ? 事件函数与普通函数一样,只不过它是在发生了事件之后,由系统调用的。

? 在wxWidgets中是通过事件哈希表(Event Hash Table)来进行事件处理的,即将相应的事件函数指针保存在一个哈希表中,然后当事件发生时,从这个哈希表中找到相应的事件函数指针,然后通过函数指针调用函数。

在使用事件哈希表之前,必须定义它。

由于定义哈希表非常复杂,而且每个需要处理事件的类都需要同样的代码,因此,wxWidgets为此定义了一个宏DECLARE_EVENT_TABLE()来定义哈希表。

可将这个宏写在MyFrame类的任何位置。

它相当于将以下语句放到了MyFrame类中。

? ? private: ? ? ? ?static const wxEventTableEntry sm_eventTableEntries[];? ? ? protected:? ? ? ? ? static const wxEventTable ?sm_eventTable;? ? ? ? ? virtual const wxEventTable* ?GetEventTable() const;? ? ? ? ? static wxEventHashTable ?sm_eventHashTable; ? ? ? ? virtual wxEventHashTable& ?GetEventHashTable() const; 其中静态数组变量sm_eventTableEntries保存了MyFrame类中的所有的事件信息。

上面的代码声明了处理事件哈希表的一些方法,即然声明了,就得实现。

由于实现代码也都一样,因此,wxWidgets也为实现这些方法定义了一组宏。

实现这些方法的宏如下所示。

BEGIN_EVENT_TABLE(MyFrame, wxFrame) ? ? EVT_MENU(wxID_EXIT, ?MyFrame::OnQuit) ? ? EVT_MENU(wxID_ABOUT, MyFrame::OnAbout) ? ? EVT_BUTTON(wxID_ABOUT, MyFrame::OnAbout) END_EVENT_TABLE() ? ? 其中BEGIN_EVENT_TABLE(…)实现了上面定义的方法,以及初始化了静态变量sm_eventTable。

后面两个EVT_MENU和一个EVT_BUTTON宏初始化了静态变量sm_eventTableEntries,即将这两个事件函数的指针(button和about菜单使用一个事件函数OnAbout)和控件ID保存在sm_eventTableEntries中,最后的END_EVENT_TABLE()宏做为一个空的事件函数指针赋给了sm_eventTableEntries,这有些象C语言中处理字符串,将最后一个字符赋为’"0’,这样就可以知道哪是结尾了。

? ? 向窗体中加入事件的最后一步是声明和实现事件函数。

在本例中声明了两个事件函数。

? void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); 可以将这两个函数声明放到MyFrame中的任何位置。

下面是它们的实现代码。

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { ? ? ? Close(true); } void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { ? ? wxString msg; ? ? msg.Printf( _T("这是一个关于对话框的例子."n") ? ? ? ? ? ? ? ? _T("欢迎使用 %s"), wxVERSION_STRING); ? ? wxMessageBox(msg, _T("?关于"), wxOK | wxICON_INFORMATION, this); } 其中OnQuit函数调用Close(true)关闭MyFrame,由于MyFrame是主窗体,因此,在MyFrame关闭后,应用程序也随之关闭了。

OnAbout使用wxMessageBox函数弹出一个信息对话框。

7. ?运行程序 到目前为止,这个程序的代码已经基本完成了,但是在前面曾说过,MyApp中的OnInit方法在应用程序启动时执行,那么是谁调用了OnInit方法呢?答案当然是wxWidgets。

wxWidgets为了调用这个方法,提供了一个宏IMPLEMENT_APP(…),这个宏有一个参数,需要将MyApp做为参数传入。

即IMPLEMENT_APP(MyApp)。

这个宏相当于一个WinMain函数(和控制台程序的main函数类似),即在WinMain函数中调用了MyApp中的OnInit函数。

在加入这个宏后,就可使用一个C++编译器将以上的源程序编译生成exe文件了。

台湾CN2云服务器 2核2G 5M 5IP 台湾物理服务器 E5x2 64G 20M 5IP

提速啦(www.tisula.com)是赣州王成璟网络科技有限公司旗下云服务器品牌,目前拥有在籍员工40人左右,社保在籍员工30人+,是正规的国内拥有IDC ICP ISP CDN 云牌照资质商家,2018-2021年连续4年获得CTG机房顶级金牌代理商荣誉 2021年赣州市于都县创业大赛三等奖,2020年于都电子商务示范企业,2021年于都县电子商务融合推广大使。资源优势介绍:Ceranetwo...

Virmach 3.23美元可用6个月的VPS主机

Virmach 商家算是比较久且一直在低价便宜VPS方案中玩的不亦乐乎的商家,有很多同时期的商家纷纷关闭转让,也有的转型到中高端用户。而前一段时间也有分享过一次Virmach商家推出所谓的一次性便宜VPS主机,比如很低的价格半年时间,时间到服务器也就关闭。这不今天又看到商家有提供这样的产品。这次的活动产品包括圣何塞和水牛城两个机房,为期六个月,一次性付费用完将会取消,就这么特别的产品,适合短期玩玩...

JUSTG提供俄罗斯和南非CN2 GIA主机年$49.99美元JUSTGgia南非cn2南非CN2justG

JUSTG,这个主机商第二个接触到,之前是有介绍到有提供俄罗斯CN2 GIA VPS主机活动的,商家成立时间不久看信息是2020年,公司隶属于一家叫AFRICA CLOUD LIMITED的公司,提供的产品为基于KVM架构VPS主机,数据中心在非洲(南非)、俄罗斯(莫斯科),国内访问双向CN2,线路质量不错。有很多服务商实际上都是国人背景的,有的用英文、繁体搭建的冒充老外,这个服务商不清楚是不是真...

wxwidgets为你推荐
网页登陆密码破解如何破解网站后台登陆密码(注:该网站所用数据库是ACCESS数据库,MD5加密码!)?什么网络电话好国内最好的网络电话是什么?windowsphone手机Windows phone手机的优点和缺点淘气鸟淘气鸟论坛为什么打不开了人脸检测综述人脸识别的主要应用方向及其优缺点?cf服务器爆满为什么我穿越火线一进服务器就显示 该服务器爆满然后又显示cf服务器爆满为什么穿越火线显示该服务器已爆满怎么才能挤进去?修改qq密码保护如何设置QQ密码保护和修改密码xp仿win7桌面主题xp系统win7主题下载,xp系统能装win7的主题吗?如果能上哪下?硅谷动力网站怎样制作网页?
万网域名查询 西安域名注册 187邮箱 idc评测网 英文简历模板word 免费smtp服务器 嘉洲服务器 谁的qq空间最好看 129邮箱 可外链相册 1g空间 南通服务器 河南移动网 免费申请个人网站 支付宝扫码领红包 web服务器安全 百度云空间 双线空间 广州服务器托管 腾讯云平台 更多