Como faço para percorrer uma volta wxPython wx.html.HtmlWindow até onde estava quando o usuário clicar em um link?

StackOverflow https://stackoverflow.com/questions/1400179

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu estou usando um wxPython wx.html.HtmlWindow para exibir parte da minha interface. O usuário pode rolar para baixo uma lista de links em uma janela menor do que a lista. Quando clicar em um link, eu preciso repintar a página da web, mas eu quero voltar as costas posição da página para onde eles clicado ele.

Eu tentei MouseEvent.GetLogicalPosition () no evento, mas quer um DC eo melhor que eu fui capaz de fazer é obter a mesma informação que GetPosition (), por isso não deve ser alimentando-se o direito um.

Eu também tentei HtmlWindow.CalcScrolledPosition (), mas, aparentemente, que não está disponível em HTMLWindow porque eu recebo um NotImplementedError ...

O que eu gostaria é uma posição de rolagem que pode ser derivada da MouseEvent, ou a informação OnLinkClicked.

Eu sei sobre HtmlWindow.ScrollToAnchor (), mas é esquisito e inestéticas - Eu preferiria ignorá-lo, se possível, para que eu possa rolar para trás exatamente para onde o usuário clicou

Obrigado!

Foi útil?

Solução

quanto a ter um olhar para o fonte de wxHtmlWindow para inspiração? por exemplo em wxHtmlWindow::LoadPage() : it

// store[s the current] scroll position into history item:
int x, y;
GetViewStart(&x, &y);
(*m_History)[m_HistoryPos].SetPos(y);

Nesta posição de rolagem salvo é usado em wxHtmlWindow::HistoryBack() :

Scroll(0, (*m_History)[m_HistoryPos].GetPos());
Refresh();

para voltar para a posição salva.

Eu diria que este built-in "go-to-the-last-posição-in-window" manipulação não é o "esquisito e inestéticas" a maioria. poderia algo trabalho semelhante para você, também?

Outras dicas

Talvez um pouco tarde, mas com algumas dicas de machado, e algumas dicas de aqui , acho que chamar:

scrollpos = wx.html.HtmlWindow.GetViewStart()[1]

e armazenar isso, e depois fazer um telefonema para:

wx.html.HtmlWindow.Scroll(0, scrollpos)

funciona para mim. Claro, você precisa alterar wx.html.HtmlWindow a uma referência real para uma instância.

Aqui está o que eu estou fazendo para rolar a página para a posição anterior. Eu faço isso para evitar a piscar.

        pos = self.GetViewStart()[1]
        self.Freeze()
        self.SetPage(src)
        if save_scroll_pos:
            self.Scroll(0, pos)
        self.Thaw()

Normalmente, eventos de clique são trigged por eventos MouseUp. Se você seguir a posição do mouse através da captura de eventos MouseDown, você vai saber onde o último clique (MouseUp) aconteceu, e que deverá permitir-lhe reconstruir coisas.

Para este problema particular, você pode ter que fazer um pouco mais de trabalho no MouseDown como verificar se eles estão dentro do controle wxHtmlWindow e em caso afirmativo, em seguida, salvando algo como um número de linha.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top