私は Web を検索して、wxWidgets の実際の wxFrame 要素でマウス イベントをキャッチできるかどうかを調べようとしています。さまざまなソースによると、それは不可能であり、wxPanels を使用してイベントをキャプチャする必要がありますが、それは本当ですか?
ありがとう
マウス イベントはウィンドウ階層の上方には伝播されないため、フレームが他のウィンドウで完全に覆われている場合、そもそもマウス イベントを取得できないため、そこでキャッチすることはできません。
wxFrame
もちろん、 を使用するクラスのメソッドで、他のウィンドウからのイベントをいつでも処理できますBind()
。例えば:
MyFrame::MyFrame(...)
: wxFrame(...)
{
wxPanel* p = new wxPanel(this);
p->Bind(wxEVT_MOTION, &MyFrame::OnMouseMotion, this);
}
フレームメソッドでパネル上で発生するマウスモーションイベントを処理できます。
ほとんど本当です。
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);
}