Проблема с WS_EX_LAYERED

Тема в разделе "WASM.WIN32", создана пользователем Vasil, 2 апр 2006.

  1. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    Вообщем такая проблема...



    Создаю окно со стилями 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 система виснет :dntknw:)



    Причём без WS_EX_LAYERED и SetLayeredWindowAttributes прога работает нормально.



    Подскажите пожалуйста, в чём проблема?
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Если этот скролл как-то влияет на главное окно, которое layered, то надо учесть, что в этих окнах нужно обрабатывать дополнительные сообщения, вроде WM_PRINTCLIENT. Хотя, больше похоже, что баг где-то в коде. Система win2k или XP?
     
  3. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    В коде всё Ок! Система Windows 2003 Server.



    PS: Кстати, если использовать только параметр LWA_COLORKEY, то всё работает нормально. LWA_ALPHA глючит.
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Vasil



    Но не работает же :)





    Именно с прозрачностью как-то случайно обнаружил баг на Win2k. Баг был в user32 :)



    Некоторые API-функции (вроде AnimateWindow) иногда сбрасывают атрибут WS_EX_LAYERED. Если это происходит, необходимо снова его выставить через SetWindowLong.



    В параметре COLOR старшие 8 бит должны быть сброшены.



    Почему и где виснет приложение можно узнать через отладчик.
     
  5. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    "В коде всё Ок!" - я имею в виду ничего лишнего, как в "Hello World":

    1. Регистрируем класс окна;

    2. Создаём окно;

    3. Цикл обработки сообщений;

    4. Выход из процесса.

    В WndProc обрабатываются только WM_CREATE и WM_DESTROY.



    Проверял на LISTBOX'е - всё работает нормально, с EDIT'ом какая-то hrenь :dntknw:
     
  6. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    > Создаю окно со стилями 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 система виснет :dntknw:)



    Неточность. Система не виснет, а жутко тормозит (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ь :dntknw:



    Ну, так ведь EDIT - может, самый сложный контрол (вспомнить хоть про пару текстовых буферов)...



    Короче, приходится констатировать: винды просто-напросто не в состоянии одновременно поддерживать и LWA_ALPHA, и LWA_COLORKEY, и скролл у мультиэдита.
     
  7. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    kero



    Хочешь сказать что выхода нет? :dntknw:)
     
  8. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    > Хочешь сказать что выхода нет? :dntknw:)



    Что хотел - сказал. Я же не знаю, чего тебе на самом деле надо.

    Если тебя приговорили именно к LWA_ALPHA+LWA_COLORKEY - ну, сходи на сайт MS, вдруг выложили спасительное обновление.

    Или Quantum что конкретное поведает о "дополнительных сообщениях вроде WM_PRINTCLIENT" (шутка).



    Но ведь не приговорили, правда ? Ну, так ищи обходные пути. Скажем, если LWA_COLORKEY для того только, чтобы в окне дырки были, - вместо LWA_COLORKEY регион попробуй.
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    kero



    Вполне конкретно, кажется, выразился. Попробую разжевать:



    Юзерская подсистема Win32 посылает процессам и окнам сообщения. Это обеспечивает связь приложений со внешним миром, другими приложениями и т.д. На сообшения нужно отвечать, т.е. обрабатывать их. Типичная ошибка - глючный обработчик определённого сообщения провоцирует повторный вызов самого себя и система "виснет". Сообщения вроде WM_PAINT и WM_PRINTCLIENT особенно уязвимы в этом плане.



    Вместо поиска обходных путей я бы сначала попытался установить причину зависания, а это проще и быстрее, чем изобретать велосипед.
     
  10. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    2 Quantum



    > Вполне конкретно, кажется, выразился. Попробую разжевать



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



    > Вместо поиска обходных путей я бы сначала попытался установить причину зависания, а это проще и быстрее, чем изобретать велосипед.



    Так за чем же дело стало ? Задачка наредкость малозатратна, так и показали бы решение без зависания, вот это и было бы то самое: разжевать.
     
  11. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    А решение-то - вот оно: WS_EX_COMPOSITED !
     
  12. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    WS_EX_COMPOSITED - Клёво, всё работает!!!

    Спасибо Quantum :)

    Спасибо kero, выручил :)