Вообщем такая проблема... Создаю окно со стилями WS_EX_LAYERED, WS_POPUP or WS_SYSMENU В WM_CREATE: invoke SetLayeredWindowAttributes, hWnd, COLOR, 240, LWA_ALPHA or LWA_COLORKEY Создаю EDIT со стилями WS_EX_CLIENTEDGE, WS_CHILD or WS_VISIBLE or ES_AUTOVSCROLL or ES_MULTILINE or WS_VSCROLL Запускаем... Ввожу текст и вроде бы всё нормально. Но когда срабатывает вертикальный SCROLL система виснет ) Причём без WS_EX_LAYERED и SetLayeredWindowAttributes прога работает нормально. Подскажите пожалуйста, в чём проблема?
Если этот скролл как-то влияет на главное окно, которое layered, то надо учесть, что в этих окнах нужно обрабатывать дополнительные сообщения, вроде WM_PRINTCLIENT. Хотя, больше похоже, что баг где-то в коде. Система win2k или XP?
В коде всё Ок! Система Windows 2003 Server. PS: Кстати, если использовать только параметр LWA_COLORKEY, то всё работает нормально. LWA_ALPHA глючит.
Vasil Но не работает же Именно с прозрачностью как-то случайно обнаружил баг на Win2k. Баг был в user32 Некоторые API-функции (вроде AnimateWindow) иногда сбрасывают атрибут WS_EX_LAYERED. Если это происходит, необходимо снова его выставить через SetWindowLong. В параметре COLOR старшие 8 бит должны быть сброшены. Почему и где виснет приложение можно узнать через отладчик.
"В коде всё Ок!" - я имею в виду ничего лишнего, как в "Hello World": 1. Регистрируем класс окна; 2. Создаём окно; 3. Цикл обработки сообщений; 4. Выход из процесса. В WndProc обрабатываются только WM_CREATE и WM_DESTROY. Проверял на LISTBOX'е - всё работает нормально, с EDIT'ом какая-то hrenь
> Создаю окно со стилями WS_EX_LAYERED, WS_POPUP or WS_SYSMENU > В WM_CREATE: > invoke SetLayeredWindowAttributes, hWnd, COLOR, 240, LWA_ALPHA or LWA_COLORKEY > Создаю EDIT со стилями WS_EX_CLIENTEDGE, WS_CHILD or WS_VISIBLE or ES_AUTOVSCROLL or ES_MULTILINE or WS_VSCROLL > Запускаем... > Ввожу текст и вроде бы всё нормально. Но когда срабатывает вертикальный SCROLL система виснет ) Неточность. Система не виснет, а жутко тормозит (CPU почти 100%). > В коде всё Ок! А чего о коде и говорить-то ? Ведь можно и виндовский блокнот обработать Get/SetWindowLong + SetLayeredWindowAttributes. > если использовать только параметр LWA_COLORKEY, то всё работает нормально. LWA_ALPHA глючит. Неточность. Если использовать только параметр LWA_ALPHA - тоже будет OK. Т.е. проблема не с WS_EX_LAYERED, а с SetLayeredWindowAttributes при LWA_ALPHA+LWA_COLORKEY. (Может, не зря у UpdateLayeredWindow вообще нет возможности объединять ULW_ALPHA и ULW_COLORKEY). > с EDIT'ом какая-то hrenь Ну, так ведь EDIT - может, самый сложный контрол (вспомнить хоть про пару текстовых буферов)... Короче, приходится констатировать: винды просто-напросто не в состоянии одновременно поддерживать и LWA_ALPHA, и LWA_COLORKEY, и скролл у мультиэдита.
> Хочешь сказать что выхода нет? ) Что хотел - сказал. Я же не знаю, чего тебе на самом деле надо. Если тебя приговорили именно к LWA_ALPHA+LWA_COLORKEY - ну, сходи на сайт MS, вдруг выложили спасительное обновление. Или Quantum что конкретное поведает о "дополнительных сообщениях вроде WM_PRINTCLIENT" (шутка). Но ведь не приговорили, правда ? Ну, так ищи обходные пути. Скажем, если LWA_COLORKEY для того только, чтобы в окне дырки были, - вместо LWA_COLORKEY регион попробуй.
kero Вполне конкретно, кажется, выразился. Попробую разжевать: Юзерская подсистема Win32 посылает процессам и окнам сообщения. Это обеспечивает связь приложений со внешним миром, другими приложениями и т.д. На сообшения нужно отвечать, т.е. обрабатывать их. Типичная ошибка - глючный обработчик определённого сообщения провоцирует повторный вызов самого себя и система "виснет". Сообщения вроде WM_PAINT и WM_PRINTCLIENT особенно уязвимы в этом плане. Вместо поиска обходных путей я бы сначала попытался установить причину зависания, а это проще и быстрее, чем изобретать велосипед.
2 Quantum > Вполне конкретно, кажется, выразился. Попробую разжевать Когда я сказал "конкретное", я имел в виду именно конкретное для рассматриваемой задачи, а никак не банальный список общих положений. > Вместо поиска обходных путей я бы сначала попытался установить причину зависания, а это проще и быстрее, чем изобретать велосипед. Так за чем же дело стало ? Задачка наредкость малозатратна, так и показали бы решение без зависания, вот это и было бы то самое: разжевать.