Question

Juste curieux du contrôle ci-dessous, la ligne droite avec étiquette à côté. J'ai essayé de trouver un contrôle similaire pour cela, mais il n'y en avait pas ni aucun paramètre de boîte de groupe, donc à la place, je viens de faire une boîte de groupe avec une hauteur de 2 qui la reproduit.

Mais y a-t-il un contrôle ou un réglage réel pour ce faire? Et comment s'appelle le contrôle réel?

Internet Options property dialog

Était-ce utile?

La solution

Espion ++ nous dit que ce sont en fait deux séparés STATIC les contrôles (similaire à un Label dans winforms).

  • Le premier est simplement un contrôle de texte statique régulier qui indique "Page d'accueil".

  • Le second a le SS_ETCHEDHORZ style set, ce qui le fait tracer comme une ligne 3D. Malheureusement, la possibilité de définir ce style ne nous est pas exposée à partir de Winforms.

Comme vous l'avez noté dans la question, il existe des hacks / solutions de contournement qui nous permettent d'obtenir un aspect similaire, comme comprimant verticalement un GroupBox contrôler ou remplacer le OnPaint Méthode de A Label contrôler et utiliser le ControlPaint classe pour dessiner une bordure 3D. Ils fonctionnent, mais je ne les ai jamais aimés.

Mais toi boîte Définissez en fait le SS_ETCHEDHORZ Stylez-vous pour que vous puissiez reproduire exactement l'interface utilisateur native. Voici une petite classe qui fait exactement cela. Ajoutez-le à votre projet, compile, et vous devriez voir un nouveau contrôle apparaître dans votre boîte à outils appelée "Horizontalrule". Utilisez-le comme vous le feriez pour n'importe quel autre contrôle!

public class HorizontalRule : Control
{
    private const int FixedHeight   = 2;

    private const int WS_CHILD      = 0x40000000;
    private const int WS_VISIBLE    = 0x10000000;
    private const int SS_ETCHEDHORZ = 0x00000010;
    private const int SS_ETCHEDVERT = 0x00000011;

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ClassName = "STATIC";
            cp.Style = WS_CHILD | SS_ETCHEDHORZ;
            if (this.Visible)
            {
                cp.Style |= WS_VISIBLE;
            }
            return cp;
        }
    }

    protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
    {
        height = FixedHeight;
        base.SetBoundsCore(x, y, width, height, specified);
    }
}

Vous pouvez également trouver des informations plus détaillées et un exemple de code supplémentaire ici sur codeproject.

Autres conseils

J'ai eu le même problème il y a quelques années et j'ai fini par tracer une ligne à cet effet.

En fait, j'ai même utilisé une image de ligne fixe d'une largeur suffisamment longue afin qu'elle puisse être utilisée dans tous les cas en affichant la partie (largeur) requise de l'image.

Depuis, cette solution a bien fonctionné pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top