Как заставить родительское окно рисовать «под» дочерние окна? - PullRequest
2 голосов
/ 06 февраля 2009

Среда - это старый win32 под C / C ++ без какого-либо необычного MFC или подобного mumbo-jumbo. У меня есть окно, в котором есть несколько детей и внуков. У некоторых детей значки странной формы, и мне нужно, чтобы они имели прозрачный фон (значки странной формы). Рассмотрим эту псевдоструктуру:

  • Parent1
    • Ребенок1 (нормальный)
    • Child2 (значок странной формы)
    • Child3 (нормальный) / Parent2
      • Внук1 (обычный)
      • Grandchild2 (значок странной формы)

Выше, у Child2 и Grandchild2 должен быть прозрачный фон (WM_ERASEBKGND ничего не делает, или (WNDCLASS) -> hbrBackground = NULL). Прямо сейчас фон для этих значков прозрачен, но прозрачен до крайности - я вижу вещи под Parent1 - рабочий стол и т. Д.

Все это происходит под Windows Mobile.

Есть ли какой-либо дополнительный флаг, который я должен установить для Parent1 и Parent2? Какие хорошие уловки вы могли бы предложить?

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

РЕДАКТИРОВАТЬ: окно странной формы является иконкой с прозрачными пленками. Было бы хорошо, если бы родительское окно не делало обрезку для этих конкретных окон, но делало бы их недействительными каждый раз, когда родительский рисует сам. CS_PARENTDC выглядит очень многообещающе, но недостаточно многообещающе. Есть идеи?

Ответы [ 4 ]

1 голос
/ 06 февраля 2009

Как вы обрабатываете WM_PAINT в окнах странной формы? Вы стираете фон? Может быть, лучшим решением было бы использовать непрямоугольную область отсечения?

EDIT SetWindowRgn задокументирована здесь - Я неправильно сказал «регион отсечения», я действительно думал об этом методе Вы устанавливаете неправильную область, которая является формой вашего значка, и затем рисуете к этому. Я думаю, что это, вероятно, распространенная техника для рисования окон со странными формами.

0 голосов
/ 25 марта 2011

Я наткнулся на эту запись, когда искал способы заставить Windows CE удалить отсечение дочерних окон из области обновления. Кажется, это просто невозможно. Как отметил Иоганн Герелл, GWES всегда будет обрезать детей. Это, конечно, делает невозможным наличие прозрачных статических полей, никогда! Я попробовал все. Установка пользовательской необрезанной прямоугольной области во время WM_ERASEBKGND, но GWES сохраняет свою старую область отсечения. У меня есть куча статических элементов управления, размещенных над растровым изображением (которое рисуется во время WM_ERASEBKGND). Это возможно даже в Windows CE?

0 голосов
/ 13 февраля 2009

GWES не будет рисовать прямоугольник любого дочернего окна с содержимым родительского окна. Когда-либо. Период. Это по замыслу.

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

0 голосов
/ 06 февраля 2009

Если вы попытаетесь использовать SetBkColor (), вы не сможете указать цвета при обработке WM_PAIN для окна, и тогда не имеет значения, если он имеет неправильный размер. Я правильно понимаю ваш вопрос?

...