Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прозрачный контрол, Как сделать круглую кнопку? 
V
    Опции темы
ZUBR80
Дата 20.9.2005, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 17.5.2005

Репутация: нет
Всего: 2



В форме можно установить TransparencyKey...
А можно нечто подобное установить у контрола?
PM MAIL   Вверх
mr.DUDA
Дата 21.9.2005, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Можно попробовать выставить у контрола стиль ControlStyles.SupportsTransparentBackColor, и задать полностью прозрачный BackColor:
Код

    public class UserControl1 : System.Windows.Forms.UserControl
    {
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad (e);

            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            this.BackColor = Color.Transparent;
        }



Всё, теперь у контрола прозрачный бэкграунд.


--------------------
user posted image
PM MAIL WWW   Вверх
amarenkov
Дата 10.4.2008, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

Репутация: нет
Всего: нет



Цитата(mr.DUDA @  21.9.2005,  19:35 Найти цитируемый пост)
Всё, теперь у контрола прозрачный бэкграунд. 


Что-то совсем не прозрачный. Он начинает брать цвет фона у родителя и все. То есть, элементы управления под ним он продолжает зарисовывать (но теперь цветом родителя smile ). Как-нибудь это можно побороть? 
PM MAIL ICQ   Вверх
vponomarov
Дата 10.4.2008, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 5
Всего: 12



неплохая реализация круглых кнопок
Vista Style Buttons


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Walker
Дата 10.4.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 23.10.2006

Репутация: 3
Всего: 16



Как вариант: я для подготовки фигурных элементов управления брал на вооружение формат gif - возможность прозрачного фона и статью Creating Bitmap Regions for Forms and Buttons

Это сообщение отредактировал(а) Walker - 10.4.2008, 12:15


--------------------
"От вчерашних побед остаётся усталость, если завтрашний день не сулит ничего..."
PM MAIL   Вверх
amarenkov
Дата 10.4.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

Репутация: нет
Всего: нет



Спасибо, Walker, сейчас попробую. Просто интересно: при банальном создании пользовательского компонента в среде Visual Studio 2008 никак нельзя ему сделать фон просто прозрачным? 
PM MAIL ICQ   Вверх
Kefir
Дата 10.4.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



Цитата(amarenkov @  10.4.2008,  10:54 Найти цитируемый пост)
Что-то совсем не прозрачный. Он начинает брать цвет фона у родителя и все. То есть, элементы управления под ним он продолжает зарисовывать (но теперь цветом родителя smile ). Как-нибудь это можно побороть?  

ну, собственно, это и есть смысл прозрачности. фон кнопки прозрачен, а под кнопкой лежит форма (к примеру), а значит, через кнопку начинает "просвечивать" фон родителя.
PM MAIL WWW Skype   Вверх
amarenkov
Дата 10.4.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

Репутация: нет
Всего: нет



Ну нет, Kefir. Смысл прозрачности, для меня, это, когда через компонент видно все, что находится под ним, а не тупо цвет формы. У меня такой компонент (см. прикрепленный файл). Все, что там белое - должно быть прозрачным. Я попробовал, как советовал Walker, но это слишком тяжко в моем случае. Нельзя ли как-нибудь при создании компонента что-нибудь указать, чтобы Windows ничем не заполняла область контрола?

Присоединённый файл ( Кол-во скачиваний: 48 )
Присоединённый файл  Control.JPG 4,22 Kb
PM MAIL ICQ   Вверх
Kefir
Дата 10.4.2008, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



