wxPython wx.html.HtmlWindowをスクロールして、ユーザーがリンクをクリックしたときの位置に戻るにはどうすればよいですか?
質問
wxPython wx.html.HtmlWindowを使用して、インターフェイスの一部を表示しています。ユーザーは、リストより小さいウィンドウでリンクのリストを下にスクロールできます。ユーザーがリンクをクリックすると、Webページを再描画する必要がありますが、ページの位置をクリックした場所に戻したいと思います。
イベントでMouseEvent.GetLogicalPosition()を試しましたが、DCが必要であり、GetPosition()と同じ情報を取得することができるので、正しい情報を提供してはいけません1つ。
HtmlWindow.CalcScrolledPosition()も試しましたが、NotImplementedErrorが発生するため、HtmlWindowでは使用できないようです...
欲しいのは、MouseEventまたはOnLinkClicked情報から派生できるスクロール位置です。
HtmlWindow.ScrollToAnchor()について知っていますが、それは不安定で見た目が悪いです-可能な場合はバイパスして、ユーザーがクリックした場所に正確にスクロールバックできるようにします。
ありがとう!
解決
インスピレーションのためのwxHtmlWindowのソース?たとえば、 wxHtmlWindow :: LoadPage()
:it
// store[s the current] scroll position into history item:
int x, y;
GetViewStart(&x, &y);
(*m_History)[m_HistoryPos].SetPos(y);
この保存されたスクロール位置は、 wxHtmlWindow :: HistoryBack()
:
Scroll(0, (*m_History)[m_HistoryPos].GetPos());
Refresh();
保存された位置に戻る。
iは、この組み込みの「ウィンドウ内の最後の位置に移動」と仮定します。取り扱いは最も「薄っぺらで美的でない」ものではありません。同様の何かがあなたのために働くことができますか?
他のヒント
少し遅れているかもしれませんが、aからのヒントとこちら、私は以下を呼び出すと思います:
scrollpos = wx.html.HtmlWindow.GetViewStart()[1]
それを保存し、後で呼び出します:
wx.html.HtmlWindow.Scroll(0, scrollpos)
私のために働く。もちろん、wx.html.HtmlWindowをインスタンスへの実際の参照に変更する必要があります。
これは、ページを前の位置にスクロールするために行っていることです。 点滅を避けるためにこれを行います。
pos = self.GetViewStart()[1]
self.Freeze()
self.SetPage(src)
if save_scroll_pos:
self.Scroll(0, pos)
self.Thaw()
通常、クリックイベントはMouseUpイベントによってトリガーされます。 MouseDownイベントをキャプチャしてマウスの位置を追跡すると、ラストクリック(MouseUp)が発生した場所がわかります。これにより、物事を再構築できます。
この特定の問題については、MouseDownでwxHtmlWindowコントロール内にあるかどうかを確認し、そうであれば行番号などを保存するなど、もう少し作業が必要になる場合があります。