8
votes

Personnaliser la barre de défilement de formulaire Windows

J'ai cherché le World Wide Web sans réponse appropriée.

dans mon application de formulaire Windows, je souhaite modifier la largeur d'une barre de défilement appartenant à un FlowLayOntPanel.

La barre de défilement est ajoutée "automatiquement" car le contenu du panneau de présentation de débit est plus grand le formulaire.

De ce que j'ai trouvé sur le Web, il semble être délicat.

Y a-t-il une solution à cela?

acclamations!


0 commentaires

3 Réponses :


22
votes

non, il n'y a aucun moyen de changer la largeur d'une barre de défilement affichée sur un seul contrôle (bien qu'il existe un réglage à l'échelle du système qui affectera tous les barres de défilement dans tout Applications).

La vérité laid est que le contrôle de la barre de défilement de faiplesse est beaucoup plus compliqué qu'il n'y paraît. Fondamentalement, les barres de défilement sur le flowlayoutpanel sont dessinés par Windows elle-même (plutôt que la structure .NET) en raison de la ws_hscroll et / ou ws_vscroll ws_vscroll windows styles qui sont définis pour le contrôle dans les coulisses. Le FlowLayOntPanel ne fournit aucune installation pour modifier ou modifier la manière dont ces barres de défilement intégrées sont dessinées. Contrairement aux autres modifications plus avancées de Winforms, aucun message de ce type ne peut envoyer à la procédure de la fenêtre du contrôle. Et pour aggraver les choses, les barres de défilement sont dessinées dans la zone non-client du flowlayoutpanel , ce qui signifie que nous ne pouvons pas simplement remplacer son événement peinture et manipuler les barres de défilement nous-mêmes.

Malheureusement, si vous voulez vraiment personnaliser vos barres de défilement, vous allez avoir à masquer les barres de défilement intégrées et à rouler le vôtre. Ce n'est pas aussi difficile que cela sonne, cependant, Si vous êtes prêt pour cela. Cet article sur codeProject Fournit une bonne promenade sur la création de votre propre barre de défilement skinnable en tant que contrôle de l'utilisateur et utilisez-la comme remplacement dans le contrôle du conteneur de votre choix.


3 commentaires

Merci beaucoup pour la réponse Cody Gray! Je vais regarder dans l'article que vous avez lié. J'espère que cela aident les autres qui recherchent les mêmes informations.


@Anders: Je viens de réaliser que l'article est en C # et que votre question est étiquetée comme vb.net, mais la conversion entre les deux est relativement simple. Si vous rencontrez des ennuis, essayez l'un des convertisseurs en ligne comme celui fourni par DéveloppementFusion . Je suis heureux d'avoir pu aider!


Ouais, ce n'est pas un problème :) Si je peux juste obtenir la logique pour cela, je le ferai moi-même. Ne peut pas être paresseux, vous savez! ;) Merci de m'avoir mis au courant!



3
votes

La réponse de Cody Grey est 100% correcte, même si je voulais ajouter plus de matériel de référence sur le sujet.

Contexte

La manière dont les formulaires de Windows créent des barres de défilement sont via l'utilisation de styles de fenêtre ws_hscroll et ws_vscroll . Respectivement, ces styles sont responsables de l'activation des barres de défilement horizontales et verticales pour un hwnd . Un hwnd est une poignée de ressource native à une "fenêtre" , laquelle dans le lingo .NET correspond à un contrôle .

Penser à une perspective d'API Windows, nous devons définir les styles de fenêtre à l'époque que nous créons le hwnd . Ceci est fait par un appel à créatewindow , créatewindowex ou Setwindowlong . Naturellement, nous pouvons commencer à penser à utiliser p / invoquer pour nous aider, mais cela serait Soyez un fardeau tout comme cela signifie que nous devrions ré-implémenter des formulaires Windows à partir de zéro.

