S.Raaj Nishanth Ответов: 11

Как сделать родительскую форму MDI прозрачной?


Я хочу сделать родительскую форму MDI непрямоугольной, поэтому я установил фон в виде растрового изображения, которое имеет много красного цвета. Затем я установил ключ прозрачности на красный. Но все же красные области не кажутся прозрачными. Я даже установил свойство display на 16 бит (у меня есть windows XP, sp-3).
Пожалуйста помочь.

11 Ответов

Рейтинг:
85

The Zetta

Ну, я это заметил. поэтому я и работал над этим. и вот результат.

Задайте свойству IsMdiContainer родительской формы значение false. затем замените обработчик событий form_load следующим образом:

<br />
private void Form1_Load(object sender, EventArgs e)<br />
 {<br />
   this.TransparencyKey = Color.FromArgb(255, 220, 33, 55);<br />
   <br />
   MdiClient Client = new MdiClient();<br />
   <br />
   this.Controls.Add(Client);<br />
            <br />
   Form Child = new Form();<br />
   <br />
   Child.Size = new Size(100, 100);<br />
   Child.FormBorderStyle = FormBorderStyle.FixedDialog;<br />
   Child.StartPosition = FormStartPosition.CenterParent;<br />
   Child.MaximizeBox = false;<br />
   Child.MinimizeBox = false;<br />
   <br />
   Child.MdiParent = this;<br />
   this.pictureBox1.Controls.Add(Child);<br />
 <br />
   Child.Show();         <br />
 }<br />


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

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

--------------------
С уважением

Х. Маадани


Рейтинг:
80

The Zetta

Конечно, есть способ, мой друг.

вы всегда можете получить задний цвет MdiClient с помощью этого маленького фрагмента кода :

<br />
MessageBox.Show(string.Format("R = {0}, G = {1}, B = {2}",<br />
 Client.BackColor.R, Client.BackColor.G, Client.BackColor.B));<br />


как вы можете видеть, это (171,171,171).
Так ;

<br />
this.TransparencyKey = Color.FromArgb(255, 171, 171, 171);<br />


будет прозрачна сама форма.

P.S. 1 : Оцените ответы, которые вам помогают, это облегчает жизнь людям, которые приходят посетить этот вопрос. и, конечно же, выбор ответа в качестве решения поможет в этом. :)

P.S. 2 : я опубликовал ваш вопрос и ответы в виде статьи для всех желающих. посетите его по адресу
Создание прозрачной родительской формы MDI[^]

------------------
С уважением

Х. Маадани


Рейтинг:
2

The Zetta

Я согласен с Суперменом, однако мы можем сделать это и с помощью прозрачности.

вот небольшой пример. Я создал png-файл с помощью photoshop и заполнил области, которые я хотел, красным цветом, который я мог видеть, что такое его ARGB equilant. Итак, в событии загрузки формы я установил ключ прозрачности формы на этот цвет ARGB.

http://rapidshare.com/files/340223944/TransparentSolution.rar[^]


--------------------
С уважением

Х. Маадани


Рейтинг:
2

S.Raaj Nishanth

Спасибо, Маадани. Ваше решение действительно делает мою форму MDI прозрачной. :)
Но есть небольшая проблема :( . как только мы избавимся от клиента, то как я могу ожидать, что MDIform откроет дочернюю форму? Я имею в виду, будет ли работать следующий код

chldForm.MdiParent = this;
           chldForm.Show();


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

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


Рейтинг:
1

S.Raaj Nishanth

Но я попробовал даже такой подход. Я установил правильные цвета и назвал их правильно. Она все еще не прозрачна. Вы пробовали делать то, что сказали в родительской форме MDI? То есть после установки свойства IsMDIContainer в true?


Рейтинг:
1

S.Raaj Nishanth

Большое вам спасибо, Маадани, за то, что вы взяли на себя труд разместить свое заявление в интернете. Это очень ценится.
Но это было не то, что я искал. Наверное, я неправильно сформулировал свой вопрос, и поэтому никто не понял, чего я хочу.
Я уже реализовал то, что написал Маадани и что сказал Супермен. Но все это работает только на "нормальных" формах.
Не могли бы вы рассказать мне, как установить ключ прозрачности для "родительской" формы?
Например, Маадани, не могли бы вы установить свойству "IsMDIContainer" значение true, а затем сказать мне, работает ли форма так, как требуется?


Рейтинг:
1

S.Raaj Nishanth

Спасибо, Маадани. Большое спасибо. :) :) :) Это почти точно то, что я искал :) :)
У меня есть еще одно маленькое сомнение. Вы использовали этот код
этот.TransparencyKey = Цвет.FromArgb(255, 220, 33, 55);
чтобы установить ключ прозрачности, и это работает как шарм! :) Он делает прозрачными все элементы внутри формы, которые имеют этот конкретный цвет. Но есть ли способ сделать прозрачной саму форму? Я спрашиваю об этом потому , что backcolor формы MDIParent не может быть изменен путем установки свойства backcolor и значений, которые вы дали, (255, 220, 33, 55) не совпадайте с цветом по умолчанию формы MDIParent в моей системе.
Я был бы очень благодарен, если бы вы сказали мне, как обойти это.


Рейтинг:
0

«_Superman_»

Вы можете создавать непрямоугольные окна, используя области.
Вот статья, которая демонстрирует это -
Создание растровых областей для форм и кнопок[^]


Рейтинг:
0

The Zetta

Я думаю, проблема в том, что вы "Красный" в picturebox-это не тот "красный", который знает VisualStudio, понимаете? вам нужно будет установить ключ прозрачности точно на тот цвет, который вы используете.

Я сделал это, установив ключ Trnsparency на черный и используя черное заполненное изображение, загруженное в picturebox.

(донно, как добавить фото к моему ответу, иначе бы поставил несколько пиксов.)

----------------------
С уважением

Х. Маадани


Рейтинг:
0

The Zetta

Понял.

дело в том, что когда вы устанавливаете 'IsMDIContaine' в true, элемент управления типа 'MdiClient' предварительно программно добавляется в форму, а его док-станция устанавливается для заполнения. таким образом, он скрывает фон форм и переопределяет любое действие рисования формы.

итак, мое решение простое : избавьтесь от него.

измените form_load на что-то вроде этого :

<br />
foreach (var c in Controls)<br />
{<br />
  if (c is MdiClient)<br />
  {<br />
     var client = (MdiClient)c;<br />
     client.Dispose();<br />
     this.TransparencyKey = Color.FromArgb(255, 220, 33, 55);<br />
     break;<br />
  }<br />
}<br />


и дело сделано.

P.S. : Мне интересно, что вы будете делать с такой формой MDIParent! ;)

---------------------
С уважением

Х. Маадани


Рейтинг:
0

S.Raaj Nishanth

Большое вам спасибо. :) :) :) Это полностью решает мою проблему. :) :) :)

P. S. Я буду ответы из этого момента.....я новичок в проекте кодекса так...

P. P. S Я рад, что вы опубликовали полное решение этой проблемы. Это будет полезно для многих ... и я уверен, что это первое в истории полное решение такой проблемы. problem....at по крайней мере, в сети...