2010-7-17
一:关于一个wxWidgets的一个小例子
1. wxT这个宏让你的代码兼容Unicode模式,这和另外一个宏_T的作用完全一样
2. IMPLEMENT_APP(MyApp);//告诉wxWidget,我创建了一个MyApp的应用程序,wxWidget创建MyApp的类.
这个宏除了上述的功能以外,还会检查编译应用程序使用的库文件是否和当前的库文件的版本相匹配,如果没有这种检查,由此而产生的一些运行期的错误可能很难被查出原因。
3. wxWidgets创建这个MyApp类的实例的时候,会将创建的结果赋值给一个全局变量wxTheApp 使用DECLARE_APP(MyApp)可以省去从wxapp到MyApp的强制类型转换,增加这个声明之后可以调用wxGetApp()函数,返回一个到这个MyApp实例的引用,这样用起来方便多了。
4. 建窗口实例:MyFrame::MyFrame(const wxString& title):wxFrame(NULL,wxID_ANY,title)或者使用直接在构造函数中显示调用基类默认的构造函数,然后调用wxFrame.::Create()函数来创建一个frame窗口的实例
5. SetIcon用来实现窗口的图标
6. 在编译一个文件的时候遇到一个问题提示:找不到这个文件mondrian.xpm 找到这个文件的路径,把它的路径添加到附加包含路径中就编译通过了。
7. 创建菜单:wxMenu *fileMenu=new wxMenu;
8. 添加菜单项:比如这个fileMenu->Append(wxID_EXIT, wxT("E&xit/tAlt-X"),wxT("Quit this program")); wxID_EXIT表示菜单项标识,菜单上的文本中由"&"符号前导的字符将成为菜单的快捷操作符,"/t"符号则前导一个全局的快捷键。wxT("Quit this program")为帮助文本,在状态栏中会显示。
9. wxMessageBox,它的四个参数分别代表消息内容,标题,窗口类型以及父窗口。
小例子如下:
// Name: minimal.cpp
// Purpose: Minimal wxWidgets sample
// Author: Julian Smart
#include "wx/wx.h"
// 定义应用程序类
class MyApp : public wxApp
{
public:
// 这个函数将会在程序启动的时候被调用
virtual bool OnInit();
};
// 定义主窗口类
class MyFrame : public wxFrame
{
public:
// 主窗口类的构造函数
MyFrame(const wxString& title);
// 事件处理函数
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
private:
// 声明事件表
DECLARE_EVENT_TABLE()
};
// 有了这一行就可以使用MyApp& wxGetApp()了
DECLARE_APP(MyApp)
// 告诉wxWidgets主应用程序是哪个类
IMPLEMENT_APP(MyApp)
// 初始化程序
bool MyApp::OnInit()
{
// 创建主窗口
MyFrame *frame = new MyFrame(wxT("Minimal wxWidgets App"));
// 显示主窗口
frame->Show(true);
// 开始事件处理循环
return true;
}
// MyFrame类的事件表
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
EVT_MENU(wxID_EXIT, MyFrame::OnQuit)
END_EVENT_TABLE()
void MyFrame::OnAbout(wxCommandEvent& event)
{
wxString msg;
msg.Printf(wxT("Hello and welcome to %s"),
wxVERSION_STRING);
wxMessageBox(msg, wxT("About Minimal"),
wxOK | wxICON_INFORMATION, this);
}
void MyFrame::OnQuit(wxCommandEvent& event)
{
// 释放主窗口
Close();
}
#include "mondrian.xpm"
MyFrame::MyFrame(const wxString& title)
: wxFrame(NULL, wxID_ANY, title)
{
// 设置窗口图标
SetIcon(wxIcon(mondrian_xpm));
// 创建菜单条
wxMenu *fileMenu = new wxMenu;
// 添加“关于”菜单项
wxMenu *helpMenu = new wxMenu;
helpMenu->Append(wxID_ABOUT, wxT("&About.../tF1"),
wxT("Show about dialog"));
fileMenu->Append(wxID_EXIT, wxT("E&xit/tAlt-X"),
wxT("Quit this program"));
// 将菜单项添加到菜单条中
wxMenuBar *menuBar = new wxMenuBar();
menuBar->Append(fileMenu, wxT("&File"));
menuBar->Append(helpMenu, wxT("&Help"));
// ...然后将菜单条放置在主窗口上
SetMenuBar(menuBar);
// 创建一个状态条来让一切更有趣些。
CreateStatusBar(2);
SetStatusText(wxT("Welcome to wxWidgets!"));
}
小结:至此我大概懂得了如何创建一个图形界面,但是还是有点模糊。
二:关于事件处理
10. EVT_SIZE标识符参数因为这个事件只会被产生这个事件的控件所处理。
11. 按钮被点击的时候先检查wxButton中是否有相应的处理函数,没有再检查其父亲类所属的事件表中。
12. 只有Command事件(其事件类型直接或者间接的继承自wxCommandEvent)才会被递归的应用到其父亲的事件表。通常这是wxWidgets的用户经常会感到困惑的地方,因此我们把那些不会传递给其父亲的事件表的事件列举如下:wxActivate, wxCloseEvent, wxEraseEvent, wxFocusEvent, wxKeyEvent, wxIdleEvent, wxInitDialogEvent, wxJoystickEvent, wxMenuEvent, wxMouseEvent, wxMoveEvent, wxPaintEvent, wxQueryLayoutInfoEvent, wxSizeEvent, wxScrollWinEvent, 和wxSysColourChangedEvent,这些事件都不会传给事件源控件的父亲.
13. 要过滤某个事件,需要先实现一个继承自wxTextctrl的新的类,然后在其事件表中使用EVT_KEY_DOWN事件映射宏。可以通过调用wxEVENT::Skip函数来提示事件处理过程对于其中的某些按键事件应该继续寻找其父亲的事件表。
14. 动态事件的处理方法:和动态事件处理相关的API有两个:wxEvtHandler::Connect和wxEvtHandler::Disconnect。大多数情况下你不需要手动调用wxEvtHandler::Disconnect函数,这个函数将在窗口类被释放的时候自动。使用方法:
取消使用DECLARE_EVENT_TABLE 而需要在OnInit函数中增加如下代码:frame->Connect(wxID_EXIT,wxEVT_COMMAND_MENU_SELECTED,wxCommandEventHander(MyFrame::OnQuit));
frame->Connect(wxID_EXIT,wxEVT_COMMEND_MENU_SELECTED,wxCommandEventHander(Myframe::OnQuit));
15. 用户定义的窗口标识符只能是正整数。
16. 定义一个你的事件类支持的事件类型的表。这个表应该定义在你的头文件中。用BEGIN_DECLARE_EVENT_TYPES()宏和END_DECLARE_EVENT_TYPES()宏包含起来。其中的每一个支持的事件的声明应该使用DECLARE_EVENT_TABLE (name, integer)格式的宏.然后在你的.cpp文件中使用DEFINE_EVENT_TYPE(name)来实现这个事件类.