Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Как сделать градиентную прзрачность


Автор: Empirik 24.11.2005, 11:45
Я обскал MSDN и нашел два случая: как поменять прозрачность всей формы целиком, и как сделать куску формы абсолютно прозрачными. Но мне нужно сделать форму которая в некоторых областях была бы прозрачна, а в некоторых нет. Если у кого-то есть примеры как этого добиться то выложите пожалуйста. За ранее большое спасибо smile

Автор: Гость_Папа 24.11.2005, 12:32
Приветствую.
Это не я придумал, но вроде работает.
Делает форму прозрачной, а не элемент на форме.
Код


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.Visible = False   ' форма не видима, одна картинка в пикчербоксе
        PictureBox1.Top = 0
        PictureBox1.Left = 0
        PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize
        PictureBox1.Image = (Image.FromFile("genie.bmp"))

        Me.BackColor = Color.Magenta               'если указать одинаково свойство magenta в BackColor и в TransparencyKey то
        Me.TransparencyKey = Color.Magenta    'фон формы делается  прозрачным
        Me.FormBorderStyle = FormBorderStyle.None  ' в этом случае не отображается тительбалк и границы формы.

        Me.Visible = True
    End Sub



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

Удачи во всем.

Автор: Гость_Папа 24.11.2005, 12:33
Код VB.NET

Автор: arilou 24.11.2005, 15:32
Empirik
Если я не ошибаюсь, это называется alpha blending. Попробуй в эту сторону покопать. Можно еще посмотреть http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/GDIPlus/usingGDIPlus/fillingshapeswithagradientbrush.asp

Автор: mr.DUDA 26.11.2005, 18:33
Всё правильно пишет Empirik.

Можно сделать всю форму полупрозрачной, тогда все контролы будут с одинаковой прозрачностью, безразлично от того, какой у каждого контрола BackColor-полупрозрачный или нет.

Можно для формы задать ключевой цвет, по которому из формы будут "вырезаны" фрагменты.

Это касаемо того, чего можно добиться стандартными средствами smile

Теперь о нестандартных. В первую очередь в голову приходит следующее: перекрыть метод OnPaint, в котором отрисовывать всю форму самостоятельно. Других вариантов, вроде бы, нет...

Автор: arilou 28.11.2005, 13:31
mr.DUDA
Попробуй в XP'шке передвигать иконки на десктопе и ты заметишь, что они становятся "градиентно-прозрачными", т.е. к центру иконка менее прозрачна чем по краям.

Именно это я имел ввиду.

Автор: mr.DUDA 28.11.2005, 18:24
Цитата(arilou @ 28.11.2005, 12:31)
Попробуй в XP'шке передвигать иконки на десктопе и ты заметишь, что они становятся "градиентно-прозрачными", т.е. к центру иконка менее прозрачна чем по краям.

Ничего подобного не заметил smile
Может, ты имел в виду Longhorn ?

Автор: arilou 29.11.2005, 13:12
Цитата(mr @ 28.11.2005, 18:24)
Ничего подобного не заметил

У тебя скины включены?

Автор: mr.DUDA 29.11.2005, 15:19
Выключены.
Оффтопим !

Автор: Guest 30.11.2005, 12:53
Цитата(arilou @ 24.11.2005, 15:32)
Empirik
Если я не ошибаюсь, это называется alpha blending. Попробуй в эту сторону покопать. Можно еще посмотреть http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/GDIPlus/usingGDIPlus/fillingshapeswithagradientbrush.asp

В общем проблему решил следующим образом: написал новый велосипед. Реализовал GUI при помощи DirectX и остановился на этом.
Будет время опробую гредиентные кисти, но не уверен чо они помогут. Всем спасибо

Автор: Empirik 30.11.2005, 14:38
Цитата(Guest @ 30.11.2005, 12:53)
Цитата(arilou @ 24.11.2005, 15:32)
Empirik
Если я не ошибаюсь, это называется alpha blending. Попробуй в эту сторону покопать. Можно еще посмотреть http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/GDIPlus/usingGDIPlus/fillingshapeswithagradientbrush.asp

В общем проблему решил следующим образом: написал новый велосипед. Реализовал GUI при помощи DirectX и остановился на этом.
Будет время опробую гредиентные кисти, но не уверен чо они помогут. Всем спасибо

Этот пост мой

Автор: Elfet 6.3.2007, 10:07
Цитата(mr.DUDA @  26.11.2005,  19:33 Найти цитируемый пост)
перекрыть метод OnPaint, в котором отрисовывать всю форму самостоятельно.

Так тоже не выходит smile 
Код

        protected override void OnPaint(PaintEventArgs pevent)
        {
            // Getting the graphics object
            Graphics g = pevent.Graphics;

            // Creating the rectangle for the gradient
            Rectangle background = new Rectangle(0, 0,
                                      this.Width, this.Height);

            // Creating the lineargradient
            LinearGradientBrush brushGradient = new LinearGradientBrush(background,
                                                  Color.Green, Color.FromArgb(5,132,43,54), 0f);

            // Draw the gradient onto the form
            g.FillRectangle(brushGradient, background);

            // Disposing of the resources held by the brush
            brushGradient.Dispose();
        }

Автор: arilou 6.3.2007, 11:41
Elfet, в конструкторе формы надо выставить стили UserPaint, AllPaintingInWmPaint, OptimizedDoubleBuffer - не забыл?

Автор: Elfet 6.3.2007, 12:48
arilou, 
Код

        public Form1()
        {
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            InitializeComponent();
        }

Так вот? Но ничего не помогает.
Пробовал ещё добавить SetStyle(ControlStyles.SupportsTransparentBackColor, true) - тоже ничего  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)