Comment ajouter un bouton supplémentaire à la fenêtre de la barre de titre?
J'ai vu que certaines applications (peut-être pas .NET applications) qui ont un bouton supplémentaire sur la gauche du bouton de réduction sur le formulaire de la barre de titre? Comment puis-je réaliser cela en C#?
- Notez que vous ne devriez pas faire cela: msdn.microsoft.com/en-us/library/aa974173(v=MSDN.10).aspx – »Ne pas ajouter des contrôles à un cadre de fenêtre. Mettre les commandes dans la fenêtre à la place.«
- J'avoue que parfois les applications que cela peut être gênant, mais certaines applications le font très bien. Comme Ultramon qui met un bouton pour permuter les moniteurs sur le cadre qui a l'air très natif dans Windows 7. Il y a donc des applications qui le font avec goût.
- Office 2007 est également l'ai fait (mais ce n'est pas la première occurrence de l'équipe du Bureau en ignorant les Windows UX lignes Directrices). Encore, que le document est rédigé par des UX de professionnels et de simples développeurs (ou code singes), travaillent dur pour les ignorer. Et pour le bien des utilisateurs, je pense qu'ils devraient juste de suivre les cours, sauf s'ils peuvent amener les gens avec de l'expérience et de connaissances, et – plus important encore – des tests d'utilisabilité, de prouver le contraire.
- Eh bien, c'est pourquoi ils sont des lignes directrices et non des lois. Et si vous lisez l'intégralité de la page, vous verrez de nombreux exemples de cas où Microsoft propres lignes directrices de conception qui ont été une fois considéré comme la voie à suivre, sont maintenant considérés comme des mauvais.
- J'adore les articles quand MME ignorer leurs propres lignes directrices s3.amazonaws.com/github-images/blog/2012/gh4w/makingof/...
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR: Ajout d'une solution qui fonctionne avec Aero activé pour Windows Vista et Windows 7
Non-Aero Solution
La non-zone cliente d'une fenêtre d'interaction est géré par une série de non-client spécifique des messages. Par exemple WM_NCPAINT message est envoyé à la procédure de fenêtre pour la peinture de la zone non client.
Je n'ai jamais fait depuis .NET, mais je soupçonne que vous pouvez annuler la WndProc et gérer les WM_NC* messages d'obtenir ce que vous voulez.
Mise à jour: Depuis que j'ai jamais essayé ce de .NET je suis arrivé quelques minutes et pensé que je pourrais lui donner un coup d'essayer.
Essayer ce sur Windows 7, j'ai trouvé que j'avais besoin de désactiver les Thèmes de la Fenêtre si je voulais OS pour faire la base, le rendu de la zone non client. Voici donc un petit test. J'ai utilisé GetWindowDC pour obtenir le DC de l'ensemble de la fenêtre plutôt que de GetDCEx, c'était juste parce que je pouvais interop que de la mémoire et n'a pas eu de recherche de tout le drapeau des constantes pour GetDcEx. Et bien sûr, le code pourrait faire avec plus de la vérification d'erreur.
Btw. J'ai appelé
DisableProcessWindowsGhosting
, cela va arrêter le système d'exploitation du dessin de la zone non client si l'application prend trop de temps à répondre aux messages de windows. Si vous ne le faites pas, puis, dans certaines situations, la frontière sera renderd mais votre ornements ne sera pas montré. Donc, cela dépend de vos exigences, il est bon pour vous ou pas.Aero solution de prise en charge
Invité par le commentaire de @TheCodeKing, j'ai pensé que je pourrais prendre un autre regard sur cette. Il s'avère que cela peut être fait dans un cadre entièrement documentés, tout en soutenant Aero. Mais ce n'est pas pour les faibles de cœur. Je ne vais pas vous fournir une solution complète ici, il y a encore quelques petits défauts à l'entraînement, mais il ne les notions de base.
Ce code/la solution est basée sur la Win32 exemple qui peut être trouvé à l'emplacement suivant
http://msdn.microsoft.com/en-us/library/bb688195(SV.85).aspx
En principal de ce que vous devez faire est le suivant.
Les étapes ci-dessus vous donnera un windows avec la norme-cadre en verre à l'exclusion du système de menu (Icône de la Fenêtre) et le titre. La minimiser, maximiser et fermer les boutons seront toujours attirés et de travail. Ce que vous ne serez pas en mesure de le faire glisser ou de redimensionner la fenêtre, c'est parce que le cadre n'est pas vraiment là, n'oubliez pas l'espace client couvre la totalité de la fenêtre, nous avons simplement demandé à l'OS pour dessiner le cadre sur la zone client.
Maintenant, vous pouvez dessiner sur la fenêtre comme d'habitude, même sur le dessus du cadre. Vous pouvez même placer des contrôles dans la zone de la légende.
Enfin, permettre à la DWM pour gérer les hit-test pour vous, en appelant DwmDefWindowProc de votre
WndProc
(avant traitement). Elle retourne un booléen indiquant si le DWM géré le message pour vous.WM_NCHITTEST
à ceci:if (callDWP) { callDWP = (ht == Win32Constants.HTNOWHERE); result = new IntPtr(ht); }
pour obtenir l'effet désiré.g.DrawString()
, mais j'ai eu quelques problèmes: Si j'utiliseSetWindowTheme(this.Handle, "", "");
, le titre permettra de montrer exactement, mais la frontière de la forme sera gris. Si j'utiliseSetWindowTheme(this.Handle, "explorer", null);
, le titre ne fait pas apparaître, derrière la barre de titre), mais la frontière de la forme aura pas de changement (défaut de couleur). Comment pourrais-je faire pour afficher le titre par défaut de la couleur? Merci!DwmDefWindowProc
(elle renvoie un booléen pour dire si le message a été traitée). @TheCodeKingJe pense qu'une façon de le faire serait de gérer WM_NCPAINT message (non-client de la peinture) pour dessiner le bouton, et de gérer les non-client de clics de souris à connaître quelqu'un a cliqué sur le "bouton".
Solution Simple:
Étape 1: Créer un Formulaire Windows (ce sera personnalisé de votre barre de titre)
L'étape 2. Dans le que vous souhaitez utiliser ce contrôle personnalisé en ajouter
À votre constructeur... vous pouvez jouer avec les décalages de ce juste tenir dans une position agréable pour mon application
L'étape 3. Ajouter le déplacer l'événement à votre formulaire principal
S'il vous plaît laissez-moi savoir si vous souhaitez une meilleure explication de tout le code ci-dessus.