Heureusement, Windows Forms expose une propriété, Creatreparams , cela peut être remplacé pour spécifier les styles de fenêtre exacts, parmi les autres paramètres de création de la création . Cette propriété est à son tour consommée par la structure .NET afin qu'elle puisse créer le hwnd avec les styles appropriés lorsque le contrôle est instancié.

Personnalisation La barre de défilement

Remplacement de la fonctionnalité de l'API Windows pour une barre de défilement est en réalité plus simple qu'il ne semble sembler; Cependant, ce n'est pas évident (bien pour moi de toute façon, je devais passer à la source à la source .net pour trouver la réponse). Pour ce faire, nous devons choisir le contrôle à hériter de créer notre propre ScrollAblecontrol . Si nous observons le code source pour system.windows.forms.scrollablecontrol , nous voyons les styles suivants sont utilisés: xxx

donc, en bref, quand Nous allons à partir de ScrollAblecontrol , les barres de défilement horizontal et verticales natifs sont activées en fonction de sa logique interne. Nous pourrions accéder à la poignée de la fenêtre ScrollAblecontrol puis appelez Setwindowlong pour masquer les barres de défilement; Cependant, nous devrions garder une trace de tous les endroits que ScrollAbecontrol interagit avec l'API Windows. En fait, il existe une fonction interne contrôler.updatestyle () appelé sur la base de la présentation des barres de défilement ou non. Cette fonction réapplique efficacement les styles Windows ci-dessus et il serait probablement préférable de ne pas se battre avec elle. Ce serait une approche beaucoup plus propre de s'éloigner de l'API Windows et de s'étendre directement à partir de Contrôle . Nous pouvons ensuite fournir quelles que soient les API que nous souhaitons avoir.

Cela signifie que nous examinerions la ré-mise en œuvre:

  1. Mise à jour des barres de défilement pour les événements de la molette de la souris.
  2. Mise à jour des barres de défilement basées sur cliquer sur les boutons de barre de défilement personnalisés et les pistes / pouces.
  3. Mise à jour des barres de défilement basées sur l'ajout / la suppression / le déménagement / redimensionner des contrôles d'enfants.
  4. Création de marges de défilement automatique.
  5. contraintes sur la zone du client qui affecte les barres de défilement sont visibles.
  6. et ainsi de suite ...

    Alternativement, une approche simple peut être de créer un nouveau usercontrol . Cela nous permettrait d'utiliser le concepteur Visual Studio pour simplifier la configuration de nos boutons et des pistes de la barre de défilement.

    Le chemin est pris, il sera nécessaire de voir comment ScrollAblecontrol fonctionne en interne dans l'ordre pour fournir une expérience utilisateur confortable.


0 commentaires

1
votes

Ceci si pour C # et par rapport à l'article publié dans la réponse acceptée par Cody Grey https://stackoverflow.com/a/ 4326046/4342139 .Je commentiez directement là-bas, mais je manque de la réputation pour cela.

Si vous êtes comme moi et suivant l'article de la réponse de Cody Gray, puis cacher la barre de défilement que vous seriez en utilisant des panneaux internes et extérieurs. Ce n'est pas une solution optimale et assez franchement 'bizarre et hacky'.J'ai trébubli sur un problème similaire avec une barre de défilement horizontale et a réussi à trouver une solution, et la même chose a fonctionné pour le rouleau vertical. C'est un peu moins hacheur (mais pas par beaucoup) et peut être atteint avec le code ci-dessous: xxx

notes: choisissez VeritCal ou horizontal ou à la fois du code ci-dessus . Il est essentiel d'avoir une autoscroll défini sur FALSE, puis de true comme des paramètres non appliqués ou automatique est désactivé. Réglage des défilations verticales / horizontales Le maximum à 0 semble être la seule chose dont il faut être nécessaire, mais jetant visible à FALSE ne semble pas le faire mal (ne semble pas fonctionner du tout, mais peut-être que je manque quelque chose). < / p>


0 commentaires