Использование многослойных окон

Чтобы диалоговое окно получилось как прозрачное окно, сначала создают обычный блок диалога. Затем в сообщении 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);

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz