Pergunta

Fundo:Eu tenho um pequeno aplicativo de reprodução de vídeo com uma UI inspirada no venerável Sasami2k, recém atualizado para usar VMR9 (ou seja,Direct3D9 com DirectShow) e ser menos instável.Atualmente, é um aplicativo C++ usando Win32 bruto, por necessidade:nenhum dos vários kits de ferramentas vale nada.O WPF, em particular, não foi possível devido às suas restrições de espaço aéreo.

OK, agora que o D3DImage existe, pode ser viável misturar e combinar D3D/VMR9/DirectShow e WPF.Dadas as frustrações anteriores com a inextensibilidade do Win32, isso parece ser uma coisa boa.

Mas você sabe, estou caindo no primeiro obstáculo aqui.

Com o Win32, criei (com muita facilidade) uma janela sem borda que pode ser redimensionada, redimensionada proporcionalmente, ajustada às bordas da tela e que ocupa toda a tela (incluindo a área da barra de tarefas) quando maximizada.É um aplicativo de vídeo, então todas essas propriedades são bastante desejáveis.

OK, então, como fazer o mesmo com o WPF?

No Win32, eu uso:Wm_getminMaxInfo para controlar o comportamento maximizar wm_ncittest para controlar as fronteiras redimensionadas wm_moving para controlar o snap-to-escreen-edges wm_sizing para controlar a proporção de redimensionamento

Porém, olhando para o WPF, parece que os vários eventos chegam tarde demais, a menos que eu esteja entendendo mal a documentação.

Por exemplo, não sei quando estou no meio do movimento, pois LocationChanged diz que ele é acionado apenas quando a janela é movida (o que é tarde demais).Da mesma forma, parece que StateChanged só é acionado quando a janela é restaurada/maximizada (quando preciso das informações antes da maximização, para informar ao sistema o tamanho correto da maximização).

E parece que estou ignorando completamente onde o sistema me informa sobre redimensionamentos.Da mesma forma, o teste de sucesso.

Então, uh, estou faltando alguma coisa aqui ou não tenho escolha a não ser voltar a conectar o wndproc dessa coisa de qualquer maneira?Posso fazer o que quiser sem conectar o WndProc?

Se eu tiver que usar o WndProc, é melhor continuar com minha base de código existente;Quero ter um código de UI mais simples e limpo, e abandonar o WndProc é fundamental para isso.

Se eu tiver que conectar o WndProc, devo me perguntar:por que?O Win32 tem mensagens de janela de dimensionamento/dimensionamento, movimentação/movida, pós-mudança/posmudança, e todas elas são úteis.Por que o WPF não replicaria o mesmo conjunto de eventos?Parece uma lacuna desnecessária na funcionalidade.

Além disso, significa que o WPF está vinculado a uma implementação específica dependente do USER32.Isso significa que a MS não pode (no Windows 7 ou 8, digamos) inverter a camada de exibição para tornar o WPF "nativo" e emular HWNDs e WndProcs para aplicativos legados - embora isso seja exatamente o que a MS deveria estar fazendo.

Foi útil?

Solução

E parece que estou ignorando completamente onde o sistema me informa sobre redimensionamentos.Da mesma forma, o teste de sucesso.

Para o redimensionamento, você realmente está perdendo o Tamanho alterado evento.AFAIK, infelizmente não há eventos OnSizeChanging, OnLocationChanging e OnStateChanging em um Janela na rede


Eu vi esse, mas até onde sei, ele só dispara depois que o tamanho muda, enquanto preciso que o evento seja disparado durante o redimensionamento.A menos que eu esteja interpretando mal os documentos e isso realmente dispara continuamente?

Ele não dispara continuamente, mas você provavelmente pode usar o ResizeBegin e RedimensionarFim eventos e ser capaz de fazer isso.


Não são eventos WinForms?

Hum, você está certo.

Outras dicas

OK, para responder à minha própria pergunta, eu estava sentindo falta dos Adorners (nunca voltei em nenhuma das pesquisas que fiz, então não parece que eles sejam tão conhecidos quanto deveriam ser).

Eles parecem um pouco mais complexos do que as substituições do WndProc, infelizmente, mas acho que deveria ser possível manipulá-los para fazer o que eu quero.

No código você pode definir a propriedade WindowStyle como “None” e WindowsState como “Maximized”

Não tenho certeza de como seria o Xaml.

Você pode substituir ArrangeOverride e/ou MeasureOverride para compensar os eventos de redimensionamento ausentes?A medida é a primeira passagem e ocorre quando um layout precisa ser ajustado para um novo tamanho, então é como um evento de mudança de tamanho.

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