4

Est-il possible de faire un GroupBox qui ressemble à l'image ci-dessous?Comment créer un GroupBox non rectangulaire personnalisé?

Si ce n'est pas possible avec les contrôles natifs, y a-t-il des contrôles personnalisés et gratuits qui pourraient supporter cela?

alt text

+0

Haha. Non. Changez la disposition de vos contrôles. Sinon, vous le dessinerez vous-même avec 'ControlPaint.DrawBorder3D'. Les gens créent des contrôles qui, selon eux, seront réellement utiles; ce n'est pas. –

+3

@HPT: 1. Ceci est un contrôle étrange, il est donc très peu probable que quelqu'un l'ait jamais envisagé. 2. En demandant "comment puis-je faire X", nous ne savons rien de vos compétences. Avez-vous créé des contrôles personnalisés avant? Ou avez-vous besoin de nous tenir la main pendant l'installation de Visual Studio? Si vous êtes intéressé par des réponses utiles, posez une question utile. – peterchen

+0

@peterchen: Je ne pense pas que SO est pour tenir la main pendant un processus, je viens de chercher une idée pour rendre le développement ou l'implémentation plus rapide, Oui, je sais comment écrire des contrôles personnalisés. –

Répondre

5

Il n'y a pas de contrôle comme l'image que vous avez fait, j'ai une solution non intelligente, mais peuvent correspondre à vos besoins,

Créer un UserControl et mis à l'intérieur deux GroupBox contrôles, alors vous aurez un ligne entre eux, vous pouvez le masquer en ajoutant un panneau au-dessus sans None pour BorderStyle.

Ensuite, vous aurez ce contrôle utilisateur:

alt text

Je sais que ce n'est pas aussi intelligent que vous voulez, mais pourrait-il est plus facile que de dessiner un à partir de zéro et lâche le thème.

Vous pouvez également créer une propriété de titre pour refléter la groupbox verticale comme titre du contrôle utilisateur

public string Title 
{ 
    get { return groupBox1.Text; } 
    set { groupBox1.Text = value; } 
} 

Bonne chance!

+0

ouah! excellent. –

+0

Je suis immédiatement intriguée par les réponses qui suggèrent que leur solution est "non intelligente". Je ne sais pas si cette intrigue est une bonne chose. –

+0

eh bien, c'est * un * kludge. – peterchen

6

Non, un tel contrôle n'existe pas dans le cadre. Vous pouvez en créer un vous-même en créant un contrôle qui hérite de GroupBox.

+5

@HPT: C'est une réponse parfaitement raisonnable à mon humble avis. Il vous a suggéré une solution valide, vous ne pouvez pas prétendre que les gens implémentent même des choses pour vous ou trouver quelque chose qui n'existe probablement pas ... – digEmAll

+2

@HPT, vous demandez "Comment faire un GroupBox comme ça?", Et je répondu à cela. Vous ne posez pas de question spécifique sur la mise en œuvre, donc je ne peux pas y répondre.De plus, je sais pertinemment que cela n'existe pas dans le cadre, alors je voulais inclure cette information pour vous. Comme pour le reste de votre question - vous pouvez facilement Google. Je n'ai rien trouvé de vraiment utilisable. – driis

+0

J'ai googlé avant de poser cette question. SO est un plein de professionnels qui en savent plus que google parfois! –

3

Vous n'allez pas trouver un contrôle comme celui-ci. Vous pouvez en créer un vous-même, la propriété Control.Region vous permet de créer un contrôle non rectangulaire. Vous devrez dessiner le contour et le titre vous-même, dans le contour OnPaintBackground. Mais, de façon réaliste, ce contrôle ne va pas être très intéressant en tant que contrôle réutilisable pouvant être utilisé dans d'autres formulaires ou projets. Gardez à l'esprit qu'il suffit de regarder comme une boîte de groupe pour l'utilisateur. Puisque vous devez écrire le code de dessin vous-même de toute façon, faites-le dans l'événement Paint du formulaire. Si vous avez vraiment besoin d'une boîte à cause des boutons radio, utilisez plutôt un panneau. Gardez la propriété Form.AutoScaleMode à l'esprit, vous ne pouvez pas coder en dur les positions de ligne.

+0

est-il possible de définir la propriété 'GroupBox.Region' sur' GraphicsPath' et dessiner la bordure avec 'ControlPaint'? –

+0

Pas vraiment. GraphicsPath.Widen() va dans le mauvais sens, vous ne pouvez pas le réduire. –

Questions connexes