wxWidgets系列之入门例子

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类实例化,并调用wxFrameShow方法显示即可。这些代码可以写在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,即将这两个事件函数的指针(buttonabout菜单使用一个事件函数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方法呢?答案当然是wxWidgetswxWidgets为了调用这个方法,提供了一个宏IMPLEMENT_APP(…),这个宏有一个参数,需要将MyApp做为参数传入。即IMPLEMENT_APP(MyApp)。这个宏相当于一个WinMain函数(和控制台程序的main函数类似),即在WinMain函数中调用了MyApp中的OnInit函数。在加入这个宏后,就可使用一个C++编译器将以上的源程序编译生成exe文件了。

转:www.027mm.net 铭明网络
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值