Как создать прозрачное окно с непрозрачными дочерними элементами управления (или дочерними окнами)? - PullRequest
2 голосов
/ 24 апреля 2009

Во-первых, я работаю на Win32 с C ++.

Я пытался реализовать прозрачное окно с дочерним окном, которое должно оставаться непрозрачным на 100%. Кажется, что дочерние элементы управления не могут иметь непрозрачность лучше (ниже), чем родительский, и если я сделаю свой родительский элемент прозрачным на 100%, тогда мой дочерний элемент управления также наследует прозрачность.

Код, который я использую -

SetLayeredWindowAttributes(GetParent(parentWindowHwnd), 0, 0, LWA_COLORKEY, LWA_ALPHA); 

Любая помощь?

Пожалуйста, ответьте, если мне не очень понятен мой вопрос.

Ответы [ 3 ]

4 голосов
/ 07 мая 2009

К сожалению, вы не можете сделать это, дочерние окна всегда имеют ту же прозрачность, что и их родительские окна У панели инструментов Google Desktop был хитрый прием, чтобы создать иллюзию непрозрачного текстового поля на полупрозрачном фоне. Они создали два окна верхнего уровня, одно из фона и одно для текстового поля. Затем они устанавливают фоновое окно в качестве владельца (а не parent ) texbox. Затем они устанавливают фон прозрачным. Это довольно трудоемкий процесс, чтобы разобраться в этом, но это единственный способ сделать это без рендеринга всего самого, используя UpdateLayeredWindow.

1 голос
/ 24 апреля 2009

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

// Remove WS_EX_LAYERED from the window styles
SetWindowLong(hChildWnd, 
              GWL_EXSTYLE,
              GetWindowLong(hChildWnd, GWL_EXSTYLE) & ~WS_EX_LAYERED);

RedrawWindow(hChildWnd, 
             NULL, 
             NULL, 
             RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);

Страница MSDN на Многослойная Windows также может помочь.

0 голосов
/ 07 мая 2009

Вы не можете сделать дочерний элемент управления менее прозрачным, чем его родительский элемент управления. Обычный подход здесь - придать окну неправильную форму, а не прямоугольник. Это намного старше, чем альфа-прозрачность. Подумайте о приложении для часов: вы можете сделать окно круглым, если хотите, даже в Windows 95.
Это можно сделать с помощью функции Windows API SetWindowRgn:
Простой (vb) пример Результаты Google

...