нет, имхо, нельзя сказать, что "вот тут прозрачность через всю программку". надо делать эту область прозрачной везде до твоего контрола. если же тебе надо просто как отдельную форму - ставь форму просто прозрачную а на ней уже делай кнопки, у которых фон - PNG картинка. или же если у тебя это занимает только часть формы (т.е. на остальном пространстве формы есть что-то ещё, что требует наличие обычного фона - делай TransparencyKey у формы. то есть ставь фон - картинку, где область прозрачности имеет цвет TransparencyKey. и уже на эту область ставь кнопки.

Добавлено через 1 минуту и 15 секунд
может и можно как то идти из самого контрола по всем родителям и с ними уже заморачиваться, но это, по-моему, ужасно  smile 
PM MAIL WWW Skype   Вверх
amarenkov
Дата 10.4.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

Репутация: нет
Всего: нет



Как-то мы не можем найти общего языка smile. Мне вовсе не нужна прозрачность через всю программу. Мне нужно так: есть форма, на ней имэдж, на котором что-то изображено. Над имэджем есть мой контрол. Я хочу через свой контрол видеть то, что изображено на имэдже. Вот smile.

Добавлено через 4 минуты и 29 секунд
А сейчас получается так:

с использованием
Цитата(mr.DUDA @  21.9.2005,  19:35 Найти цитируемый пост)
 
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent;

вместо имеджа, я вижу цвет формы. Просто цвет формы под моим компонентом;

с использованием
Цитата(Walker @  10.4.2008,  12:14 Найти цитируемый пост)
Creating Bitmap Regions for Forms and Buttons

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

PM MAIL ICQ   Вверх
vponomarov
Дата 10.4.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 5
Всего: 12



amarenkov, попробуй у своего контрола переопределить OnPaintBackground следующим образом:
Код

protected override void OnPaintBackground(PaintEventArgs pevent)
        {
            //Don't allow the background to paint 
        }



--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Kefir
Дата 10.4.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



vponomarov, нет, это неправильно - будет крякозябры рисовать ненужные.


amarenkov, всё, теперь я понял о чём ты. так вот, должен тебя огорчить - это невозможно.
вкратце: эта прозрачность - не совсем прозрачность в полном смысле. на месте этой самой "прозрачности" будет то, находится на родителе, не более. т.е. если у тебя структура такая:
- Форма
    - Картинка
    - Твой контрол

То ВСЕГДА будет форма - в .НЕТе нет возможности сделать то, что ты хочешь. Однако, можно изгалится - поставить, к примеру, картинку фоном формы. или же фоном родителя твоего контрола - тогда должно быть то, что ты хочешь.
Итог: твой контрол опрашивает фон его родителя, ему наплевать на детей его родителя - они никогда не будут показаны в прозрачном месте.

То есть возможные варианты:
- Форма с фоном Картинка
     - Твой контрол

Или:
- Форма
    - Панель с фоном Картинка
        - Твой контрол

И так далее.

http://www.experts-exchange.com/Programmin...Q_20492791.html
Цитата

Ok, here's another nugget that I found from reading the docs:

"If the SupportsTransparentBackColor bit is set to true, and the BackColor is set to a color whose alpha component is less than 255, OnPaintBackground will simulate transparency by asking its parent control to paint the background. This is not true transparency.

>>>>>>>>>
Note   If there is another control between the control and its parent, the current control will not show the control in the middle.
<<<<<<<<<"

I think that last "Note" is the clincher.

I played around with some user controls and every time the user control picked up the background color of the form or container it was in. However, it wasn't transparent and controls underneath were hidden.

According to the "Note" above, there is no way using built-in .NET stuff to do transparency to allow controls underneath to show through.

This is most unfortunate news. Basically, you're required to user-paint and grab the pixels beneath you and lift them up.


Это сообщение отредактировал(а) Kefir - 10.4.2008, 14:22
PM MAIL WWW Skype   Вверх
amarenkov
Дата 10.4.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

Репутация: нет
Всего: нет



Спасибо, Kefir.

Итак, вот что я в итоге сделал (проверено, работает):

Код

        private void WindRoseControl_Paint(object sender, PaintEventArgs e)
        {
            if (fenm_transparency == Transparency.RedrawingChilds)
            {
                Control tmp_cntr;
                Bitmap btm = new Bitmap(Width, Height);
                Graphics graphics = Graphics.FromImage(btm);
                Bitmap tmp_btm;

                int i = 0;
                while (i < Parent.Controls.Count)
                {
                    tmp_cntr = Parent.Controls[i];
                    if (tmp_cntr != this && tmp_cntr.Bounds.IntersectsWith(Bounds))
                    {
                        tmp_btm = new Bitmap(tmp_cntr.Width, tmp_cntr.Height);

                        tmp_cntr.DrawToBitmap(tmp_btm, new Rectangle(0, 0, tmp_cntr.Width, tmp_cntr.Height));
                        graphics.DrawImage(tmp_btm, tmp_cntr.Left - Left, tmp_cntr.Top - Top);
                    }
                    i++;
                }

                e.Graphics.DrawImage(btm, 0, 0);
            }
...


Таким образом я отрисовываю всех "братьев" для этого компонента. Получается вполне реалистичная прозрачность. Надо только в этот кусок вставить ограничение, чтобы отрисовывались только низлежащие и в правильном порядке. И еще где-то при создании компонента надо на все низлежащие компоненты повесить обработчик события Invalidated, чтобы корректно обрабатывать изменение внешнего вида контролов под моим.

Подводя итог, скажу, что ... попробую я лучше с регионами, как предлагалось несколькими постами выше smile. 
PM MAIL ICQ   Вверх
shamahn
Дата 13.5.2010, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 13.5.2010

Репутация: нет
Всего: нет



я нашел другой подход в 1 строку:
в инициализации компонента ставим 
this.BackgroundImage = null;
только при перемещении возможна неплавная отрисовка
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.