Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
-34 / 1 / 0
Регистрация: 04.02.2025
Сообщений: 68

Полупрозрачность окна и не прозрачность элементов окна

24.02.2026, 23:31. Показов 1021. Ответов 12

Студворк — интернет-сервис помощи студентам
Приветствую.
Писал программу, хотел сделать полупрозрачное окно.
Что касается прозрачности, есть .TransparencyKey - это когда можно сделать какой-нибудь цвет полностью прозрачным и есть свойство .Opacity им можно сделать искомую полупрозрачность.
Однако, при этом, полупрозрачным становится не только окно, но и все элементы на нём, что совсем не то что нужно.
Спрашивал у синего кита, выдаёт нерабочие варианты, поиск по форуму тоже результатов не дал.
Сейчас вышел из положения путём создания двух окон и наложением их друг на друга. Но это костыльный костыль.
По логике вещей должен же быть нормальный способ реализовать задуманное? С другой, похоже, что в WinForms этого вообще не добиться без вот таких вот обходных путей.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.02.2026, 23:31
Ответы с готовыми решениями:

"Размывающая" полупрозрачность окна
Доброй ночи! Дело такое, я сделал полупрозрачное окно, как сделать чтобы оно было не просто...

Полупрозрачность элемента (убрать нарисованный прямоугольник)
Здравствуйте, возникла проблема. Есть примерно следующий код в обработчике события наведения...

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

12
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,360
25.02.2026, 06:41
Jack0v, можно вместо прозрачности явно наложить маску на те участки окна, которые не должны отрисовываться. SetWindowRgn. Давным давно это точно работало. Правда я напрямую к Win32 из Си обращался.

Но p/invoke в C# никто не отменял, если в самом WinForms такого не завезли.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3412 / 2733 / 575
Регистрация: 04.09.2018
Сообщений: 8,581
Записей в блоге: 3
25.02.2026, 13:12
Цитата Сообщение от Jack0v Посмотреть сообщение
быть нормальный способ реализовать задуманное?
Попробуй на WPF. На винформах ушатаешься такое реализовывать.
Может я чего не понял, но кажется, что прозрачное окно и непрозрачные висящие в воздухе кнопки и тексты - будут выглядеть нелепо..
1
-34 / 1 / 0
Регистрация: 04.02.2025
Сообщений: 68
25.02.2026, 19:20  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
прозрачное окно и непрозрачные висящие в воздухе кнопки
В том то и дело, что прозрачное окно сделать можно. А вот полупрозрачное окно с НЕпрозрачными кнопками - проблематично.

Цитата Сообщение от Usaga Посмотреть сообщение
p/invoke в C#
Цитата Сообщение от wizard41 Посмотреть сообщение
Попробуй на WPF.
Ок. Понял.
0
2805 / 503 / 120
Регистрация: 26.09.2020
Сообщений: 950
Записей в блоге: 5
25.02.2026, 20:03
Я тоже баловался не так давно с прозрачностью, но успел забыть, ибо быстро переехал на wpf.

AlphaTextForm
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
 
namespace AlphaText
{
    public class AlphaTextForm : Form
    {
        #region WinAPI
 
        [DllImport("user32.dll")]
        static extern bool UpdateLayeredWindow(
            IntPtr hwnd,
            IntPtr hdcDst,
            ref POINT pptDst,
            ref SIZE psize,
            IntPtr hdcSrc,
            ref POINT pptSrc,
            uint crKey,
            ref BLENDFUNCTION pblend,
            uint dwFlags);
 
        [DllImport("user32.dll")]
        static extern IntPtr GetDC(IntPtr hwnd);
 
        [DllImport("user32.dll")]
        static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);
 
        [DllImport("gdi32.dll")]
        static extern IntPtr CreateCompatibleDC(IntPtr hdc);
 
        [DllImport("gdi32.dll")]
        static extern IntPtr SelectObject(IntPtr hdc, IntPtr hObj);
 
        [DllImport("gdi32.dll")]
        static extern bool DeleteObject(IntPtr hObj);
 
        [DllImport("gdi32.dll")]
        static extern bool DeleteDC(IntPtr hdc);
 
        [StructLayout(LayoutKind.Sequential)]
        struct POINT { public int X, Y; }
 
        [StructLayout(LayoutKind.Sequential)]
        struct SIZE { public int CX, CY; }
 
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        struct BLENDFUNCTION { public byte Op, Flags, Alpha, Format; }
 
        #endregion
 
        private readonly ContextMenuStrip menu;
        private Color textColor = Color.White;
        private readonly Random rnd = new Random();
        private Rectangle btnRect = new Rectangle(280, 150, 140, 35);
 
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
 
                cp.ExStyle |= 0x80000; // WS_EX_LAYERED
 
                return cp;
            }
        }
 
        public AlphaTextForm()
        {
            FormBorderStyle = FormBorderStyle.None;
            ShowInTaskbar = true;
            TopMost = true;
            Size = new Size(700, 200);
            StartPosition = FormStartPosition.CenterScreen;
 
            menu = new ContextMenuStrip
            {
                Renderer = new DarkMenuRenderer()
            };
 
            var itemExit = new ToolStripMenuItem("В&ыход");
            var itemColor = new ToolStripMenuItem("Сменить &цвет");
 
            itemExit.Click += (s, e) => Close();
            itemColor.Click += (s, e) =>
            {
                textColor = Color.FromArgb(255, rnd.Next(256), rnd.Next(256), rnd.Next(256));
                Render();
            };
 
            menu.Items.Add(itemColor);
            menu.Items.Add(new ToolStripSeparator());
            menu.Items.Add(itemExit);
        }
 
        private void Render()
        {
            using (var bmp = new Bitmap(Width, Height, PixelFormat.Format32bppArgb))
            using (var g = Graphics.FromImage(bmp))
            {
                g.SmoothingMode = SmoothingMode.AntiAlias;
                g.TextRenderingHint = TextRenderingHint.AntiAlias;
 
                int radius = 20;
 
                using (var path = RoundedRect(0, 0, Width, Height, radius))
                using (var bgBrush = new SolidBrush(Color.FromArgb(60, 0, 0, 0)))
                {
                    g.FillPath(bgBrush, path);
                }
 
                using (var path = RoundedRect(0, 0, Width, Height, radius))
                using (var pen = new Pen(Color.FromArgb(60, 255, 255, 255), 1))
                {
                    g.DrawPath(pen, path);
                }
 
                using (var font = new Font("Segoe UI", 48, FontStyle.Bold))
                {
                    string text = "Привет мир!";
                    SizeF textSize = g.MeasureString(text, font);
                    float x = (Width - textSize.Width) / 2f;
                    float y = (Height - textSize.Height) / 2f;
 
                    using (var shadow = new SolidBrush(Color.FromArgb(100, 0, 0, 0)))
                    {
                        g.DrawString(text, font, shadow, x + 3, y + 3);
                    }
 
                    using (var brush = new SolidBrush(textColor))
                    {
                        g.DrawString(text, font, brush, x, y);
                    }
                }
 
                using (var btnBrush = new SolidBrush(Color.FromArgb(255, 80, 80, 120)))
                {
                    FillRoundedRect(g, btnBrush, btnRect, 8);
                }
 
                using (var font = new Font("Segoe UI", 11))
                using (var sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center })
                {
                    g.DrawString("Сменить цвет", font, Brushes.White, btnRect, sf);
                }
 
                ApplyBitmap(bmp);
            }
        }
 
        private GraphicsPath RoundedRect(int x, int y, int w, int h, int r)
        {
            var path = new GraphicsPath();
 
            path.AddArc(x, y, r, r, 180, 90);
            path.AddArc(x + w - r - 1, y, r, r, 270, 90);
            path.AddArc(x + w - r - 1, y + h - r - 1, r, r, 0, 90);
            path.AddArc(x, y + h - r - 1, r, r, 90, 90);
            path.CloseFigure();
 
            return path;
        }
 
        private void ApplyBitmap(Bitmap bmp)
        {
            IntPtr screenDc = GetDC(IntPtr.Zero);
            IntPtr memDc = CreateCompatibleDC(screenDc);
            IntPtr hBmp = bmp.GetHbitmap(Color.FromArgb(0));
            IntPtr old = SelectObject(memDc, hBmp);
 
            var dst = new POINT { X = Left, Y = Top };
            var size = new SIZE { CX = Width, CY = Height };
            var src = new POINT { X = 0, Y = 0 };
            var blend = new BLENDFUNCTION { Op = 0, Flags = 0, Alpha = 255, Format = 1 };
 
            UpdateLayeredWindow(Handle, screenDc, ref dst, ref size, memDc, ref src, 0, ref blend, 2);
 
            SelectObject(memDc, old);
            DeleteObject(hBmp);
            DeleteDC(memDc);
            ReleaseDC(IntPtr.Zero, screenDc);
        }
 
        private static void FillRoundedRect(Graphics g, Brush brush, Rectangle r, int radius)
        {
            using (var path = new GraphicsPath())
            {
                path.AddArc(r.X, r.Y, radius * 2, radius * 2, 180, 90);
                path.AddArc(r.Right - radius * 2, r.Y, radius * 2, radius * 2, 270, 90);
                path.AddArc(r.Right - radius * 2, r.Bottom - radius * 2, radius * 2, radius * 2, 0, 90);
                path.AddArc(r.X, r.Bottom - radius * 2, radius * 2, radius * 2, 90, 90);
                path.CloseFigure();
 
                g.FillPath(brush, path);
            }
        }
 
        protected override void OnShown(EventArgs e)
        {
            base.OnShown(e);
            Render();
        }
 
        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
 
            switch (m.Msg)
            {
                case 0x84: // WM_NCHITTEST
                    var pt = PointToClient(new Point(m.LParam.ToInt32()));
                    if (btnRect.Contains(pt))
                        m.Result = (IntPtr)1; // HTCLIENT
                    else
                        m.Result = (IntPtr)2; // HTCAPTION
                    break;
 
                case 0x201: // WM_LBUTTONDOWN
                    var click = PointToClient(Cursor.Position);
                    if (btnRect.Contains(click))
                    {
                        textColor = Color.FromArgb(255, rnd.Next(256), rnd.Next(256), rnd.Next(256));
                        Render();
                    }
                    break;
 
                case 0xA5: // WM_NCRBUTTONUP
                    menu.Show(Cursor.Position);
                    break;
            }
        }
 
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Apps)
            {
                menu.Show(Cursor.Position);
                return true;
            }
 
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }
 
    internal class DarkMenuRenderer : ToolStripProfessionalRenderer
    {
        public DarkMenuRenderer() : base(new DarkColors()) { }
 
        protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
        {
            e.TextColor = e.Item.Selected ? Color.White : Color.FromArgb(220, 220, 220);
            base.OnRenderItemText(e);
        }
    }
 
    internal class DarkColors : ProfessionalColorTable
    {
        public override Color MenuItemSelected => Color.FromArgb(60, 60, 90);
        public override Color MenuItemBorder => Color.FromArgb(80, 80, 120);
        public override Color MenuBorder => Color.FromArgb(60, 60, 80);
        public override Color ToolStripDropDownBackground => Color.FromArgb(35, 35, 50);
        public override Color ImageMarginGradientBegin => Color.FromArgb(35, 35, 50);
        public override Color ImageMarginGradientMiddle => Color.FromArgb(35, 35, 50);
        public override Color ImageMarginGradientEnd => Color.FromArgb(35, 35, 50);
        public override Color SeparatorDark => Color.FromArgb(60, 60, 80);
        public override Color SeparatorLight => Color.FromArgb(40, 40, 60);
    }
}

У AlphaText работает меню по ПКМ и клавише Apps.

Второй листинг не влез → Прикрепил пару тестовых Windows.Forms проектов. .NETFramework,Version=v4.7.2. Windows 11.
Может и не про то, что спрашивали.
Вложения
Тип файла: zip AccentTester.zip (8.8 Кб, 7 просмотров)
Тип файла: zip AlphaText.zip (9.5 Кб, 7 просмотров)
1
Любитель
 Аватар для Тим70
1041 / 747 / 161
Регистрация: 27.01.2019
Сообщений: 1,516
26.02.2026, 07:06
Цитата Сообщение от Jack0v Посмотреть сообщение
А вот полупрозрачное окно с НЕпрозрачными кнопками - проблематично.
Посмотрите здесь
0
-34 / 1 / 0
Регистрация: 04.02.2025
Сообщений: 68
26.02.2026, 22:56  [ТС]
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Прикрепил пару тестовых Windows.Forms проектов.
Благодарю, поизучаю.

Цитата Сообщение от Тим70 Посмотреть сообщение
Посмотрите здесь
Чёт не совсем уловил идею. Там png с текстурой сетки что-ли?

Ну похоже, действительно, нормального решения нет.
Значит мой вариант с двумя окнами друг под другом не так уж и плох.
0
 Аватар для Andrey-MSK
3344 / 2231 / 387
Регистрация: 14.08.2018
Сообщений: 7,534
Записей в блоге: 4
27.02.2026, 13:37
Jack0v, Не мучайте свой мозг - переходите на WPF и делайте прозрачность где и как хотите. Там тоже можно писать в стиле Windows Forms, хотя это и не правильно...
1
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,733
Записей в блоге: 1
27.02.2026, 19:18
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
хотя это и не правильно...
Спорное утверждение. В литературе и на многих ресурсах все примеры написаны примерно в таком стиле, в Code-Behind. Наоборот, найти хороший и понятный пример в шаблоне MVVM проблема.
0
-34 / 1 / 0
Регистрация: 04.02.2025
Сообщений: 68
28.02.2026, 19:34  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
переходите на WPF
Ну я пару раз смотрел на этот WPF. Какие-то там элементы не такие в плане дизайна. Даже не знаю как объяснить.
0
 Аватар для Andrey-MSK
3344 / 2231 / 387
Регистрация: 14.08.2018
Сообщений: 7,534
Записей в блоге: 4
02.03.2026, 08:46
Цитата Сообщение от Uswer Посмотреть сообщение
Наоборот, найти хороший и понятный пример в шаблоне MVVM проблема.
Уйма решений и примеров есть, даже книги есть по этому делу
Цитата Сообщение от Jack0v Посмотреть сообщение
Какие-то там элементы не такие в плане дизайна.
Обычные элементы, как в ОС. Стилями (через XAML) можно настроить как душе угодно. Даже можно окно в виде восьмёрки нарисовать со всем нужным функционалом.
0
-34 / 1 / 0
Регистрация: 04.02.2025
Сообщений: 68
Вчера, 22:05  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Обычные элементы, как в ОС.
Ну не знаю, элементы какие-то плоские, плюгавенькие. Или может я чего-то не понимаю.
0
sleep
 Аватар для I can
4934 / 4608 / 841
Регистрация: 13.04.2015
Сообщений: 9,780
Вчера, 23:18
Цитата Сообщение от Jack0v Посмотреть сообщение
элементы какие-то плоские, плюгавенькие
Какие нарисовал, такие и есть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
Вчера, 23:18
Помогаю со студенческими работами здесь

Как добиться полупрозрачности элементов управления
Мне надо сделать кнопку полу-прозрачной. Какой параметр этому соответвует?

Можно ли добиться полупрозрачности кнопки
Можно ли добиться полупрозрачности кнопки? и как это можно организовать... Заранее спасибо... ...

Как сделать анимацию прозрачности окна при наведении курсора мыши и его ухода с окна
Я сделал так (из класса убрал всё лишнее, только по теме оставил): using System; using...

Прозрачность чужого окна
Если не ошибаюсь на API есть возможность изменить прозрачность окна стороннего приложения. Как это...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru