2010-02-26 3 views
1

Не пугайтесь по длине сообщения, это должно быть довольно простым. Я просто стараюсь быть очень сложным, потому что многие люди неправильно поняли меня, когда я объяснял проблему раньше.WinForm Controls + Transparency

Я искал решение для этого, но я не совсем нашел то, что искал.

Я пытаюсь установить параметры прозрачности для нескольких вложенных элементов управления, которые динамически добавляются во время выполнения. Я пробовал использовать общий прозрачный цвет программы, но кажется, что он рисует прозрачный слой ПОСЛЕ того, как он рисует элемент управления.

Я хочу больше контролировать, какие слои прозрачны, поэтому я могу панели слоев, элементы управления PictureBox с непрямоугольными изображениями и некоторые другие вещи. Я не могу рисовать изображение в событии Paint() (которое я сделал с большим успехом в другом месте), потому что у этих PictureBox есть клики, мыши, контекстное меню и другие связанные с ними вещи.

Таким образом, существуют ограничения.

В приведенном ниже примере WinForm должен подражать книге с «вкладками», чтобы перейти к следующей «главе» и различной графике, отображаемой «в книге». Важные технические бит ниже. Picture (slightly outdated)

FlowLayoutPanel FLP = Большая прямоугольная панель. Я хочу, чтобы он был «полностью прозрачным», потому что он используется только для его возможностей FlowLayout, а также для перемещения/изменения размера множества элементов управления. Он содержит следующие элементы управления.

1) Panel LeftTabs = Панель, содержащая LeftTabs.

2) Панельная книга = Панель, содержащая множество детских элементов управления. Имеет фоновое изображение (здесь нет проблем с прозрачностью, но проблемы с дочерними элементами - проблема).

3) Панель RightTabs = панель, содержащая правые клавиши.

***** Выпуск 1: Прозрачные панели вкладок ***** На вкладках имеются перекрывающиеся элементы управления PictureBox с закругленными углами - вроде как вкладки папок папки. Отсутствующие углы этих вкладок отображают фон элемента управления внизу, а не изображение вкладки next-further-down. На картинке выше я все еще пользовался ручными PictureBoxes, но теперь я перемещаю вкладки в панели вкладок, и я хочу, чтобы фон был прозрачным.

***** Выпуск 2: дочерние элементы управления внутри панели Book ***** Контрольная панель Книга содержит многочисленные дочерние панели (ребенок уровень 1), и каждый из этих содержит другой PictureBox и переменное количество элементов управления NumericUpDown (дочерний уровень 2).
NUDs хороши, но PictureBox (CL2) имеет больше закругленных углов.
Панели (CL1) должны быть полностью прозрачными (только с их использованием для группировки полномочий и логики), но эта прозрачность должна СТОП на уровне панели книг.

Надеюсь, все это имело смысл. Я пробовал множество исправлений в прошлом, прежде чем отказаться от этой проблемы, но теперь я решил сделать это правильно. Я попытался изменить формы элементов управления ([control] .Region), но это решение немыслимо грязно и делает будущие изменения (пользовательские скины) практически невозможными.

+0

Привет, я не вижу ваш пример. Пожалуйста, предоставьте это/ – Ikaso

+0

Вы имеете в виду пример кода? Я разместил фотографию, поэтому могу только предположить, что это то, что вы хотите. Я действительно не * имею * какой-либо код прямо сейчас, потому что я даже не знаю, как * начать попытки *, что я хочу делать. Соответствующий код в настоящий момент ничего не делает, кроме того, динамически добавлять элементы управления к другим элементам управления. Единственное, что я могу придумать, это обработчики событий Paint(), которые я использую для некоторых элементов управления PictureBox, но в основном это просто длинный список команд e.Graphics.DrawImage(). Можете уточнить свой вопрос, пожалуйста? –

ответ

2

Краткая версия:

Я нашел способ решить эту проблему.

Это связано с использованием РЕГИОНА управления.

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

 int SizeW = this.Size.Width; 
     int SizeH = this.Size.Height; 
     int ArcSize = (int)((float)SizeW * 0.40); 

     if (tabType == TabType.LeftTab) 
     { 
      //Make a six-sided polygon, a rectangle with the "outside" corners cut off. 
      //The next step will round the corners with Arcs 
      Point[] points = new Point[] { 
       new Point(SizeW, 0), new Point(ArcSize, 0), 
       new Point(0,ArcSize), new Point(0,SizeH-ArcSize), 
       new Point(ArcSize,SizeH), new Point(SizeW,SizeH)}; 
      Byte[] bytes = new byte[] { 
       1, 1, 
       1, 1, 
       1, 1}; 
      System.Drawing.Drawing2D.FillMode fm = 
       System.Drawing.Drawing2D.FillMode.Winding; 

      System.Drawing.Drawing2D.GraphicsPath tempGP = 
       new System.Drawing.Drawing2D.GraphicsPath(points, bytes, fm); 

      //add the arcs 
      ArcSize = ArcSize * 2; 
      tempGP.AddArc(0, 0, ArcSize, ArcSize, -90, -90); 
      tempGP.CloseFigure(); 
      tempGP.AddArc(0, SizeH - ArcSize, ArcSize, ArcSize, 180, -90); 
      tempGP.CloseFigure(); 

      Region tempRegion = new Region(tempGP); 
      this.Region = new Region(tempGP); 
     }