Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Transparent control maken

Pagina: 1
Acties:
  • 1.046 views sinds 30-01-2008
  • Reageer

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 11:20
Ik probeer een transaparant control te maken, omdat hij over een ander control geplaatst wordt en hier en daar wat custom dingen moet painten. Volgende de msdn zou het zo moeten werken:
C#:
1
2
3
4
5
public TransparentControl()
{
    SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    BackColor = Color.Transparent;
}

Op de een of andere manier werkt dit niet. Na wat googelen kwam ik ook deze opties nog tegen:
C#:
1
2
3
4
5
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.Opaque, false);

UpdateStyles();

Maar het stomme ding blijft niet-transaparant. Als het zo simpel in de msdn staat kan ik dit toch niet verkeerd doen? Wat zie ik over het hoofd?

[ Voor 5% gewijzigd door sig69 op 29-11-2007 10:56 ]

Roomba E5 te koop


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Dit is inderdaad wat ik ook gebruik:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public partial class MyControl : UserControl
{
    public MyControl()
        : base()
    {
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
    }
}


Misschien dat de OnPaint overriden de truuk doet.

[ Voor 5% gewijzigd door riezebosch op 29-11-2007 11:36 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 28-11 11:54

Koppensneller

winterrrrrr

offtopic:
Het is transparant, dus niet transaparant...

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 11:20
riezebosch schreef op donderdag 29 november 2007 @ 11:35:
Dit is inderdaad wat ik ook gebruik:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public partial class MyControl : UserControl
{
    public MyControl()
        : base()
    {
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
    }
}
Helpt ook niet
Misschien dat de OnPaint overriden de truuk doet.
OnPaint heb ik uiteraard overridden, aangezien daar m'n custom paint code moet komen.
KoppenSneller schreef op donderdag 29 november 2007 @ 11:37:
offtopic:
Het is transparant, dus niet transaparant...
offtopic:
Weet ik, TR was al gemaakt.


Dit is m'n class nu:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    class TransparentControl : Control
    {
        public TransparentControl()
        {
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

//          SetStyle(ControlStyles.Opaque, false);
//          SetStyle(ControlStyles.SupportsTransparentBackColor, true);
//          BackColor = Color.Transparent;
//          UpdateStyles();
        }


        protected override void OnPaint(PaintEventArgs e)
        {
            Size s = TextRenderer.MeasureText("AA", Font);
            e.Graphics.DrawLine(new Pen(Brushes.Black), s.Width, 0, s.Width, Height);
        }
    }

[ Voor 40% gewijzigd door sig69 op 29-11-2007 11:46 ]

Roomba E5 te koop


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Merk trouwens op dat ik wel drie andere styles set dan jij. Ik doe geen UserPaint.

[ Voor 66% gewijzigd door riezebosch op 29-11-2007 11:49 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • DaRace
  • Registratie: Juni 2001
  • Laatst online: 03-10-2023
ik weet niet of dit relevant is, maar bij een transparante FORM in VB.NET stel je de property 'transparancykey' in op de kleur die als transparant gerenderd moet worden. Heb je daar misschien wat aan?

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Sorry, ik heb even wat dingen door elkaar gehaald. Bij mij werkte het omdat ik de Region van het control ook aanpas. Daarom hoeft mijn control niet transparent te zijn.

Een andere oplossing, zoals jij die nu zoekt, is inderdaad de background transparent te maken, maar dan kan je geen OptimizedDoubleBuffering meer gebruiken. Dit is dan de combinatie:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class TransparentUserControl : UserControl
{
    public TransparentUserControl()
    {
        SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        SetStyle(ControlStyles.UserPaint, true);
        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x20;
            return cp;
        }
    }
}

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
DaRace schreef op donderdag 29 november 2007 @ 11:52:
ik weet niet of dit relevant is, maar bij een transparante FORM in VB.NET stel je de property 'transparancykey' in op de kleur die als transparant gerenderd moet worden. Heb je daar misschien wat aan?
Volgens mij geldt dat alleen voor Forms en niet voor Controls.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 11:20
DaRace schreef op donderdag 29 november 2007 @ 11:52:
ik weet niet of dit relevant is, maar bij een transparante FORM in VB.NET stel je de property 'transparancykey' in op de kleur die als transparant gerenderd moet worden. Heb je daar misschien wat aan?
Nee, want alles met de kleur van de TransaparencyKey wordt volledig transparant, je kijkt dan als het ware door het form heen. Ik wil alleen het control transparant maken.

@riezebosch: wat houdt "0x20" hier in?

Roomba E5 te koop


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Transparent maken doe je toch gewoon met de Opacity property? Zet deze op 0% procent en je ziet het formulier (en daarmee alles wat erop staat) niet meer.

If it isn't broken, fix it until it is..


  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 28-11 11:54

Koppensneller

winterrrrrr

Niemand_Anders schreef op donderdag 29 november 2007 @ 12:05:
Transparent maken doe je toch gewoon met de Opacity property? Zet deze op 0% procent en je ziet het formulier (en daarmee alles wat erop staat) niet meer.
Het gaat hier om een control, niet om een form :).

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
sig69 schreef op donderdag 29 november 2007 @ 11:59:
[...]

Nee, want alles met de kleur van de TransaparencyKey wordt volledig transparant, je kijkt dan als het ware door het form heen. Ik wil alleen het control transparant maken.

@riezebosch: wat houdt "0x20" hier in?
@sig69: WS_EX_TRANSPARENT

@Niemand_anders: Waarschijnlijk is het alleen de bedoeling dat de background transparent wordt ;)

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 11:20
Nog wat verder gegoogeld en dit werkt uiteindelijk (min of meer):
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    class TransparentControl : UserControl
    {
        public TransparentControl()
        {
//          SetStyle(ControlStyles.UserPaint, true);
//          SetStyle(ControlStyles.AllPaintingInWmPaint, true);
//          SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

//          SetStyle(ControlStyles.Opaque, false);
//          SetStyle(ControlStyles.SupportsTransparentBackColor, true);
//          BackColor = Color.Transparent;
//          UpdateStyles();
        }

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x20;
                return cp;
            }
        }

        protected override void OnPaintBackground(PaintEventArgs e)
        {
            
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            Size s = TextRenderer.MeasureText("AA", Font);
            e.Graphics.DrawLine(new Pen(Brushes.Black), s.Width, 0, s.Width, Height);
        }
    }

Alleen het repainten gaat niet goed, flikkeringen ed. Misschien moet ik toch nog maar even verder kijken naar een andere opossing.

Roomba E5 te koop

Pagina: 1