Question

Arrière-plan:J'ai une petite application de lecture vidéo avec une interface utilisateur inspirée du vénérable Sasami2k, qui vient d'être mise à jour pour utiliser VMR9 (c'est-à-direDirect3D9 avec DirectShow) et soyez moins instable.Actuellement, il s'agit d'une application C++ utilisant Win32 brut, par nécessité :aucune des différentes boîtes à outils ne vaut rien.WPF, en particulier, n’a pas été possible en raison des restrictions de son espace aérien.

OK, donc, maintenant que D3DImage existe, il pourrait être viable de mélanger et faire correspondre D3D/VMR9/DirectShow et WPF.Compte tenu des frustrations passées liées à l'inextensibilité de Win32, cela semble être une bonne chose.

Mais tu sais, je tombe au premier obstacle ici.

Avec Win32, j'ai créé (très facilement) une fenêtre sans bordure qui est redimensionnable, redimensionnée proportionnellement, s'aligne sur les bords de l'écran et occupe tout l'écran (y compris la zone de la barre des tâches) lorsqu'elle est agrandie.C'est une application vidéo, ce sont donc toutes des propriétés plutôt souhaitables.

OK, alors, comment faire la même chose avec WPF ?

Sous Win32, j'utilise :WM_GETMINMAXINFO de contrôler le comportement de maximisation WM_NCHITTEST contrôler le redimensionnement des bordures WM_MOVING contrôler les bords de l’accrochage à l’écran WM_SIZING contrôler le format d’image du redimensionnement

Cependant, en regardant WPF, il semble que les différents événements arrivent trop tard, à moins que je ne comprenne mal la documentation ?

Par exemple, je ne sais pas quand je suis en cours de déplacement, car LocationChanged le dit, il ne se déclenche qu'une fois la fenêtre déplacée (ce qui est trop tard).De même, il semble que StateChanged ne se déclenche qu'une fois la fenêtre restaurée/agrandie (lorsque j'ai besoin des informations avant la maximisation, pour indiquer au système la taille de maximisation correcte).

Et il me semble que j'oublie complètement où le système me parle des redimensionnements.De même pour les tests de réussite.

Alors, euh, est-ce que j'ai raté quelque chose ici, ou est-ce que je n'ai pas d'autre choix que de revenir à l'accrochage du wndproc de cette chose de toute façon ?Puis-je faire ce que je veux sans connecter le WndProc ?

Si je dois utiliser WndProc, je pourrais aussi bien m'en tenir à ma base de code existante ;Je souhaite avoir un code d'interface utilisateur plus simple et plus propre, et s'éloigner du WndProc est fondamental pour cela.

Si je dois connecter le WndProc, je dois me demander...pourquoi?Win32 a les messages de fenêtre de dimensionnement/taille, déplacement/déplacement, changement/changement, et ils sont tous utiles.Pourquoi WPF ne répliquerait-il pas le même ensemble d’événements ?Cela semble être une lacune inutile dans les fonctionnalités.

De plus, cela signifie que WPF est lié à une implémentation spécifique dépendante de USER32.Cela signifie que MS ne peut pas (sous Windows 7 ou 8, par exemple) inverser la couche d'affichage pour rendre WPF "natif" et émuler les HWND et WndProcs pour les applications héritées - même si c'est précisément ce que MS devrait faire.

Était-ce utile?

La solution

Et il me semble que j'oublie complètement où le système me parle des redimensionnements.De même pour les tests de réussite.

Pour le redimensionnement il te manque effectivement le TailleModifiée événement.AFAIK, il n'y a malheureusement pas d'événement OnSizeChanging, OnLocationChanging et OnStateChanging sur un Fenêtre dans .NET


J'ai vu celui-là, mais pour autant que je sache, il ne se déclenche qu'après que la taille a changé, alors que j'ai besoin que l'événement se déclenche pendant le redimensionnement.À moins que je ne lise mal la documentation et que je se déclenche en permanence ?

Il ne tire pas en continu mais vous pouvez probablement utiliser le RedimensionnerDébut et RedimensionnerFin événements et être capable de le faire.


Ne s'agit-il pas d'événements WinForms ?

Hum, tu as raison.

Autres conseils

OK, pour répondre à ma propre question, il me manquait Adorners (je ne suis jamais revenu dans aucune des recherches que j'ai effectuées, donc il ne semble pas qu'ils soient aussi connus qu'ils devraient l'être).

Malheureusement, ils semblent un peu plus complexes que les remplacements WndProc, mais je pense qu'il devrait être possible de les malmener pour qu'ils fassent ce que je veux.

Dans le code, vous pouvez définir la propriété WindowStyle sur "Aucun" et WindowsState sur "Maximized".

Je ne sais pas à quoi ressemblerait le Xaml.

Pouvez-vous peut-être remplacer ArrangeOverride et/ou MeasureOverride pour compenser ces événements de redimensionnement manquants ?La mesure est la première passe et se produit lorsqu'une mise en page doit s'ajuster à une nouvelle taille, c'est donc un peu comme un événement de changement de taille.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top