Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
4 / 3 / 1
Регистрация: 16.01.2020
Сообщений: 22

Имитация затемнения

19.01.2020, 16:09. Показов 5490. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема следующая: Я считываю все контролы на форме, затем перевожу их в картинку. Дело в том, если контрол лежит на контроле, пример: На picturebox лежат button или любые другие компоненты, то они не переносятся в картинку, то есть перенесётся тот самый picturebox на котором лежат контролы, а вот тот самый button просто пропадёт.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void pictureBox6_Paint(object sender, PaintEventArgs e)
{
        Control control = (Control)sender;
        Control parent = control.Parent;
 
        Bitmap behind = new Bitmap(parent.Width, parent.Height);
 
        foreach (Control c in parent.Controls)
            if (c != control)
                c.DrawToBitmap(behind, c.Bounds);
 
        float opacity = 0.8f;
        Color bgColor = Color.FromArgb(Convert.ToInt32(255 * opacity), 0, 0, 0);
 
        Graphics g = Graphics.FromImage(behind);
        g.FillRectangle(new SolidBrush(bgColor), 0, 0, parent.Width, parent.Height);
 
        e.Graphics.DrawImage(behind, -control.Left, -control.Top);
}
Собственно мне это нужно для затемнения, но такового затемнения в WinForms нет, приходится имитировать его, помогите пожалуйста.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.01.2020, 16:09
Ответы с готовыми решениями:

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

Enabled=False без затемнения текста для TextBox
Здравствуйте. У меня есть ТекстБокс с текстом. Мне нужно запретить менять в нём текст для этого ставлю Enabled=False. Но при этом текст...

Имитация пианино
Столкнулся с такой задачей. Нужно, чтобы при нажатии заданной клавиши на динамики поступал звуковой сигнал, а когда клавишу отпускаешь - он...

15
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
19.01.2020, 17:14
waparabus, картинку покажите, какое затемнение хотите
0
4 / 3 / 1
Регистрация: 16.01.2020
Сообщений: 22
19.01.2020, 17:17  [ТС]
Что нужно / что получается / как выглядит без затемнения
Миниатюры
Имитация затемнения   Имитация затемнения   Имитация затемнения  

0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
19.01.2020, 19:10
waparabus, Прозрачная панелька
здесь я поверх изобржения окна добавил 100 альфа канала
C#
1
2
3
4
5
 using (Graphics g = Graphics.FromImage(BackPanel))
            {
                SolidBrush Brush = new SolidBrush(Color.FromArgb(100, 0, 0, 0));
                g.FillRectangle(Brush, 0, 0, BackPanel.Width, BackPanel.Height);
            }
вам тогда, чтобы затемнить нужно убавить все значения rgb
0
4 / 3 / 1
Регистрация: 16.01.2020
Сообщений: 22
19.01.2020, 19:11  [ТС]
backPanel - это ???
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
19.01.2020, 19:12
waparabus, да, это уже обработанное изображение вашей формы
0
4 / 3 / 1
Регистрация: 16.01.2020
Сообщений: 22
19.01.2020, 19:17  [ТС]
Как починить? (Мне нужно поставить затемнение от 0; 0 координат и размер this.Width, this.Height);
Миниатюры
Имитация затемнения  
0
4 / 3 / 1
Регистрация: 16.01.2020
Сообщений: 22
19.01.2020, 19:23  [ТС]
Окей, я починил, но.. То же самое.
Миниатюры
Имитация затемнения  
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
19.01.2020, 20:07
waparabus, вам нужно:
-получить полный скриншот формы (это есть в теме про панельку)
-затемнить его (это есть в теме про панельку)
-на пустую(!!11!) форму помещаете это изображение (можно создать новое окно, а старое свернуть, но будет видна анимация
сворачивания, но лучше просто очистить форму от контролов)
-показываете окно настроек
-при закрытии настроек вернуть все контролы на место
1
4 / 3 / 1
Регистрация: 16.01.2020
Сообщений: 22
19.01.2020, 20:25  [ТС]
=D -> Я копирую ВСЕ контролы на скрин и помещаю их в picturebox который находится поверх всех котроллов, как мне ёмаё получить те контролы которые он не видит? (которые находятся на других контролах)

