Win32 полупрозрачное окно - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь получить полупрозрачное окно с Win32 API и C ++. Несмотря на то, что около миллиона результатов пытаются ответить на этот вопрос, ни один из них, похоже, не сработал для моего случая.

У меня есть собственное окно Win32 с размещенным в нем содержимым WPF. Поскольку я пытаюсь создать собственную оконную раму (и это тоже работает), я хочу, чтобы верхняя часть нарисованной рамки была полупрозрачной, возможно также применяя acryli c blur.

Глядя на WPF, я могу заархивировать свою цель, используя AllowTransparency = True в окне и с прозрачным фоном. Теперь мне нужен способ для репликации этого поведения с Win32 API.

Технически, я могу сделать все главное окно прозрачным (поскольку главное окно полностью является фреймом, а размещенный в WPF контент является клиентской областью), но даже это не сработало (без прозрачности).

Для справки, вот как я создаю свое окно:

WNDCLASSEXW window_class_ex = {
    sizeof(WNDCLASSEXW),
    CS_HREDRAW | CS_VREDRAW,
    window_callback,
    0,
    0,
    application_instance,
    nullptr,
    LoadCursorW(nullptr, IDC_ARROW),
    CreateSolidBrush(RGB(0, 0, 0)),
    nullptr,
    window_class,
    nullptr
};

const HWND window_handle = CreateWindowExW(
    0,
    window_class,
    L"WinSoup",
    WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_EX_LAYERED,
    CW_USEDEFAULT, CW_USEDEFAULT, 100, 100,
    nullptr,
    nullptr,
    application_instance,
    reinterpret_cast<LPVOID>(owner)
);

Я видел, что я должен использовать WS_EX_LAYERED Но и это не дало желаемого эффекта. Конечно, сам контент WPF не должен быть прозрачным!

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Ваш вопрос говорит

Сам контент WPF не должен быть прозрачным!

Вы можете использовать Set/UpdateLayeredWindowAttributes, но непрозрачность для содержимое вашего WPF тоже изменится.

Если вы действительно хотите создать высокопроизводительное прозрачное / полупрозрачное окно, вам нужно указать флаг WS_EX_NOREDIRECTIONBITMAP вместо WS_EX_LAYERED.. Затем используйте DirectComposition с другой графикой. API для рендеринга вашего контента.

Посмотрите на https://msdn.microsoft.com/magazine/dn745861.aspx для более подробной информации.

0 голосов
/ 22 марта 2020

Хорошо, так что, несмотря на все ответы, говорящие мне, чтобы прочитать документацию и посмотреть на другие примеры ... оказывается, я не на месте WS_EX_LAYERED.

const HWND window_handle = CreateWindowExW(
    WS_EX_LAYERED, // Needs to be placed here (extended style)
    window_class,
    L"WinSoup",
    WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX, // Not here!
    CW_USEDEFAULT, CW_USEDEFAULT, 100, 100,
    nullptr,
    nullptr,
    application_instance,
    reinterpret_cast<LPVOID>(owner)
);

...