マウスキャプチャーと画面のちらつき

前回やったラバーバンド処理は、マウスがウィンドウの外に出ると挙動がおかしくなってしまいます。ウィンドウズのプログラミングではこういう場合にはマウスキャプチャーを使います。マウスカーソルが画面外に出てもマウスのイベントを受け取り続けると言うものです。


wxPython のマウスキャプチャーも知ってしまえば激簡単で、該当するコントロールのCaptureMouse()を呼び出してキャプチャー開始, ReleaseMouse() を呼び出してキャプチャー終了です。

    @binder(wx.EVT_LEFT_DOWN)
    def OnLeftDown(self, evt):
        self.ox = evt.X
        self.oy = evt.Y
        self.flag = True
        self.CaptureMouse()

    @binder(wx.EVT_LEFT_UP)
    def OnLeftUp(self, evt):
        self.flag = False
        self.Refresh()
        self.ReleaseMouse()
    
    @binder(wx.EVT_MOTION)
    def OnMotion(self, evt):
        if self.flag:
            self.px = evt.X
            self.py = evt.Y
            self.Refresh()

ただ、ウィンドウの構造を変更して、メインフレームの中に子のキャンバスを(wxPanel とかを使って)持たせてやり、描画をそちらで行うようにした場合、マウスキャプチャー中でマウスカーソルがウィンドウ外にある時に画面がちらつくと言う現象が発生します。前回書いたちらつき対策で画面をクリアしないという処理が、メインフレーム側に対して有効になっていないのが原因のような気がしますが、まだちょっと調査中。