WinAPI: Créer de la fenêtre redimensionnable sans barre de titre, mais avec réduire/agrandir/fermer les boutons (comme Firefox/Chrome/Opera)
Si vous regardez les fenêtres des navigateurs Firefox, Chrome ou Opera, vous remarquerez que leur windows
- ont réduire/agrandir/fermer les boutons
- sont redimensionnables
- mais n'ont pas de barre de titre
Je suis intéressé: comment puis-je créer une fenêtre?
Ce que j'ai déjà essayé:
J'ai regardé autour de sur StackOverflow (et googlé, aussi), et trouvé ceci: l'ouverture d'une fenêtre qui n'a pas de barre de titre avec win32
Malheureusement, cela n'a pas aider du tout au tout:
La première étape a été d'étendre la solution proposée sur l'ouverture d'une fenêtre qui n'a pas de barre de titre avec win32
hWnd = CreateWindow(szWindowClass, szTitle, WS_BORDER,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX);
//See remarks on http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545.aspx
SetWindowPos(hWnd, 0,
0, 0, 0, 0, //Position + Size
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
Bien sûr, cela ne produit pas de minimiser/maximiser les boutons, mais d'un autre côté, si je veux minimiser/maximiser les boutons, j'ai à faire:
SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX | WS_MAXIMIZEBOX |
WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION);
Pourquoi cette combinaison semble être nécessaire? D'abord je voudrez probablement WS_MAXIMIZEBOX | WS_MINIMIZEBOX
, car je veux un de ces boutons.
Mais http://msdn.microsoft.com/en-us/library/ms632600.aspx dit que si j'ai mis un de WS_MAXIMIZEBOX
et WS_MINIMIZEBOX
, j'ai aussi de définir WS_SYSMENU
. Et quand je WS_SYSMENU
, j'ai aussi de définir WS_CAPTION
mais ce n'est pas ce que je veux, parce que je voulais éviter la barre de titre (en effet: si WS_CAPTION
n'est pas de jeu, pas de minimiser/maximiser les boutons sont visibles).
Donc ce qui est à faire?
- Cette méthode ne fonctionne pas sur windows 10
Vous devez vous connecter pour publier un commentaire.
Les programmes de supprimer le non-espace client (la barre de titre) et ont un tas de traitement personnalisé pour la reproduction de la fenêtre des boutons, des icônes, menu système etc. L'avantage est qu'ils peuvent tirer de la nouvelle "barre de titre", qui est en fait partie de la norme de la zone cliente, l'ajout d'onglets ou d'autres contrôles personnalisés.
Les deux articles qui suivent vont vous montrer comment faire cela sur Vista et au-dessus (à l'aide du gestionnaire de fenêtrage):
C'est très complexe à faire et à obtenir le droit, de sorte que les deux articles ci-dessus sont d'une valeur inestimable. L'auteur doit mettre beaucoup de travail sur eux! Les deux liens avoir un exemple de code écrit en Delphi, mais il devrait être assez facile de le traduire en C++ - les concepts sont identiques, c'est juste la syntaxe.
Vous pourriez également être intéressé par ressources générales sur le Verre et DWM, puisque c'est étroitement lié. Vous pourrez apercevoir les deux ci-dessus des liens inclus dans cette liste 🙂
Vous pouvez créer une fenêtre avec ou sans légende - ce qui est le plus approprié du point de vue de la personnalisation (qui est "sans" est-ce que tu veux "sans barre de titre" comme vous dites), et de l'importance de la verrue est que vous prenez plus de peinture zone non client - c'est la chose à faire.
À ce stade, il n'existe pas de peindre votre réduire/agrandir les boutons déjà. Cela ne signifie toutefois pas que vous avez à faire de la peinture à partir de rien et imiter l'INTERFACE utilisateur standard. Il est
DrawFrameControl
et les amis de l'API, où vous pouvez utiliserDFCS_CAPTIONMIN
argument et ont bouton réduire peint pour vous. Vous voudrez aussi de répondre à d'autres non-client de la zone de messages, par exemple poignée deWM_NCHITTEST
pour dire à Windows où vos nouveaux boutons de la fenêtre sont.Vous pourriez également vouloir vérifier Les Styles Visuels De Référence à effet de levier thème activé API de dessin tels que
DrawThemeBackground
.Un exemple simple de cette activité est de mettre un bouton supplémentaire sur la légende, tel que décrit en détail ici: CCaptionButton (les boutons de la barre de titre).
Je crois qu'ils créer une fenêtre normale, puis de la peinture sur la barre de titre avec leurs widgets personnalisés/onglets. Cela est évident dans Firefox, comme quand il se bloque, vous pouvez voir la normale de Windows, la barre de titre apparaît sur les onglets.