--- nono/wx/wxmainview.cpp 2026/04/29 17:05:08 1.1.1.11 +++ nono/wx/wxmainview.cpp 2026/04/29 17:05:12 1.1.1.12 @@ -56,6 +56,7 @@ wxBEGIN_EVENT_TABLE(WXMainView, inherite EVT_KEY_UP(WXMainView::OnKeyUp) EVT_CHAR(WXMainView::OnChar) EVT_MOUSE_EVENTS(WXMainView::OnMouse) + EVT_MOUSE_CAPTURE_LOST(WXMainView::OnMouseCaptureLost) wxEND_EVENT_TABLE() WXMainView::WXMainView(wxWindow *parent) @@ -209,7 +210,9 @@ WXMainView::SetMouseMode(bool mode) // マウスカーソル OFF ::wxSetCursor(wxCursor(wxCURSOR_BLANK)); - CaptureMouse(); + if (!HasCapture()) { + CaptureMouse(); + } // このウィンドウから外れないように移動を検出し続けるため、 // マウスカーソルをウィンドウ中央に移す。 @@ -219,7 +222,9 @@ WXMainView::SetMouseMode(bool mode) // マウスモードを OFF にする DMPRINTF("SetMouseMode OFF\n"); - ReleaseMouse(); + if (HasCapture()) { + ReleaseMouse(); + } // 分かりやすさのため、マウスカーソルを中央へ戻してから復帰 wxSize pt = GetClientSize() / 2; @@ -333,6 +338,14 @@ WXMainView::OnMouse(wxMouseEvent& event) event.Skip(); } +// マウスキャプチャロスト +void +WXMainView::OnMouseCaptureLost(wxMouseCaptureLostEvent& event) +{ + // 外部要因でマウスキャプチャをロストしたので、マウスモードを抜ける。 + SetMouseMode(false); +} + // アクティベートイベント。 // この(トップレベル)ウィンドウにフォーカスが当たるか外れるかで飛んでくる。 // 実際には WXMainFrame 宛てに飛んできたイベントをこちらに転送してある。