2009-04-24 2 views
2

Во-первых, я работаю над Win32 с C++.Как создать прозрачное окно с непрозрачными дочерними элементами управления (или дочерними окнами)?

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

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

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

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

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

ответ

1

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

// 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 на Layered Windows также может помочь.

+0

Пробовал, но это не сработало. –

+0

@ManojAwasthi: Если это не решило вашу проблему, не принимайте ее в качестве ответа. – IInspectable

+0

Да. Ранние дни, когда я не понимал ТАК достаточно. Благодарю. –

4

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

+0

Быстрый вопрос: как установить фоновое окно как владельца texbox? – Stefan

+2

Просто для обновления, начиная с Windows 8, это больше не так. Теперь дети могут быть слоистыми. – Lothar

0

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

Смежные вопросы