Gennemsigtig baggrund for tabkontrol i Windows-formularer ce

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at tilpasse tabkontrol i kompakte rammer, men jeg kan ikke finde løsning til indstillet gennemsigtig baggrund for denne kontrol. Jeg forsøger at tilsidesætte 'OnPaintBackground ()' metoden for at starte sæt baggrund på den, men denne funktion kaldes ikke. Hvordan kan jeg bruge denne funktion til at blive kaldt, når kontrollen er oprettet?

Bedste reference


REDIGER : Jeg læser din kommentar om at forsøge at indstille beholderens baggrundsfarve, ikke de enkelte faner, og jeg gjorde nogle eksperimenter og undersøgelser.


Det ser ud til, at OnDrawItem-metoden i TabControl-klassen bruges til at tegne fanen 'headers' (den del af kontrollen, der indeholder hver fane tekst, som brugeren klikker på for at vælge faner) samt baggrunden for container (alt udover den valgte fanes indhold, som tegnes af fanen selv i sin OnPaintBackground-metode).


Du kan få baggrunden for TabControl til at være gennemsigtig ved at overstyre sin OnDrawItem metode, men blot at fylde de grænser, der er bestået med DrawItemEventArgs, vil også gøre faneoverskrifterne gennemsigtige, så de ikke kan klikkes (klikket vil gå gennem formularen, på hvad som helst bag den).


Den måde jeg ser det på, har du fået et par muligheder for at forsøge at arbejde rundt på dette:



  1. Ryd grænserne til OnDrawItem, og gentag derefter hver TabPage-overskrift manuelt. Dette er en smerte, fordi der ikke er nogen måde at få hver fanens overskrift uden at beregne det manuelt ved hjælp af sidens tekst, dens skrifttype størrelse, dens grænser, og hvem ved hvad der ellers. Der synes ikke at være nogen udsatte API'er til tegning af TabPages-overskrifterne separat fra TabControls baggrund.

  2. I stedet for at gøre TabControls baggrund og TabPages-overskrifterne helt gennemsigtige, skal du kun gøre dem halvgennemsigtige, så overskrifterne kan klikkes. Dette kan måske ikke se så smukt ud, men det er meget lettere end den første mulighed. For at gøre dette skal du sætte formularens AllowTransparency-egenskab til sand og bruge koden nedenfor:



    class TransparentisTabControl : TabControl
    {
        //Without declaring this as new, you'd probably get a warning saying this property hides a member of the base class.
        //The base class's BackColor property, as I'm sure you've found out,
        //is hidden with attributes anyway, so it doesn't really matter.
        public new Color BackColor {get; set;}

        public TransparentishTabControl(Color backColor)
        {
            if (backColor.A == 0)
                throw new ArgumentException("The alpha component of backColor cannot be zero, or this TransparentisTabControl's tab pages won't be selectable.");
            BackColor = backColor;
        }

        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            base.OnDrawItem(fake);
            e.Graphics.Clear(BackColor);
        }
    }


Denne kode fungerer fint for mig, men det kan opføre sig anderledes på din målplatform. Lad mig vide, om du har brug for mere hjælp/afklaring :)


Forsøger du at gøre fanekontrollen gennemsigtig, eller de enkelte fanesider? Overstyrende OnPaintBackground i en TabControl-drevet klasse er ikke nok, fordi hver TabPage maler sig selv. Du har brug for en brugerdefineret klasse, der er afledt af TabPage og har en tilsidesættelse af OnPaintBackground.


    class TransparentTabPage : TabPage
    {
        public TransparentTabPage()
            : base("TransparentTabPage")
        {

        }

        protected override void OnPaintBackground(PaintEventArgs e)
        {
            base.OnPaintBackground(e);

            Form form = FindForm();

            e.Graphics.CompositingMode = CompositingMode.SourceCopy;
            using (SolidBrush sb = new SolidBrush(form.TransparencyKey))
                e.Graphics.FillRectangle(sb, Bounds);
        }
    }


For at dette skal fungere, skal din formular have sin TransparencyKey indstillet til noget, og værdien af ​​dens AllowTransparency-egenskab skal være sand.


Andre referencer 1


Jeg kan ikke finde ondrowitem i tabkontrol for at tilsidesætte det. Windows CE-miljø (smartDevice) understøtter ikke alle funktionaliteter i Windows-formularer