MinGW – wxWidgets – DoubleEventButton

LastUpdate 2005.08.30 Yoshiaki Ueda
[目次へ戻る]

 ボタンの押下と開放でイベントを拾えるボタンをつくる。

■ボタンの押下と開放でイベントを拾えるボタンをつくる


●まず両方のイベントを拾えるようにする


定義
class yfDoubleEventButton : public wxButton
{
public:
    yfDoubleEventButton(wxWindow* parent, wxWindowID id,
        const wxString& label = wxEmptyString,
        const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
        long style = 0,
        const wxValidator& validator = wxDefaultValidator,
        const wxString& name = "button");
private:
    void OnButtonDown(wxMouseEvent& event);
    void OnButtonUp(wxMouseEvent& event);
    DECLARE_EVENT_TABLE()
};
実装
yfDoubleEventButton::yfDoubleEventButton(
        wxWindow* parent, wxWindowID id, const wxString& label,
        const wxPoint& pos, const wxSize& size, long style,
        const wxValidator& validator, const wxString& name )
    : wxButton(parent, id, label, pos, size, style, validator, name)
{
}

BEGIN_EVENT_TABLE(yfDoubleEventButton, wxButton)
    EVT_LEFT_DOWN(yfDoubleEventButton::OnButtonDown) 
    EVT_LEFT_UP(yfDoubleEventButton::OnButtonUp) 
END_EVENT_TABLE()

void yfDoubleEventButton::OnButtonDown(wxMouseEvent& event)
{
    event.Skip();
}

void yfDoubleEventButton::OnButtonUp(wxMouseEvent& event)
{
    event.Skip();
}

●拾ったイベントを親ウインドウにも送る


void yfDoubleEventButton::OnButtonDown(wxMouseEvent& event)
{
    if( m_downEvent && GetParent() ){
        wxCommandEvent newEvent(m_downEvent, GetId());
        GetParent()->ProcessEvent(newEvent);
    }
    event.Skip();
}

●送られたイベントを親ウインドウで受ける


DECLARE_EVENT_TYPE(EVT_TONE_BUTTON_DOWN, -1)

DEFINE_EVENT_TYPE(EVT_TONE_BUTTON_DOWN)

BEGIN_EVENT_TABLE(yfMIDIKeyboardPanel, wxPanel)
    EVT_COMMAND_RANGE(IDC_C2_BUTTON, IDC_B4_BUTTON,
            EVT_TONE_BUTTON_DOWN, yfMIDIKeyboardPanel::OnToneButtonDown)
END_EVENT_TABLE()

void yfMIDIKeyboardPanel::OnToneButtonDown(wxCommandEvent& event)
{
    //処理は省略
}

■Tips


●イベントのIDと、ウインドウのID

 イベントタイプと呼ばれる、イベントについているIDと、ウインドウに付いているIDがあってややこしい。

●独自のイベントをつくるときは、DECLARE_EVENT_TYPE( )マクロと、DEFINE_EVENT_TYPE( )を使う

 そうしないと上手くイベントを拾えない。