Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Как правильно работать с прозрачными окнами (стиль WS_EX_TRANSPARENT)?

Delphi , Компоненты и Классы , Свойства и События

Как правильно работать с прозрачными окнами (стиль WS_EX_TRANSPARENT)?

Стиль окна-формы указывается в CreateParams. Только вот когда перемещаешь его, фон остается со старым куском экрана. Чтобы этого не происходило, то когда pисуешь своё окно, запоминай, что было под ним,а пpи пеpемещении восстанавливай.

HDC hDC = GetDC(GetDesktopWindow()) тебе поможет..

Andrei Bogomolov http://cardy.hypermart.net

Перевод:

Классическая тема в программировании Windows!

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

Чтобы преодолеть эту проблему, вам нужно сделать снимок области underneath вашего окна перед его созданием и затем восстановить этот снимок при перемещении окна. Это называется "сохранением" и "восстановлением" фона.

Пропosed код использует GetDC для получения handle к DC (Device Context) рабочего стола, что позволяет вам поймать контент экрана. Вот более подробное объяснение подхода:

  1. Перед созданием окна вызовите GetDC с аргументом GetDesktopWindow() для получения DC рабочего стола.
  2. Используйте BitBlt или StretchBlt (в зависимости от ваших конкретных потребностей) для копирования контента DC рабочего стола в буфер или изображение. Это поймает текущий контент экрана.
  3. Создайте окно с параметрами создания, включающими стиль WS_EX_TRANSPARENT.
  4. При перемещении окна используйте пойманное фоновое изображение для восстановления оригинального контента экрана под окном.

Вот пример кода, иллюстрирующий этот подход:

// Перед созданием окна...
HDC hDC = GetDC(GetDesktopWindow());
HBITMAP hBitmap;
BitBlt(hDC, 0, 0, 100, 100, hDC, x, y, SRCCOPY);
ReleaseDC(NULL, hDC);

// Создайте окно с WS_EX_TRANSPARENT
CreateWindowEx(WS_EX_TRANSPARENT, ...);

// При перемещении окна...
MoveWindow(...);
HDC hDC = GetDC(GetDesktopWindow());
BitBlt(hDC, 0, 0, 100, 100, hDC, x, y, SRCCOPY);
ReleaseDC(NULL, hDC);

В этом примере x и y представляют собой текущие координаты окна. Вам нужно будет адаптировать эти координаты в зависимости от вашей конкретной логики перемещения окна.

С помощью пойманного фонового изображения вы можете эффективно "сохранить" оригинальный контент экрана под прозрачным окном, обеспечивая плавное пользовательское опыте. Обратите внимание, что этот подход может иметь последствия для производительности, особенно если вы работаете с большими окнами или высокоразрешенными экранами. Вам может потребоваться оптимизация кода для лучшей производительности.

Статья описывает правильный способ работы с прозрачными окнами в Windows, указывая, как правильно перемещать окно-форму, чтобы фон не оставался со старым куском экрана.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




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



:: Главная :: Свойства и События ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100

Время компиляции файла: 2024-05-10 07:13:18
2024-05-19 12:21:03/0.011041879653931/2