1

私は Web を検索して、wxWidgets の実際の wxFrame 要素でマウス イベントをキャッチできるかどうかを調べようとしています。さまざまなソースによると、それは不可能であり、wxPanels を使用してイベントをキャプチャする必要がありますが、それは本当ですか?

ありがとう

4

2 に答える 2

2

マウス イベントはウィンドウ階層の上方には伝播されないため、フレームが他のウィンドウで完全に覆われている場合、そもそもマウス イベントを取得できないため、そこでキャッチすることはできません。

wxFrameもちろん、 を使用するクラスのメソッドで、他のウィンドウからのイベントをいつでも処理できますBind()。例えば:

MyFrame::MyFrame(...)
    : wxFrame(...)
{
    wxPanel* p = new wxPanel(this);
    p->Bind(wxEVT_MOTION, &MyFrame::OnMouseMotion, this);
}

フレームメソッドでパネル上で発生するマウスモーションイベントを処理できます。

于 2012-11-29T13:09:51.213 に答える
1

ほとんど本当です。

wxEVT_ENTER(またはそれが呼び出されるもの)のように、一部のマウスイベントはフレームに移動します。他の人はパネルに行きます、例えばwxEVT_RIGHT_UP。それらのイベントをフレームに転送できます。

パネルとフレームの両方でイベントにバインドします。

Bind(wxEVT_RIGHT_UP, &MyFrame::OnMouse, ptr_to_myframe);
Bind(wxEVT_RIGHT_UP, &MyPanel::OnMouse, ptr_to_panel);

そして(フレームがパネルの親であると仮定して)、

void MyPanel::OnMouse(wxMouseEvent &event) {
    wxPostEvent(GetParent(), event);
}

パネルがスクロールされている場合は、スクロールされていない座標でイベントを転送することをお勧めします。

void MyScrolledPanel::OnMouse(wxMouseEvent &event) {
    wxMouseEvent pevent(event);
    CalcUnscrolledPosition(event.GetX(), event.GetY(), &pevent.m_x, &pevent.m_y);
    wxPostEvent(GetParent(), pevent); 
}
于 2012-11-29T12:01:46.320 に答える