Personnaliser Windows Forme De Barre De Défilement
J'ai cherché sur le world wide web sans réponse adéquate.
Dans mon application Windows Form, je veux changer la largeur de la barre de défilement qui appartient à une FlowLayoutPanel.
La barre de Défilement est ajouté "automatiquement" comme le contenu de la Disposition de Flux de bord est plus la Forme.
De ce que j'ai trouvé sur le web, il semble être difficile.
Est qu'il ya une solution pour cela?
Cheers!
InformationsquelleAutor Anders | 2010-12-01
Vous devez vous connecter pour publier un commentaire.
Non, il n'y a pas moyen de changer la largeur de la barre de défilement s'affichent sur un seul contrôle (bien qu'il y est un système à l'échelle de réglage qui affectera tous les barres de défilement dans toutes les applications).
L'horrible vérité est que l'humble contrôle de barre de défilement est bien plus compliqué qu'il n'y paraît. Fondamentalement, les barres de défilement sur le
FlowLayoutPanel
sont attirés par Windows lui-même (plutôt que de la .NET Framework) en raison de laWS_HSCROLL
et/ouWS_VSCROLL
styles de fenêtre qui sont définies pour le contrôle de derrière les coulisses. LeFlowLayoutPanel
ne fournit pas de toute facilité de changer ou de modifier la façon dont ces barres de défilement sont tirés. Contrairement à d'autres plus avancés des modifications dans les WinForms, il n'y a pas de tels messages, nous pouvons envoyer à la fenêtre du contrôle de la procédure. Et pour aggraver les choses, les barres de défilement sont tirés dans la zone non client de laFlowLayoutPanel
, ce qui signifie que nous ne pouvons pas simplement de remplacer sonPaint
de l'événement et de la poignée de dessin les barres de défilement de nous-mêmes.Malheureusement, si vous voulez vraiment personnaliser vos barres de défilement, vous allez avoir à cacher le haut-barres de défilement et faites rouler votre propre. Il n'est pas aussi difficile qu'il y paraît, cependant, si vous êtes pour elle. Cet article sur CodeProject fournit un bon pied dans la création de votre propre skinnable barre de défilement comme un contrôle de l'utilisateur et de l'utiliser comme un remplacement dans le conteneur de contrôle de votre choix.
Cody Gris de la réponse est correct à 100%, mais je voulais ajouter plus de matériel de référence sur le sujet.
Arrière-plan
La façon dont Windows crée des Formes de barres de défilement est grâce à l'aide de la styles de fenêtre
WS_HSCROLL
etWS_VSCROLL
. Respectivement, ces styles sont responsables de l'activation de l'horizontale et à la verticale des barres de défilement pour uneHWND
. UnHWND
est une ressource native de la poignée pour une "fenêtre", qui en .NET lingo correspond à uneControl
.La pensée d'une API de Windows perspective, nous devons définir des styles de fenêtre au moment de créer le
HWND
. Cela se fait par le biais d'un appel àCreateWindow
,CreateWindowEx
, ouSetWindowLong
. Naturellement, nous pouvons commencer à penser à l'aide de P/Invoke pour nous aider, mais ce ne serait pas un fardeau que cela signifie, nous aurions besoin de re-mettre en œuvre des Formes de Windows à partir de zéro.Heureusement, Windows Forms expose une propriété,
CreateParams
, qui peut être remplacée pour spécifier la fenêtre des styles, entre autresControl
paramètres de création. Cette propriété est à leur tour consommés par l' .NET framework afin qu'il puisse créer leHWND
avec les styles appropriés lors de laControl
est instancié.Personnalisation de la barre de Défilement
Remplacement des Fenêtres des fonctionnalités de l'API pour une barre de défilement est en fait plus simple qu'on peut le croire; cependant, ce n'est pas évident (pour moi, de toute façon, j'ai eu à parcourir .NET de source pour trouver la réponse). Pour ce faire, nous devons choisir la
Control
d'hériter de créer notre propre ScrollableControl. Si nous observons le code source pourSystem.De Windows.Les formulaires.ScrollableControl
, nous voyons les styles suivants sont utilisés:Donc, en bref, lorsque nous étendre à partir de
ScrollableControl
, le natif horizontal et vertical des barres de défilement sont activés en fonction de sa logique interne. Nous avons pu accéder à laScrollableControl
's la poignée de la fenêtre et ensuite appelerSetWindowLong
pour masquer les barres de défilement; cependant, nous avons besoin de garder une trace de tous les endroits queScrollableControl
interagit avec l'API Windows. En fait, il y a une fonction interneControl.UpdateStylesCore()
qui est appelé basée sur si oui ou non les barres de défilement doit être indiqué. Cette fonction de manière efficace réapplique les styles de fenêtres ci-dessus, et il serait probablement préférable de ne pas se battre avec elle. Il serait beaucoup plus propre approche pour se tenir à l'écart de l'API de Windows et d'étendre directement à partir deControl
. Ensuite, nous pouvons fournir toute l'API de nous le désir de.Cela signifie que nous pourrions chercher à re-mise en œuvre:
Sinon, une approche simple pourrait être de créer un nouveau
UserControl
. Cela nous permettrait d'utiliser le concepteur Visual Studio pour simplifier la configuration de notre barre de défilement les boutons et les pistes.Quel chemin est pris, il sera nécessaire de voir comment
ScrollableControl
fonctionne en interne afin d'offrir un confort de l'expérience utilisateur.