Добавлено через 6 минут
Вообщем ответ: Тупо взял и вручную .DrawToBitmap те компоненты, которые не хотели рисоваться в foreach, close.
0
5 / 5 / 2
Регистрация: 01.12.2019
Сообщений: 286
25.01.2020, 10:50
waparabus, Смотри что нашёл
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    private void button1_Click(object sender, EventArgs e)
    {
        // take a screenshot of the form and darken it:
        Bitmap bmp = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height);
        using (Graphics G = Graphics.FromImage(bmp))
        {
            G.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
            G.CopyFromScreen(this.PointToScreen(new Point(0, 0)), new Point(0, 0), this.ClientRectangle.Size);
            double percent = 0.60;
            Color darken = Color.FromArgb((int)(255 * percent), Color.Black);
            using (Brush brsh = new SolidBrush(darken))
            {
                G.FillRectangle(brsh, this.ClientRectangle);
            }
        }
 
        // put the darkened screenshot into a Panel and bring it to the front:
        using (Panel p = new Panel())
        {
            p.Location = new Point(0, 0);
            p.Size = this.ClientRectangle.Size;
            p.BackgroundImage = bmp;
            this.Controls.Add(p);
            p.BringToFront();
 
            // display your dialog somehow:
            Form frm = new Form();
            frm.StartPosition = FormStartPosition.CenterParent;
            frm.ShowDialog(this);
        } // panel will be disposed and the form will "lighten" again...
    }
Может и тебе поможет, ибо я думаю что это самый оптимальный вариант.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4357 / 3427 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
25.01.2020, 14:34
L1onelY, можно еще создать временную форму, сделать полупрозрачной, черного цвета, открыть ее модально к основной с теми же размерами и позицией, а уже поверх нее открыть окно настроек, тоже модально...
0
5 / 5 / 2
Регистрация: 01.12.2019
Сообщений: 286
25.01.2020, 15:24
Yury Komar, Вопрос по тому коду что скинул я, почему когда он выполняется, первая форма, будто умерла?
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4357 / 3427 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
25.01.2020, 16:08
L1onelY, Потому, что у вас динамически созданная панель перекрывает все, что на форме, после закрытия того окошка с настройками, вам необходимо скрывать/удалять панель, чтобы все, что под ней, стало доступно
0
Строитель
 Аватар для Nord790
889 / 556 / 194
Регистрация: 01.04.2014
Сообщений: 610
Записей в блоге: 6
25.01.2020, 16:51
Лучший ответ Сообщение было отмечено waparabus как решение

Решение

waparabus,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System.Drawing;
using System.Windows.Forms;
 
public class BlackoutControl : Control
{
    public BlackoutControl()
    {
        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        SetStyle(ControlStyles.Opaque, true);
        SetStyle(ControlStyles.ResizeRedraw, true);
        this.BackColor = Color.Transparent;
        this.Paint += BlackoutControl_Paint;
    }
 
    private void BlackoutControl_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(180, Color.Black)), e.ClipRectangle);
    }
 
    protected override CreateParams CreateParams
    {
        get
        {
            const int WS_EX_TRANSPARENT = 0x20;
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= WS_EX_TRANSPARENT;
            return cp;
        }
    }
}
0
5 / 5 / 2
Регистрация: 01.12.2019
Сообщений: 286
25.01.2020, 19:41
Yury Komar, Исправить это можно вообще, ибо что-то пробую, не выходит...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2020, 19:41
Помогаю со студенческими работами здесь

Имитация работы парикмахерской
Добрый вечер. Я хочу сделать имитацию работы парикмахерской. Вот с чего начал я : using System; using...

Имитация кругов на воде
Доброго времени суток! Есть задача. Разработать программу, имитирующую круги на воде: в случайных местах экрана возникают и начинают...

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

Имитация нажатия клавиш
Всем привет,как сделать на c# эмуляцию нажатия клавиш,т.е окно программы было не активно,а в активном окне нажимались нужные мне...

Имитация зажатия клавиши
Короче тема такая, нужно иметировать зажатие клавиши "E" на несколько секунд, то-есть беспрерывное зажатие если кто не понял. класс...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru