C# Transparent Control Problem

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • HristiyanVasilev
    New Member
    • Jan 2009
    • 3

    C# Transparent Control Problem

    Hello there !
    I'm developing a Windows appliciation that involves so called "Transparen t Controls". As you would probably know, the only ( as far as i know ) way to achieve a fully transparent control in C# is to add the so called "Transparen t style" to your control ("WS_EX_TRANSPA RENT"). There are numerous articles how to achieve this and the method is ALMOST always one and the same:
    Code:
    protected override  CreateParams CreateParams
    {
      get
      {
        CreateParams cp=base.CreateParams;
        cp.ExStyle|=0x00000020; //WS_EX_TRANSPARENT
        return cp;
      }
    }
    protected override  void OnPaintBackground(PaintEventArgs pevent)
    {
      //do not allow the background to be painted 
    }
    And that works fine! ( well .... at least all say that ..... and all the articles say so ), but am i missing something or that method has SOME SERIOUS problems that nobody can see ?
    For example the Z-order. The following piece of code creates simply a transparent control that draws a line accross itself with a random color:
    Code:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing;
    namespace WindowsApplication16
    {
        public class HrisTranspControl : Control
        {
            private Pen _drawingPen;
            public HrisTranspControl()
            {
                Random rnd = new Random();
                this._drawingPen = new System.Drawing.Pen(new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(rnd.Next(0,255),rnd.Next(0,255), rnd.Next(0,255))),5);
            }
            protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams cp = base.CreateParams;
                    cp.ExStyle |= 0x00000020;
                    return cp;
                }
            }
            protected override void OnPaintBackground(PaintEventArgs pevent)
            {
                // Do nothing
            }
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                e.Graphics.DrawLine(_drawingPen, new System.Drawing.Point(0, 0), new System.Drawing.Point(this.Width, this.Height));
            }
        }
    }
    And so ... when u put few "line controls" on top of each other the Z-ORDER goes to hell. You can't change it, its not corrent and it changes randomly each time u select a random "line control".
    I've tried A LOT of methods to fix that ( changing the z-order in background, repainting the actual background because i think its because the background is not drawn ... and so on ). None works. I'm out of ideas and the worst part is i've almost finished the application and right in the end i realize that bug and it kills me.
    Please help !!!

    The "line controls" were added in the order shows 1,2,3 , but the Z-order appears to be different ( 1,3,2 ). In the current case "bring to front" , "send to back" doesnt change the Z-ORDER
  • Plater
    Recognized Expert Expert
    • Apr 2007
    • 7872

    #2
    LineControl? Are you talking about the old VB controls that are no longer supported?
    You said transparent controls, did you mean transparent forms or transparent controls?
    There is a Transparency key that works (albeit "sometimes" ) pretty well.

    Here is a screenshot of one of my forms. The form itself is transparent, as is the background of the Picturebox on the left(so the iamge does not appear square). The control on the right is a regular label.
    Attached Files

    Comment

    • tlhintoq
      Recognized Expert Specialist
      • Mar 2008
      • 3532

      #3
      I don't think HristiyanVasile v's talking about old VB controls. (S)he has created his/her own class, subclassed from control.
      public class HrisTranspContr ol : Control
      This control would be the 'line control' mentioned.

      As near as I can tell it creates a new random colored line every time it is painted. Which means it might make a new random line ever time it is moved, covered/uncovered, resized etc. NOT just when a new instance of the control is created.

      So I don't really know how you could tell the z-order is getting 'messed up' if it is going to keep creating lines at random every time it gets painted.

      Comment

      • HristiyanVasilev
        New Member
        • Jan 2009
        • 3

        #4
        Thank you for the response but unfortunatly you are not right. The contructor is not called every time the control is repainted and so the line does not change its color when the control is repainted.
        Howeever i don't wish to discuss this basic matter. The problem still persists and i'm almost helpless .....
        I'm almost sure that there is a serious problem with that method.
        If someone has any suggestions ... please not hesitate to offer them ....

        Comment

        • Plater
          Recognized Expert Expert
          • Apr 2007
          • 7872

          #5
          Hmm it could be the way your are overriding the CreateParams that is causing it to be wierd.
          The controls do not layer themselves in the order in which they are .Add()'ed to the parent control? (Either by you in your own code or in the designer?)
          Have you played with that myParentControl .Controls.SetCh ildIndex(myTran spControl,0); ?

          Comment

          • HristiyanVasilev
            New Member
            • Jan 2009
            • 3

            #6
            Thank you for your quick reponse !
            Behind the scenes in the "BringToFro nt" and "SendToBack " methods is actually used "SetChildIn dex" , so ... "yes i have played with the SetChildIndex method"
            However there are hundreds of examples where this exact method is used ( overriding the CreateParams and adding the TransparentStyl e ) and neither of them work correctly.
            If anyone has any other suggestions ... please dont hesitate to offer them ...!

            Comment

            • fireghost
              New Member
              • Feb 2010
              • 1

              #7
              i am also working on transparent control
              and also encounter layer problem

              i did search a lot of site but can't find the solution

              only thing to maintain the z-order well is get rid off the transparent property in the custom control.

              when i remark (for control transparent)
              cp.ExStyle = cp.ExStyle Or &H20
              Return cp

              the z-order is fine.

              any solution???

              Comment

              Working...