Как сделать элемент управления со «стеклянным» фоном? - PullRequest
0 голосов
/ 17 января 2012

У меня есть проект, где мне нужно сделать слои контейнеров.

Контейнер должен иметь что-то вроде:

Form.Opacity = 0;

Пользователь может видеть элементы под верхним слоем, но не может их использовать.

Я видел много примеров с прозрачным фоном, но, по-моему, мне нужно будет перемещать элементы в этом контейнере. Лучше, что я нашел:

class xPanel : Panel
{
  public xPanel()
  {
    SetStyle(ControlStyles.Opaque, true);
  }

  protected override CreateParams CreateParams
  {
    get
    {
      CreateParams createParams = base.CreateParams;
      createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
      return createParams;
    }
  }

  protected override void OnPaint(PaintEventArgs e)
  {
    //PaintParentBackground(e);
    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0, Color.White)),
        0, 0, Width, Height);
  }

  public void InvalidateEx()
  {
    if (Parent == null)
      return;
    Rectangle rc = new Rectangle(this.Location, this.Size);
    Parent.Invalidate(rc, true);
  }
}

Но есть следы при перетаскивании элементов или мигании при перерисовке.

Я не знаю, как решить эту проблему. Есть идеи?

Я использую InvalidateEx (), в:

protected override void OnLocationChanged(EventArgs e)
{
  if (Parent != null)
    ((xPanel)Parent).InvalidateEx();
}

Ответы [ 2 ]

0 голосов
/ 17 января 2012

Если вы сделаете свойства панели BackColor и TransparancyKey одинаковыми, панель будет прозрачной. Но попробуйте выбрать цвет, который обычно не используется.

0 голосов
/ 17 января 2012

Попробуйте добавить

protected override OnPaintBackground(...)
{
    //base.OnPaintBackground(...);
}

Так что не перекрашивайте фон, следует, как минимум, убрать мерцание.

Надеюсь, это поможет.

...