Je veux faire un panneau avec une bordure épaisse. Puis-je régler cela en quelque sorte?
PS, j’utilise C #. VS 2008.
Jim,
J’ai fait un contrôle utilisateur et donné est un ParentControlDesigner. Comme je l’ai indiqué dans mon commentaire, ce n’est pas une solution parfaite à ce que vous demandez. Mais cela devrait être un bon sharepoint départ. Oh, tout le monde, je l’ai aussi avec une couleur de bordure personnalisable. Un autre poste SO m’a inspiré pour poursuivre sur cette question… C’était plus compliqué que prévu. Pour que les choses soient réorganisées correctement lors du réglage de la taille de la bordure, un appel à PerformLayout est effectué. Le remplacement de DisplayRectangle et l’appel de SetDisplayRectLocation dans OnResize provoquent le repositionnement correct des contrôles enfants. De plus, les contrôles enfants n’ont pas le “0,0” attendu dans le coin supérieur gauche … sauf si la largeur de la bordure est définie sur 0 … Et OnPaint fournit le dessin personnalisé de la bordure.
Bonne chance à toi! Faire des contrôles personnalisés pour les parents est délicat, mais pas impossible.
[Designer(typeof(ParentControlDesigner))] public partial class CustomPanel : UserControl { Color _borderColor = Color.Blue; int _borderWidth = 5; public int BorderWidth { get { return _borderWidth; } set { _borderWidth = value; Invalidate(); PerformLayout(); } } public CustomPanel() { InitializeComponent(); } public override Rectangle DisplayRectangle { get { return new Rectangle(_borderWidth, _borderWidth, Bounds.Width - _borderWidth * 2, Bounds.Height - _borderWidth * 2); } } public Color BorderColor { get { return _borderColor; } set { _borderColor = value; Invalidate(); } } new public BorderStyle BorderStyle { get { return _borderWidth == 0 ? BorderStyle.None : BorderStyle.FixedSingle; } set { } } protected override void OnPaint(PaintEventArgs e) { base.OnPaintBackground(e); if (this.BorderStyle == BorderStyle.FixedSingle) { using (Pen p = new Pen(_borderColor, _borderWidth)) { Rectangle r = ClientRectangle; // now for the funky stuff... // to get the rectangle drawn correctly, we actually need to // adjust the rectangle as .net centers the line, based on width, // on the provided rectangle. r.Inflate(-Convert.ToInt32(_borderWidth / 2.0 + .5), -Convert.ToInt32(_borderWidth / 2.0 + .5)); e.Graphics.DrawRectangle(p, r); } } } protected override void OnResize(EventArgs e) { base.OnResize(e); SetDisplayRectLocation(_borderWidth, _borderWidth); } }
Il suffit d’implémenter l’événement Paint du panneau et de dessiner une bordure. Par exemple:
using System; using System.Drawing; using System.Windows.Forms; using System.Windows.Forms.VisualStyles; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); panel1.Paint += panel1_Paint; } VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.Button.PushButton.Normal); private void panel1_Paint(object sender, PaintEventArgs e) { renderer.DrawEdge(e.Graphics, panel1.ClientRectangle, Edges.Bottom | Edges.Left | Edges.Right | Edges.Top, EdgeStyle.Raised, EdgeEffects.Flat); } } }
Jouez avec les arguments pour trouver quelque chose que vous aimez. Vous devez append du code pour effectuer un repli sur ControlPaint.DrawBorder si les styles visuels ne sont pas activés. Meh
S’il ne s’agit que de présentation, installez un panneau qui remplit le formulaire avec une couleur d’arrière-plan de la couleur de bordure souhaitée et un style de Dock de remplissage. Placez un autre panneau à l’intérieur de celui-ci avec la couleur d’arrière-plan standard et un style de dock de remplissage. Jouez avec le rembourrage et la marge des deux panneaux pour obtenir la taille de bordure souhaitée (j’oublie quel paramètre s’applique correctement au panneau intérieur et au panneau extérieur). Placez vos commandes sur le panneau intérieur. Lorsque les deux panneaux sont définis sur Dock = Remplir, le redimensionnement du formulaire est automatiquement géré pour vous. Vous aurez peut-être besoin d’expérimenter certaines des commandes, mais je l’ai souvent fait sans problèmes pour les fenêtres principales de l’application et les formulaires contextuels.
Ceci est un ancien post mais je le trouve toujours utile. Et je viens de trouver un autre moyen .
ControlPaint.DrawBorder(e.Graphics, control.ClientRectangle, Color.Black, BORDER_SIZE, ButtonBorderStyle.Inset, Color.Black, BORDER_SIZE, ButtonBorderStyle.Inset, Color.Black, BORDER_SIZE, ButtonBorderStyle.Inset, Color.Black, BORDER_SIZE, ButtonBorderStyle.Inset);
C’est en quelque sorte un trucage mais j’ai toujours juste utilisé une étiquette pour chaque bordure latérale. Vous devrez définir la propriété autosize sur false et ancrer un à chaque côté (gauche, droite, haut, bas). Ensuite, définissez simplement la largeur / hauteur / couleur de fond pour faire ce que vous voulez.
Vous pouvez facilement en faire un contrôle utilisateur et simplement exposer certaines propriétés publiques personnalisées afin de définir la largeur / hauteur pour vous et la couleur d’arrière-plan de toutes les étiquettes pour modifier la couleur.