Стиль окна-формы указывается в CreateParams. Только вот когда перемещаешь его, фон остается со старым куском экрана. Чтобы этого не происходило, то когда pисуешь своё окно, запоминай, что было под ним,а пpи пеpемещении восстанавливай.
Когда вы используете стиль WS_EX_TRANSPARENT, вы позволяете вашему окну быть прозрачным и сливаться с фоном рабочего стола. Однако, как вы уже обнаружили, это может привести к проблемам при перемещении окна, когда под ним остается старый контент экрана.
Чтобы преодолеть эту проблему, вам нужно сделать снимок области underneath вашего окна перед его созданием и затем восстановить этот снимок при перемещении окна. Это называется "сохранением" и "восстановлением" фона.
Пропosed код использует GetDC для получения handle к DC (Device Context) рабочего стола, что позволяет вам поймать контент экрана. Вот более подробное объяснение подхода:
Перед созданием окна вызовите GetDC с аргументом GetDesktopWindow() для получения DC рабочего стола.
Используйте BitBlt или StretchBlt (в зависимости от ваших конкретных потребностей) для копирования контента DC рабочего стола в буфер или изображение. Это поймает текущий контент экрана.
Создайте окно с параметрами создания, включающими стиль WS_EX_TRANSPARENT.
При перемещении окна используйте пойманное фоновое изображение для восстановления оригинального контента экрана под окном.
Вот пример кода, иллюстрирующий этот подход:
// Перед созданием окна...
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, указывая, как правильно перемещать окно-форму, чтобы фон не оставался со старым куском экрана.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS