Domanda

Sono solo curioso del controllo mostrato di seguito, la linea retta con l'etichetta accanto.Ho provato a trovare un controllo simile per esso ma non c'era nessuna impostazione della casella di gruppo, quindi invece ho appena creato un GroupBox con un'altezza di 2 che lo replica.

Ma esiste un controllo o un'impostazione effettiva per farlo?E come si chiama il controllo effettivo?

Finestra di dialogo delle proprietà Opzioni Internet

È stato utile?

Soluzione

Spy ++ ci dice che si tratta in realtà di due controlli STATIC (simile a un Label in WinForms).

  • Il primo è semplicemente un normale controllo di testo statico che dice "Home page".

  • Il secondo ha lo SS_ETCHEDHORZ style impostato, che lo fa disegnare come una linea 3D. Sfortunatamente, la possibilità di impostare questo stile non ci viene mostrata dall'interno di WinForms.

Come hai notato nella domanda, ci sono alcuni hack / soluzioni alternative che ci consentono di ottenere un aspetto simile, come la compressione verticale di un controllo GroupBox o l'override del metodo OnPaint di un controllo Label e l'utilizzo della classe ControlPaint per disegnare un confine. Funzionano, ma non mi sono mai piaciuti.

Ma puoi effettivamente impostare tu stesso lo stile SS_ETCHEDHORZ in modo da poter replicare esattamente l'interfaccia utente nativa. Ecco una piccola lezione che fa esattamente questo. Aggiungilo al tuo progetto, compila e dovresti vedere un nuovo controllo apparire nella tua casella degli strumenti chiamato "HorizontalRule". Usalo come faresti con qualsiasi altro controllo!

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);
    }
}

Puoi anche trovare informazioni più dettagliate e codice di esempio aggiuntivo qui su CodeProject .

Altri suggerimenti

Ho avuto lo stesso problema un paio di anni fa e ho finito per tracciare una linea allo scopo.

In effetti ho persino utilizzato un'immagine a linea fissa di larghezza sufficientemente lunga da poter essere utilizzata in tutti i casi mostrando la parte richiesta (larghezza) dell'immagine.

Questa soluzione ha funzionato bene per me da allora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top