Очистить фон прозрачного пользовательского контроля - PullRequest
2 голосов
/ 10 декабря 2011

Я работаю над ImageButton, в котором я рисую каждое состояние (у меня есть несколько изображений для каждого состояния) этой кнопки (например, mouseOver, mouseDown и т. Д.).

Я установил контрольпрозрачный, используя этот код:

public ImageButton()
{
  InitializeComponent();

  this.SetStyle(ControlStyles.Opaque, true);
  this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
}

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

Но есть проблема, после нескольких переключателей состояния, углы становятся острыми и уродливыми, чтобы решить эту проблему, мне нужно очистить фон, но если мой контроль прозрачен, то это невозможно.

Я пробовал это решение: Очистка графики прозрачной панели C # , но она медленная и заставляет мерцание элемента управления.

У вас есть идеи, как очиститьэтот фон и сохранить прозрачность контроля?

1 Ответ

1 голос
/ 10 декабря 2011

Хорошо, я решил эту проблему. Я решил эту проблему, установив элемент управления не прозрачным, и рисую холст, который находится под моим контролем, в качестве фона моего ImageButton.

Решение (в событии Paint):

//gets position of button and transforms it to point on whole screen
//(because in next step we'll get screenshot of whole window [with borders etc])
Point btnpos = this.Parent.PointToScreen(new Point(Location.X, Location.Y));

//now our point will be relative to the edges of form  
//[including borders, which we'll have on our bitmap]
if (this.Parent is Form)
{
      btnpos.X -= this.Parent.Left;
      btnpos.Y -= this.Parent.Top;
}
else
{
    btnpos.X = this.Left;
    btnpos.Y = this.Top;
}

//gets screenshot of whole form
Bitmap b = new Bitmap(this.Parent.Width, this.Parent.Height);
this.Parent.DrawToBitmap(b, new Rectangle(new Point(0, 0), this.Parent.Size));

//draws background (which simulates transparency)
e.Graphics.DrawImage(b,
                new Rectangle(new Point(0, 0), this.Size),
                new Rectangle(btnpos, this.Size),
                GraphicsUnit.Pixel);

//do whatever you want to draw your stuff

PS. Это не работает во время разработки.

...