ホーム < ゲームつくろー! < IKD備忘録

wxWidgets
ボタンを表示させてみる

(2010. 5. 4)


 wxWidgetsでウィンドウを表示させることができました。とっても簡単にできるのが凄い!で、次はウィジットの代表である「ボタン」を設置してみます。これも簡単みたいですよ。ちなみに、今回はこちらを参照しました。



@ ボタン表示フレーム

 今回はダイアログのように別ウィンドウ上にボタンを配置するプログラムです。
 まずボタンを配置するフレームクラスを作ってみました:

TestFrame.h
class TestFrame : public wxFrame {
public:
    TestFrame(const wxString &title, const wxSize &size);

    void OnQuit(wxCommandEvent &event);
};

これがヘッダーです。TestFrameという独自のフレームクラスをwxFrameから派生させています。コンストラクタはタイトル名とフレームのサイズを渡すようにしています。メンバメソッド(ハンドラ)はとりあえず「ボタンを押すとフレームを終了」という事でOnQuitメソッドを新設。

 実装はコンストラクタがメインです:

TestFrame.cpp
TestFrame::TestFrame(const wxString &title, const wxSize &size) :
wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, size)
{
    wxPanel *panel = new wxPanel(this, wxID_ANY);
    wxButton *button = new wxButton(panel, wxID_EXIT, _("Exit"), wxPoint(20, 20));

    Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(TestFrame::OnQuit));
    button->SetFocus();
    Center();
}

宣言時初期化部分で親クラスであるwxFrameクラスに必要な引数を渡します。これは前章のウィンドウ作成と同じですね。次に新しいwxPanelというクラスが出てきました。オンラインマニュアルを調べてみると、「A panel is a window on which controls are placed.(Panelはコントロールが置かれるウィンドウです)」とあります。なるほど、これがボタンとかリストとか色々なウィジットの土台となるウィンドウのようです。パネル作成時には親となるフレーム(上の場合はthis)と固有IDを渡します。上では第2引数にwxID_ANYというIDが渡されています。これは実はデフォルト引数でして省略ができます。省略すると適当なIDが振られると思われます。

 続いてボタンウィジット(wxButton)を作成します。wxButtonのコンストラクタでは親、ウィジット識別ID、表記文字そして位置を指定しています。さきほど作ったパネルが土台となるので親として第1引数に渡しています。wxID_EXITはwxWidgetsが用意する共通IDかな?位置は親基点かと思います。

 続くConnectメソッドはウィジットと発生するイベントを結合する大切なメソッドです。今回は「ボタンが押されたら終了する」という動作を考えています。第1引数がウィジットの固有IDで、第2引数がそのウィジットが発生するイベントかなと思います。上の場合、wxID_EXITが割り振られたボタンが押されるとwxEVT_COMMAND_BUTTON_CLICKEDが発生し、そのイベントを第3引数で指定したメソッドが受けるという事になります。これ、wxWidgetsを使う側では上のようにしれっと書けていますが、元ソースを辿っていくと裏ではそうとうに色々と頑張っています。こういう設計は勉強になりますね。後はボタンのフォーカス許可(SetFocusメソッド)を設定しています。



A ボタンをメインフレームへ

 では、以上のように作成したボタンクラスを早速メインフレーム上に配置してみます。これは凄く簡単で、アプリケーションの初期化を行うOnInitメソッド内でオブジェクトを生成して表示するだけです:

main.cpp
// OnInitメソッド
bool MyApp::OnInit() {
    // ボタン配置
    ButtonWx *button = new ButtonWx(_("Button"), wxSize(250, 100));
    button->Show();

    return true;
}

上は前章のウィンドウ表示テストプログラムのOnInitメソッド内を変更したものです。newしてShowするだけなのですから異常に簡単ですよね!さ、実行です:

ご〜きげ〜ん(^-^)/。C++でボタンひとつ出すのも中々大変なのですが、そういうのが一切いらないのは凄いなぁ〜。これならばC++上でGUIをバリバリ使ったツールを作れます!望んでいたのはこういうのですよ〜。よし、しばらくは色々な基本ウィジットを表示させてみよう。