C++GUI之wxWidgets(2)-hello,world
目录
- wxWidgets的头文件
- 事件
- main入口函数
- 状态栏
- 事件处理程序
wxWidgets的头文件
首先必须包含wxWidgets的头文件。
1、可以在一个文件一个文件的基础上完成(如wx/window.h)
2、使用一个全局包含(wx/wx.h),其中包括大多数常用的头文件(虽然不是所有的头文件,因为wxWidgets的头文件太多,无法拉入所有的头文件)。
对于支持预编译头文件的平台,如WX_PRECOMP所示,这个全局头文件wx/wx.h已经包含在wx/wxprec.h中,所以我们可以只需要包含wx/wxprec.h。
#include <wx/wxprec.h>#ifndef WX_PRECOMP#include <wx/wx.h>
#endif
事件
实际上,每个应用都应该定义一个派生自wxApp的新类。通过重写wxApp的OnInit()虚方法,程序可以被初始化,例如创建一个新的主窗口。
现在程序如下了
#include <wx/wxprec.h>#ifndef WX_PRECOMP#include <wx/wx.h>
#endif// application class
class MyApp : public wxApp
{public:virtual bool OnInit();
};
主窗口是通过从wxFrame派生一个类并在构造函数中为其提供一个菜单和一个状态栏来创建的。此外,任何希望响应“事件”(如鼠标单击、菜单消息或按钮)的类都必须使用下面的宏声明一个事件表。
class MyFrame : public wxFrame
{public:MyFrame();private:void OnHello(wxCommandEvent& event);void OnExit(wxCommandEvent& event);void OnAbout(wxCommandEvent& event);
};
最后,对这类事件的响应是通过“事件处理程序”完成的,它只是函数(或功能词,如果使用c++ 11则包括lambdas),接受与被处理事件对应的类型的事件参数,例如wxCommandEvent用于来自简单控件的事件,如按钮、文本字段和菜单项。
对三个菜单项做出反应:自定义的“Hello”,以及“Exit”和“About”项(任何程序通常都应该实现后两者)。注意,这些处理程序不需要是虚拟的或公共的。
为了能够对菜单命令做出反应,它必须被赋予一个唯一的标识符,可以定义为const变量或enum元素。后者经常被使用,因为通常需要许多这样的常量:
enum
{ID_Hello = 1
};
不需要为“About”和“Exit”定义标识符,因为wxWidgets已经预先定义了标准值,如wxID_ABOUT和wxID_EXIT。您应该尽可能地使用它们,因为它们可以由特定的平台以特殊的方式处理。
main入口函数
和所有程序一样,必须有一个“main”函数。在wxWidgets下,main是在wxIMPLEMENT_APP()宏中实现的,它创建指定类的应用程序实例并开始运行GUI事件循环。它可以简单地这样使用:
wxIMPLEMENT_APP(MyApp);
如上所述,wxApp::OnInit()在启动时被调用,应该用来初始化程序,可能会显示一个“启动画面”并创建主窗口(或几个)。默认情况下,框架是隐藏创建的,以允许在显示它们之前创建子窗口。因此,我们需要显式地显示它们。最后,从这个方法返回true,表示成功初始化:
bool MyApp::OnInit()
{MyFrame *frame = new MyFrame();frame->Show(true);return true;
}
现在程序如下了
#include <wx/wxprec.h>#ifndef WX_PRECOMP#include <wx/wx.h>
#endif// application class
class MyApp : public wxApp
{public:virtual bool OnInit();
};wxIMPLEMENT_APP(MyApp);bool MyApp::OnInit()
{MyFrame *frame = new MyFrame();frame->Show(true);return true;
}
在主窗口(或稍后)的构造函数中,创建了一个包含菜单项的菜单,以及一个将显示在主窗口底部的状态栏。两者都必须绑定到具有各自调用的帧。
MyFrame::MyFrame(): wxFrame(NULL, wxID_ANY, "Hello World")
{wxMenu *menuFile = new wxMenu;menuFile->Append(ID_Hello, "&Hello...\tCtrl-H","Help string shown in status bar for this menu item");menuFile->AppendSeparator();menuFile->Append(wxID_EXIT);wxMenu *menuHelp = new wxMenu;menuHelp->Append(wxID_ABOUT);wxMenuBar *menuBar = new wxMenuBar;menuBar->Append(menuFile, "&File");menuBar->Append(menuHelp, "&Help");SetMenuBar(menuBar);CreateStatusBar();SetStatusText("Welcome to wxWidgets!");』
下面是2个菜单项
wxMenu *menuFile = new wxMenu;
menuFile->Append(ID_Hello, "&Hello...\tCtrl-H","Help string shown in status bar for this menu item");
menuFile->AppendSeparator();
menuFile->Append(wxID_EXIT);wxMenu *menuHelp = new wxMenu;
menuHelp->Append(wxID_ABOUT);
SetMenuBar(menuBar);
状态栏
CreateStatusBar();
SetStatusText("Welcome to wxWidgets!");
注意,我们不需要为标准菜单项wxID_ABOUT和wxID_EXIT指定标签——它们将被赋予标准(甚至正确翻译)标签和标准加速器,以适应当前平台,使我们的程序行为更加本机。因此,您应该尽可能重用标准id(参见Stock Items)。
事件处理程序
我们还必须将我们的事件处理程序连接到我们想在其中处理的事件。为此,我们调用Bind()将所有带有指定ID的菜单事件(由wxEVT_MENU事件类型标识)发送到给定函数。传递给Bind()的参数为
1、事件类型,例如wxEVT_MENU, wxEVT_BUTTON, wxEVT_SIZE,或wxWidgets使用的许多其他事件之一。
2、一个指针,指向要调用的方法和要调用它的对象。在本例中,我们只需调用自己的函数,并将this指针传递给对象本身。我们可以调用另一个对象的方法,或者非成员函数的方法——实际上,任何可以用wxCommandEvent调用的对象都可以在这里使用。
3、一个可选标识符,允许我们只选择wxEVT_MENU类型的一些事件,即来自具有给定ID的菜单项的事件,而不是在提供的处理程序中处理所有事件。这主要用于菜单项,很少用于其他类型的事件。
Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello);
Bind(wxEVT_MENU, &MyFrame::OnAbout, this, wxID_ABOUT);
Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT);
下面是标准的事件处理程序实现。OnExit()通过调用Close()关闭主窗口。参数true表示其他窗口没有否决权,例如在询问“您真的想关闭吗?”之后。如果没有其他主窗口,应用程序将退出。
void MyFrame::OnExit(wxCommandEvent& event)
{Close(true);
}
MyFrame::OnAbout()将显示一个包含一些文本的小窗口。在本例中是一个典型的“关于”窗口,其中包含有关程序的信息。
void MyFrame::OnAbout(wxCommandEvent& event)
{wxMessageBox("This is a wxWidgets Hello World example","About Hello World", wxOK | wxICON_INFORMATION);
}
自定义菜单命令处理程序的实现可以执行程序需要执行的任何任务,在这种情况下,我们将简单地显示来自它的一条消息,以适合Hello World示例:
void MyFrame::OnHello(wxCommandEvent& event)
{wxLogMessage("Hello world from wxWidgets!");
}
在c++ 11程序中,使用未命名的lambdas而不是函数作为事件处理程序是很方便的,特别是在处理来自控件的事件时,因为这允许将创建控件的代码和处理其事件的代码放在同一个位置。例如,在这里,我们可以用just替换wxID_EXIT处理程序
Bind(wxEVT_MENU, [=](wxCommandEvent&) { Close(true); }, wxID_EXIT);
全部程序如下
// wxWidgets "Hello World" Program// For compilers that support precompilation, includes "wx/wx.h".
#include <wx/wxprec.h>#ifndef WX_PRECOMP#include <wx/wx.h>
#endifclass MyApp : public wxApp
{public:virtual bool OnInit();
};class MyFrame : public wxFrame
{public:MyFrame();private:void OnHello(wxCommandEvent& event);void OnExit(wxCommandEvent& event);void OnAbout(wxCommandEvent& event);
};enum
{ID_Hello = 1
};wxIMPLEMENT_APP(MyApp);bool MyApp::OnInit()
{MyFrame *frame = new MyFrame();frame->Show(true);return true;
}MyFrame::MyFrame(): wxFrame(NULL, wxID_ANY, "Hello World")
{wxMenu *menuFile = new wxMenu;menuFile->Append(ID_Hello, "&Hello...\tCtrl-H","Help string shown in status bar for this menu item");menuFile->AppendSeparator();menuFile->Append(wxID_EXIT);wxMenu *menuHelp = new wxMenu;menuHelp->Append(wxID_ABOUT);wxMenuBar *menuBar = new wxMenuBar;menuBar->Append(menuFile, "&File");menuBar->Append(menuHelp, "&Help");SetMenuBar( menuBar );CreateStatusBar();SetStatusText("Welcome to wxWidgets!");Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello);Bind(wxEVT_MENU, &MyFrame::OnAbout, this, wxID_ABOUT);Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT);
}void MyFrame::OnExit(wxCommandEvent& event)
{Close(true);
}void MyFrame::OnAbout(wxCommandEvent& event)
{wxMessageBox("This is a wxWidgets Hello World example","About Hello World", wxOK | wxICON_INFORMATION);
}void MyFrame::OnHello(wxCommandEvent& event)
{wxLogMessage("Hello world from wxWidgets!");
}
运行结果如下
C++GUI之wxWidgets(2)-hello,world相关推荐
- C++GUI之wxWidgets(12)-编写应用涉及的类和方法(7)-事件处理(6)
目录 按类别列出的事件类别列表 用户生成事件与程序生成事件 可插拔事件处理程序 窗口标识符 标准事件表 事件处理程序和鼠标捕获 通用事件表宏 按类别列出的事件类别列表 事件对象包含有关特定事件的信息. ...
- C++GUI之wxWidgets(1)-安装与测试
目录 wxwidgets概述 安装与配置 wxwidgets概述 wxWidgets是一个开源的跨平台的C++构架库(framework),它可以提供GUI(图形用户界面)和其它工具.2.x版本支持所 ...
- python的电脑推荐_推荐8款常用的Python GUI图形界面开发框架
作为Python开发者,你迟早都会用到图形用户界面来开发应用.本文将推荐一些 Python GUI 框架,希望对你有所帮助,如果你有其他更好的选择,欢迎在评论区留言. Python 的 UI 开发工具 ...
- python gui漂亮_python 漂亮的gui
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我想知道如何为我的pythongui创建漂亮的ui. 就像这样: 或者像这样.. ...
- python使用界面-推荐8款常用的Python GUI图形界面开发框架
作为Python开发者,你迟早都会用到图形用户界面来开发应用.本文将推荐一些 Python GUI 框架,希望对你有所帮助,如果你有其他更好的选择,欢迎在评论区留言. Python 的 UI 开发工具 ...
- python开发的优秀界面-八款常用的 Python GUI 开发框架推荐
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 乔柯 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...
- 开源 python_8款Python GUI开源框架,谁才是你的最爱?
作为Python开发者,你迟早都会用到图形用户界面来开发应用.本文千锋武汉Python培训小编将推荐一些Python GUI框架,希望对你有所帮助. 1.Python的UI开发工具包 Kivy Kiv ...
- python gui测试框架_八款常用的 Python GUI 开发框架推荐
作为Python开发者,你迟早都会用到图形用户界面来开发应用.本文将推荐一些 Python GUI 框架,希望对你有所帮助,如果你有其他更好的选择,欢迎在评论区留言. Python 的 UI 开发工具 ...
- wxpython图形_wxPython(Python的GUI图形库)v3.0.2.0免费版-独木成林
wxPython(Python的GUI图形库) v3.0.2.0免费版 wxPython2.8-win32-ansi-py27 对应于32位 python 2.7版本. 简单例子: #!/usr/bi ...
最新文章
- Css常用操作——————分类
- (二)Amazon Lightsail 部署LAMP应用程序之部署单片LAMP应用程序
- Java开发面试题,Java常用类使用总结
- 【C语言】字符串函数strtok 按照指定字符串分割
- 怎么查看自己安装的python版本_教你如何检查 Python 版本
- sql注入学习——时间盲注
- shell之通过if [ $? != 0 ]判断上次程序是否执行成功
- 这个点名系统太好用了,快来看看……
- Visual C++利用互斥量同步线程实现文件读取进度条
- VC创建DLL动态链接库及其调用
- Linuxs查看进程,杀死进程
- python预测药_python 最麻烦的时间有药了
- 解决「matplotlib 图例中文乱码」问题
- linux系统可以安装搜狗输入法,在Arch Linux系统中安装搜狗输入法的方法
- ASP.NET AJAX学习记要(1)-如何下手
- iOS 客户端对于运营商劫持的一点点对抗方式
- 中国省份数据字典表---自用
- JAVA中SSH框架
- 阿里云对象存储OSS简介
- JAVA设计模式之策略模式