Использование многослойных окон
Чтобы диалоговое окно получилось как прозрачное окно, сначала создают обычный блок диалога. Затем в сообщении
WM_INITDIALOG установите многослойный бит расширенного стиля окна и вызовите функцию SetLayeredWindowAttributes с желательным alpha- значением. Код мог бы выглядеть следующим образом:
// Установим стиль WS_EX_LAYERED для этого окна SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); // Сделаем это окно на 70% alpha SetLayeredWindowAttributes(hwnd, 0, (255 * 70) / 100, LWA_ALPHA); |
Обратите внимание! на то, что третий параметр функции SetLayeredWindowAttributes - значение, которое располагается от 0 до 255, при 0 окно делается полностью прозрачным, а при 255 процесс оно делается полностью непрозрачным. Этот параметр подражает более универсальному параметру BLENDFUNCTION функции AlphaBlend. |
Чтобы сделать это окно, полностью непрозрачным снова, удалите бит
WS_EX_LAYERED путем вызова функции SetWindowLong, а затем потребуйте перерисовать окно. Удаление бита требуется для того, чтобы дать возможность системе, знать, что она может освободить некоторую память, связанную с разбиением на слои и переадресацией. Код мог бы выглядеть следующим образом:
// Удаляем WS_EX_LAYERED из стилей этого окна SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) & ~WS_EX_LAYERED); // Требуем, чтобы окно и его дочерние окна были перерисованы RedrawWindow(hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); |