スポンサーリンク

wxWidgetsで.xrcファイルからデザインを読み込んで適用(2) イベントのBindと値の取得

コード

layout.xrc

<?xml version="1.0" ?>
<resource version="2.3.0.1">

    <!-- トップレベルはコントロールである必要がある。パネルを作成。 -->
    <object class="wxPanel" name="myMainPanel">
        <!-- レイアウト用のサイザーを作成 -->
        <object class="wxBoxSizer" name="myBoxSizer">
            <orient>wxVERTICAL</orient> <!-- レイアウト方法の指定 -->
            <!-- コントロールは sizeritem に入れる -->
            <object class="sizeritem">
                <!-- 左側と上側に15pxの余白を入れる -->
                <flag>wxLEFT|wxTOP</flag>
                <border>15</border>
                
                <!-- このコントロールはサイザーのサイズ変更で大きさが変わらない -->
                <option>0</option>

                <!-- 名前 myButton を追加 -->
                <object class="wxButton" name="myButton">
                    <label>ボタン</label>
                    <size>100,30</size>
                </object>
            </object>

            <!-- コントロールは sizeritem に入れる -->
            <object class="sizeritem">
            
                <!-- 上下左右の余白は15px -->
                <flag>wxALL|wxEXPAND</flag>
                <border>15</border>

                <!-- このコントロールはサイザーのサイズ変更で大きさが変わる -->
                <option>1</option>

                <object class="wxTextCtrl" name="myText">
                    <value>テキスト</value>
                </object>

            </object>
        </object>
    </object>
</resource>

C++側

// https://docs.wxwidgets.org/3.0/overview_helloworld.html

// プリプロセッサに以下二つを追加
// __WXMSW__
// WXUSINGDLL

// サブシステムをWindowsに設定(WinMainで呼び出すので)
// Windows (/SUBSYSTEM:WINDOWS)

#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif

#include <wx/gdicmn.h> // wxPointに必要
#include <wx/frame.h>  // wxFrameに必要


#pragma comment(lib,"wxbase32u.lib")
#pragma comment(lib,"wxbase32u_net.lib")
#pragma comment(lib,"wxbase32u_xml.lib")
#pragma comment(lib,"wxmsw32u_adv.lib")
#pragma comment(lib,"wxmsw32u_aui.lib")
#pragma comment(lib,"wxmsw32u_core.lib")
#pragma comment(lib,"wxmsw32u_gl.lib")
#pragma comment(lib,"wxmsw32u_html.lib")
#pragma comment(lib,"wxmsw32u_media.lib")
#pragma comment(lib,"wxmsw32u_propgrid.lib")
#pragma comment(lib,"wxmsw32u_qa.lib")
#pragma comment(lib,"wxmsw32u_ribbon.lib")
#pragma comment(lib,"wxmsw32u_richtext.lib")
#pragma comment(lib,"wxmsw32u_stc.lib")
#pragma comment(lib,"wxmsw32u_webview.lib")
#pragma comment(lib,"wxmsw32u_xrc.lib")


/////////////////////////////////////
/////////////////////////////////////
/////////////////////////////////////

#include <wx/xrc/xmlres.h>


#include <string>



// ウィンドウ作成
class MyFrame : public wxFrame
{
public:
    void PostCreate() {
        wxXmlResource::Get()->InitAllHandlers();// 初期化
        wxXmlResource::Get()->Load(R"(C:\test\layout.xrc)"); // ファイル読み込み
        
        wxXmlResource::Get()->LoadPanel(this, "myMainPanel"); // GUIの生成

        this->Layout(); // レイアウトの更新

        // ボタンの取得
        wxButton* myButton = XRCCTRL(*this, "myButton", wxButton);

        // ボタンのクリックイベントに対するイベントハンドラを接続
        myButton->Bind(wxEVT_BUTTON, &MyFrame::OnMyButtonClick, this);

    }

    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
        : wxFrame(NULL, wxID_ANY, title, pos, size)
    
    {
        // CallAfter : 現在処理中のイベントが終わったらPostCreateを実行
        // コンストラクタはウィンドウ生成イベント扱い
        CallAfter(&MyFrame::PostCreate);

    }

    // ボタンがクリックされたときのイベントハンドラ
    void OnMyButtonClick(wxCommandEvent& event)
    {
        // テキストボックスの取得
        wxTextCtrl* textctrl = XRCCTRL(*this, "myText", wxTextCtrl);

        // テキストボックスの内容を取得
        wxString str = textctrl->GetValue();

        // ボタンがクリックされたときの処理
        wxMessageBox(str);
    }
private:
};

/////////////////////////////////////
/////////////////////////////////////
/////////////////////////////////////

// wxWidgetsのアプリケーション作成
class MyApp : public wxApp {
public:

    virtual bool OnInit() {
        MyFrame* frame = new MyFrame("Hello World", wxPoint(50, 50), wxSize(450, 340));
        frame->Show(true);

        return true;
    }

};

/////////////////////////////////////
/////////////////////////////////////
/////////////////////////////////////

// WinMainをマクロで定義
wxIMPLEMENT_APP(MyApp);

実行例

XRCCTRLマクロについて

XRCCTRLの実体はFindWindowをdynamic_castしたもので、実際はもっと複雑だがざっくりいうと以下のようなことをやっている。

wxButton* myButton = dynamic_cast<wxButton*>(this->FindWindow("myButton"));

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: