Member 14884389 Ответов: 2

Как сделать выбранный цвет прозрачным в C++


Я пытаюсь вызвать DwmExtendFrameIntoClientArea на веб-браузере, который не поддерживает значения RGBA 0, 0, 0, 0. Мой подход состоял в том, чтобы определить один специальный цвет, например RGB 255, 0, 0, чтобы быть полностью прозрачным. Я получил это для работы в проекте Windows Forms, используя TransparencyKey, который сделал каждый пиксель в выбранном цвете, показывающем расширенный кадр, но я не мог найти ничего подобного в приложениях без формы.

Что я уже пробовал:

SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
	SetLayeredWindowAttributes(hWnd, RGB(255, 0, 0), 0, LWA_COLORKEY);
	MSG msg1;

	if (message == WM_ACTIVATE)
	{
		
		// Set margins, extending the bottom margin
		//MARGINS margins = { 30,30,30,25 };
		//MARGINS margins;
		//margins.cxLeftWidth = 0;      
		//margins.cxRightWidth = 0;   
		// margins.cyBottomHeight = 30; 
		//margins.cyTopHeight = 30;  //not shure needs to be tweaked 
		   MARGINS margins = { 0,0,59,0 };
		HRESULT hr = S_OK;

		// Extend frame on the bottom of client area
		hr = DwmExtendFrameIntoClientArea(hWnd, &margins);
		if (!SUCCEEDED(hr))
		{
			// ...
		}
		return hr;

Часть, которая должна вызывать этот код, коренится в этом коде в css:
html {
	background-color:rgba(255, 0, 0, 1);
	height: 100%;

2 Ответов

Рейтинг:
2

Richard MacCutchan

В полях ниже последнее значение находится между 0.0 для полностью прозрачного и 1.0 для полностью непрозрачного. Второй красный ряд показывает полностью непрозрачный, остальные частично прозрачны.

Красный : цвет фона:rgba(255,0,0,0.3)


Красный : цвет фона:rgba(255,0,0,1.0)


Зеленый : цвет фона:rgba(0,255,0,0.3)


Синий : цвет фона:rgba(0,0,255,0.3)


Серый : -цвет:rgba(192,192,192,0.3)


Желтый : цвет фона:rgba(255,255,0,0.3)


Вишневый цвет : цвет фона:rgba(255,0,255,0.3)


Часть прозрачный красный текст : цвет:rgba(255,0,0,0.3)



Код таков:
<p style="background-color:rgba(255,0,0,0.3);">Red : background-color:rgba(255,0,0,0.3)</p>
<p style="background-color:rgba(255,0,0,1.0);">Red : background-color:rgba(255,0,0,1.0)</p>
<p style="background-color:rgba(0,255,0,0.3);">Green : background-color:rgba(0,255,0,0.3)</p>
<p style="background-color:rgba(0,0,255,0.3);">Blue : background-color:rgba(0,0,255,0.3)</p>
<p style="background-color:rgba(192,192,192,0.3);">Grey : -color:rgba(192,192,192,0.3)</p>
<p style="background-color:rgba(255,255,0,0.3);">Yellow : background-color:rgba(255,255,0,0.3)</p>
<p style="background-color:rgba(255,0,255,0.3);">Cerise : background-color:rgba(255,0,255,0.3)</p>
<p style="color:rgba(255,0,0,0.3);">Part transparent Red text : color:rgba(255,0,0,0.3)</p>


Member 14884389

I think you don't quite get what I'm trying to do. That way only the html document gets transparent and not the browser itself (it's still white background even with alpha 0). Im searching for some type of C++ alternative to the Transparencykey from C++ Forms. The question isn't how to make the html document transparent it's how to make a browser transparent (which to my knowledge is impossible) or find a way around the webbrowser to show the window background which is an extended title bar like the code above shows. I already tested (in C++ Forms) that rgba(255, 0, 0, 1) html parts are showing the window background when the Transparencykey is rgba(255, 0, 0, 1).
Вот что я пытаюсь сделать сделано в формах https://stackoverflow.com/questions/20141220/how-can-i-set-a-transparent-background-colour-for-a-webbrowser-in-vb-net

Richard MacCutchan

Мне очень жаль, но я совершенно запутался в том, что именно вы пытаетесь сделать. Вы, кажется, смешиваете проблемы веб-браузера с проблемами C++, и неясно, какое приложение вы пытаетесь сделать, и какую часть или части вы хотите быть прозрачными.

Member 14884389

Я пытаюсь полностью видеть части веб-браузера, чтобы использовать функцию расширения заголовка, чтобы он выглядел так, как будто строка заголовка является частью веб-браузера

Richard MacCutchan

Какой веб-браузер вы имеете в виду? Я все еще не понимаю, как это может относиться к коду Windows на C++.

Member 14884389

https://www.bilder-upload.eu/bild-e3d635-1597256412.png.html
https://www.bilder-upload.eu/bild-51bd12-1597256437.png.html
код:
Система Импорта.Рисование
Система Импорта.Рисование.Drawing2D
Система Импорта.Во время выполнения.InteropServices

Общественного Класса Form1



Частные mExtendedFrameMargins в качестве маржи

Защищенные Переопределения Sub _
OnPaint(бывал е как система.Окна.Формы.Объект painteventargs)
e.графика.SmoothingMode = SmoothingMode.сглаживание
- используй любой из них
e.графика.SmoothingMode = SmoothingMode.высококачественный
Конец Подводной Лодки

Private Sub Form1_Paint(ByVal sender As System.Объект, бывал е как система.Окна.Формы.Объект Painteventargs) Обрабатывает Ключевое Слово Mybase.Краска
Если IsGlassEnabled() Затем
- Вы должны покрасить удлиненную раму в черный цвет для правильной композиции, но я покрашу ее в белый цвет, как вам нужно
e.графика.FillRectangle(Кисти.Черный, 0, 0, Я.ClientRectangle.Ширина, mExtendedFrameMargins.cyTopHeight)
Конец, Если
Конец Подводной Лодки

Частная Функция IsGlassEnabled() Как Логическая
Если Окружающая Среда.Версия_ос.Версия.Майор < 6 тогда
возвращать false
Конец, Если

Dim isGlassSupported As Boolean = False
DwmIsCompositionEnabled(isGlassSupported)
Возврат isGlassSupported
Конечная Функция

&ЛТ;атрибут DllImport("dwmapi.dll")&ГТ;
Частная общая функция DwmIsCompositionEnabled(<marshalas(unmanagedtype.bool)> ByRef pfEnabled As Boolean) Как Целое Число
Конечная Функция

&ЛТ;атрибут DllImport("dwmapi.dll")&ГТ;
Частная общая функция DwmExtendFrameIntoClientArea(ByVal hwnd As IntPtr, ByRef pMarInset As MARGINS) как целое число
Конечная Функция


<structlayout(layoutkind.sequential)>
Пределах собственной структуры
Public cxLeftWidth как целое число
Public cxRightWidth как целое число
Публичный cyTopHeight как целое число
Публичный cyBottomHeight как целое число
Торцевая Конструкция



Частная суб методе form1_load(отправителя как объект, а равно EventArgs) обрабатывает ключевое слово mybase.Загрузить
Метода webbrowser1.Выберитетекст документа = ""

Если IsGlassEnabled() Затем
mExtendedFrameMargins = новые поля
mExtendedFrameMargins.cyTopHeight = Me.Height 'тип высоты здесь, это будет число (целое число)
DwmExtendFrameIntoClientArea(Me.Handle, mExtendedFrameMargins)
Конец, Если
Конец Подводной Лодки

Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) обрабатывает Me.SizeChanged
Если IsGlassEnabled() Затем
mExtendedFrameMargins = новые поля
mExtendedFrameMargins.cyTopHeight = Me.Height 'тип высоты здесь, это будет число (целое число)
DwmExtendFrameIntoClientArea(Me.Handle, mExtendedFrameMargins)
Конец, Если
Конец Подводной Лодки
Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Объект, бывал е как система.Окна.Формы.WebBrowserDocumentCompletedEventargs) Обрабатывает WebBrowser1.DocumentCompleted

Метода webbrowser1.Документ.BackColor = Цвет.FromArgb(1, 255, 0, 0)

Если IsGlassEnabled() Затем
mExtendedFrameMargins = новые поля
mExtendedFrameMargins.cyTopHeight = Me.Height 'тип высоты здесь, это будет число (целое число)
DwmExtendFrameIntoClientArea(Me.Handle, mExtendedFrameMargins)
Конец, Если
Конец Подводной Лодки



'Private Sub WebBrowser1_DocumentCompleted(отправитель как объект, e Как WebBrowserDocumentCompletedEventargs) обрабатывает WebBrowser1.DocumentCompleted
'Метода webbrowser1.Документ.BackColor = Цвет.Черный

- Конец Субмарины
End Класса
То, что вы можете видеть внутри красного поля, - это веб-браузер с красным цветом документа, а ключ прозрачности формы установлен на красный, поэтому он вызовет API extendaero в этом веб-браузере, где не задано Альфа-значение. Я пытаюсь достичь того же результата в приложении c++ non form, но не смог найти ничего похожего на ключ прозрачности в c++. Цель состоит в том, чтобы сделать управление веб-браузером невидимым

Richard MacCutchan

Извините, но это Visual Basic.

Member 14884389

это не имеет ничего общего с vb это также может быть сделано в формах c++

Richard MacCutchan

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

Member 14884389

У меня есть программа, которая использует веб-браузер (который заполняет все окно) для создания интерфейса, подобного проводнику. https://tablacus.github.io/explorer_en.html
Я пытаюсь заменить старый серый фон консоли на фон extendaero, как в проводнике windows 7 https://i.computer-bild.de/imgs/5/9/9/1/7/8/5/Windows-7-und-8-Das-hilft-wenn-sich-Fenster-langsam-oeffnen-Manchmal-startet-1024x576-b8e06cd96cb52467.jpg
и моя проблема заключается в том, что я не могу сделать упомянутую часть фона браузера невидимой, чтобы освободить место для расширенной части aero, которая находится под браузером.

Рейтинг:
1

Richard MacCutchan

Цвета CSS[^] добавляет значение непрозрачности, чтобы сделать цвета полупрозрачными.


Member 14884389

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

Richard MacCutchan

Я не знаю, почему вы не можете попасть на сайт W3Schools, он прекрасно работает для меня. Однако смотрите примеры ниже.