Что делает BeginPaint

Тема в разделе "WASM.WIN32", создана пользователем Loger, 3 ноя 2004.

  1. Loger

    Loger New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2003
    Сообщения:
    71
    Адрес:
    Minsk
    Имеются:

    Класс окна: hbrBackground = NULL

    Окно: WS_EX_TRANSPARENT | WS_EX_TOPMOST

    Если указать, что WM_PAINT обрабатывается (вернуть 0 из WndProc), то окно ведёт себя так, будто его нет: на месте окна отрисовывается то, что должно быть под ним. При этом на окне можно рисовать, получив контекст утройства через GetDC, но загрузка проца при этом 100%. Если жу получать контекст устройства через BeginPaint, то на месте окна будет виден тот кусок экрана, который был под окном, когда оно появилось на экране, даже если изображение на этой части экрана с тех пор изменилось. Как можно рисовать через BeginPaint так, чтобы это выглядело, будто я рисую на самом экране (поверх всех других окон)?
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    А ты через OpenGL бы попробовал ... помоему гораздо проще будет
     
  3. Loger

    Loger New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2003
    Сообщения:
    71
    Адрес:
    Minsk
    Через OpenGL не катит. Нужно, чтобы окна, лежащие под моим, могли свободно перерисовываться и это отображалось на экране
     
  4. sensy

    sensy New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    29




    IMHO, если перед окном или его частью есть другое окно, то "затенённый" участок окна не подлежит перерисовке.

    То есть нужно самому инициировать перерисовку окон, лежащих под твоим. Получать их через GetNextWindow...
     
  5. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    [deleted]
     
  6. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    [deleted]
     
  7. jekyll

    jekyll New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2003
    Сообщения:
    92
    Адрес:
    Russia
    Я делал так:

    1. Получал контекст через GetDC

    2. Создавал memDC, в нем все рисовал

    3. Вызывал BeginPaint

    4. Делал BitBlt

    5. Вызывал EndPaint

    6. Делал ReleaseDC



    Получать контекст через BeginPaint в данном случае неправильно, т.к. функция возвращает только контекст, кот. нужно перерисовать, а это может быть часть твоего окна.



    А что это должно быть в итоге?
     
  8. Loger

    Loger New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2003
    Сообщения:
    71
    Адрес:
    Minsk
    А BeginPaint точно должно быть между GetDC и ReleaseDC?





    Ничего особенного, просто экспеременитрую, пытаясь создать прозрачное окно без WS_EX_LAYERED
     
  9. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
    Если я правильно понял суть вопроса:



    > но загрузка проца при этом 100%

    потому что invalid region без BeginPaint/EndPaint не становится валидным и окну постоянно посылается WM_PAINT; избежать этого можно, вызвав в конце DefWindwProc;

    >чтобы это выглядело, будто я рисую на самом экране

    может, на самом экране и рисовать - GetDC(0);?



    Когда-то я писал подобную программу, только я вообще не обрабатывал WM_PAINT, а рисовал себе что мне нужно по таймеру. WM_PAINT не нужен был потому, что окно WS_EX_TOPMOST все равно никто не мог перекрыть (окно было размером с экран).
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Loger

    > Имеются:

    Класс окна: hbrBackground = NULL

    Окно: WS_EX_TRANSPARENT | WS_EX_TOPMOST




    Вобще-то лучше код приводить, желательно весь исходник, чтоб можно было скомпилить и проверить, а не гадать..
     
  11. Loger

    Loger New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2003
    Сообщения:
    71
    Адрес:
    Minsk
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Мне сейчас лень разбираться что-там у тя не правильно, вот исходник, кто-то из наших переделывал тутор Iczelion'а, я только добавил стиль WS_EX_TOPMOST - вроде все нормально работает, выход из проги по двойному клику по картинке, если запустить файл без dll'ки прога повиснет, нужно добавить проверку чтоб этого избежать.

    [​IMG] 384481375__skinwindow.rar
     
  13. Loger

    Loger New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2003
    Сообщения:
    71
    Адрес:
    Minsk
    Asterix

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