MinGW - wxWidgets - Button

LastUpdate 2005.09.01 Yoshiaki Ueda
[目次へ戻る]

 ウインドウにボタンを貼り付け、そのイベントをひろうプログラムを開発する。

■独自のウインドウを持つ


●独自のウィンドウクラスを定義する。


MyWindow.h class MyWindow : public wxFrame
{
public:
    MyWindow(wxWindow* parent,
        wxWindowID id,
        const wxString& title,
        const wxPoint& pos = wxDefaultPosition,
        const wxSize& size = wxDefaultSize,
        long style = wxDEFAULT_FRAME_STYLE,
        const wxString& name = "Draw")
    : wxFrame(parent, id, title, pos, size, style, name)
    {
    };
};

●アプリケーションクラスで、OnInit()をオーバライドする。


AppMain.cpp #include "wx\wx.h"
#include "MyWindow.h"

class MyApp : public wxApp
{
public:
    virtual bool OnInit();
};

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
    // ウィンドウを生成
    MyWindow* pWnd = new MyWindow(NULL, -1, wxT("wxWidgets Button"));
    // 表示
    pWnd->Show(TRUE);
    // トップウィンドウに設定
    SetTopWindow(pWnd);
    // 成功を通知
    return TRUE;
}


■ボタンを表示させる


 ウインドウクラスのコンストラクタで、wxButtonクラスのインスタンスを生成する、だけ。

MyWindow.cpp MyWindow::MyWindow(wxWindow* parent,
        wxWindowID id,
        const wxString& title,
        const wxPoint& pos,
        const wxSize& size,
        long style,
        const wxString& name)
    : wxFrame(parent, id, title, pos, size, style, name)
{
    new wxButton(
        this, //wxWindow* parent
        -1, //wxWindowID id
        wxT("Button"), //const wxString& label
        wxPoint(100, 100) //const wxPoint& pos
        //const wxSize& size = wxDefaultSize
        //long style = 0
        //const wxValidator& validator
        //const wxString& name = "button"
    );
};

 しかしこれではあたり一面ボタンだらけのウインドウになってしう。
 同様にふたつ目のボタンを表示させると、それらしい位置に、それらしいサイズで表示される。
 これは何故だかわからない、謎であ る。

■メモリーリークしていないのか

update:2005.09.01

 数多くのサンプルで、newだけしてdeleteされていない。
 これはサンプルゆえに、そんな常識的なことは、自分できっちり考えろということなのか?それとも、deleteしなくてもかまわない仕組みがどこかにこっそり存在するのか・・

 独自ウインドウのデストラクタで、メッセージボックスを表示させるようにして確かめてみた。
 つぎのどちらのコードも、メッセージを表示するので、『deleteしなくてもメモリーリークしない』ようである。

メモリーリークしないだろう
コード
bool MyApp::OnInit()
{
        MyDialog dlg;
        dlg.ShowModal();
        return false;
}
メモリーリークするかも
しれないコード
bool MyApp::OnInit()
{
        MyDialog* pDlg = new MyDialog();
        pDlg->ShowModal();
        return false;
}
デストラクタで、
メッセージボックスを出す。
MyDialog::~MyDialog()
{
        wxMessageBox(wxT("~MyDialog"));
}

●メモリーリークはしていないのか(以前の内容)


 しかし今まで、ボタンにしろ、独自ウインドウにしろ、newだけしてdeleteしていないが、これでメモリーリークしないのだろうか?

 確かめるべく、わざとメモリーリークさせるプログラムをデバッグ実行させたが、何も表示してくれない。
 デバッグレベルを(Project – SettingsのCompile – Debugging informationで、Debug levelをnativeでLevel3まで)上げてみたが、変わりない。
 なお、Debugging informationにgdbを選ぶと、デバッグ実行時に統合環境が落ちてしまう。

 ので結局、メモリーリークしているのか、していないのかよく分からない。
 色々なサンプルがそうなっているので、多分どこかでdeleteされる仕組みがどこかにあるのであろう。

■ボタンのクリックを拾う


クラス定義
(*.h)
class MyWindow : public wxFrame
{
    ....
private:
    void OnButtonClicked(wxCommandEvent& event);
    DECLARE_EVENT_TABLE()
};
イベントテーブル
(*.cpp)
BEGIN_EVENT_TABLE(MyWindow, wxFrame)
    EVT_BUTTON(-1, MyWindow::OnButtonClicked)
END_EVENT_TABLE()
実装(*.cpp) void MyWindow::OnButtonClicked(wxCommandEvent& event)
{
    m_pCheckBox->SetValue( !m_pCheckBox->GetValue() );
}