Domanda

Sfondo:Ho una piccola app per la riproduzione di video con un'interfaccia utente ispirata al venerabile Sasami2k, appena aggiornata per utilizzare VMR9 (ovveroDirect3D9 con DirectShow) ed essere meno instabile.Attualmente è un'app C++ che utilizza Win32 raw, per necessità:nessuno dei vari toolkit vale niente.Il WPF, in particolare, non è stato possibile a causa delle limitazioni dello spazio aereo.

OK, ora che esiste D3DImage potrebbe essere fattibile combinare D3D/VMR9/DirectShow e WPF.Date le frustrazioni passate legate all'inestensibilità di Win32, questa sembra una buona cosa.

Ma sai, sto cadendo al primo ostacolo qui.

Con Win32 ho creato (molto facilmente) una finestra senza bordi che è ridimensionabile, si ridimensiona proporzionalmente, si aggancia ai bordi dello schermo e occupa l'intero schermo (inclusa l'area della barra delle applicazioni) quando è ingrandita.È un'app video, quindi queste sono tutte proprietà piuttosto desiderabili.

OK, quindi, come fare lo stesso con WPF?

In Win32, utilizzo:Wm_getminmaxinfo per controllare il comportamento massimizza wm_nchittest per controllare i bordi di ridimensiona wm_moving per controllare gli bordi snap-to-screen wm_size per controllare il rapporto di ridimensiona

Tuttavia, guardando WPF sembra che i vari eventi arrivino troppo tardi, a meno che non abbia frainteso la documentazione?

Ad esempio, non so quando sono a metà spostamento, poiché LocationChanged dice che si attiva solo una volta che la finestra si è spostata (che è troppo tardi).Allo stesso modo, sembra che StateChanged si attivi solo una volta che la finestra è stata ripristinata/ingrandita (quando ho bisogno delle informazioni prima dell'ingrandimento, per indicare al sistema la dimensione di ingrandimento corretta).

E mi sembra di trascurare completamente il punto in cui il sistema mi indica il ridimensionamento.Allo stesso modo l'hit test.

Quindi, mi sto perdendo qualcosa o non ho altra scelta che tornare comunque ad agganciare il wndproc di questa cosa?Posso fare quello che voglio senza agganciare WndProc?

Se devo usare WndProc, potrei anche restare con la mia base di codice esistente;Voglio avere un codice dell'interfaccia utente più semplice e pulito e allontanarsi da WndProc è fondamentale per questo.

Se devo collegare WndProc, devo chiedermi:Perché?Win32 ha i messaggi di finestra dimensionamento/dimensionamento, spostamento/spostamento, poschanging/poschanged e sono tutti utili.Perché WPF non dovrebbe replicare lo stesso insieme di eventi?Sembra una lacuna inutile nella funzionalità.

Inoltre, significa che WPF è legato a un'implementazione specifica dipendente da USER32.Ciò significa che MS non può (ad esempio in Windows 7 o 8) invertire il livello di visualizzazione per rendere WPF "nativo" ed emulare HWND e WndProcs per app legacy, anche se questo è esattamente ciò che MS dovrebbe fare.

È stato utile?

Soluzione

E mi sembra di trascurare completamente il punto in cui il sistema mi indica il ridimensionamento.Allo stesso modo l'hit test.

Per il ridimensionamento infatti ti manca il file Taglia modificata evento.Per quanto ne so, purtroppo non esiste alcun evento OnSizeChanging, OnLocationChanging e OnStateChanging su a Finestra in .NET


L'ho visto, ma per quanto ne so si attiva solo dopo che le dimensioni sono cambiate, mentre ho bisogno che l'evento si attivi durante il ridimensionamento.A meno che non stia confidando male ai documenti e in realtà si accende continuamente?

Non si attiva continuamente ma probabilmente puoi usare il RidimensionaInizia E RidimensionaFine eventi ed essere in grado di farlo.


Non sono eventi WinForms?

Hmm, hai ragione.

Altri suggerimenti

OK, per rispondere alla mia domanda, mi mancavano gli Adorner (non sono mai tornati in nessuna delle ricerche che ho fatto, quindi non sembra che siano così conosciuti come forse dovrebbero essere).

Sfortunatamente sembrano piuttosto più complessi delle sovrascritture di WndProc, ma penso che dovrebbe essere possibile gestirli per fare ciò che voglio.

Nel codice puoi impostare la proprietà WindowStyle su "None" e WindowsState su "Maximized"

Non sono sicuro di come sarebbe Xaml.

Puoi forse sovrascrivere ArrangeOverride e/o MeasureOverride per compensare gli eventi di ridimensionamento mancanti?La misurazione è il primo passaggio e si verifica quando un layout deve essere adattato per una nuova dimensione, quindi è un po' come un evento di modifica delle dimensioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top