Вам понадобится
- - компилятор;
- - windows sdk или фреймворк для программирования под windows.
Инструкция
1
Получите дескриптор окна, которое необходимо сделать полупрозрачным. Найдите или создайте окно. Для его создания воспользуйтесь либо API-функциями CreateWindow, CreateWindowEx, либо методами-обертками вокруг этих функций, принадлежащими классам используемого фреймворка. Прототип функции CreateWindow выглядит следующим образом:
HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam
);
Как видно, функция возвращает дескриптор созданного окна в качестве результата исполнения. В случае если используется какой-либо класс-обертка, используйте его методы на объекте, соответствующем созданному окну для получения дескриптора.
HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam
);
Как видно, функция возвращает дескриптор созданного окна в качестве результата исполнения. В случае если используется какой-либо класс-обертка, используйте его методы на объекте, соответствующем созданному окну для получения дескриптора.
2
Поиск окна может быть произведен при помощи вызовов API-функций FindWindow, FindWindowEx, EnumWindows, EnumChildWindows, EnumThreadWindows и их комбинаций. Получить дескриптор окна, находящегося в определенной области, можно, используя функции WindowFromPoint и ChildWindowFromPoint.
3
Установите окну расширенный стиль WS_EX_LAYERED. Используйте API-функцию SetWindowLong или соответствующие методы объектов-врапперов. Функция SetWindowLong полностью заменяет информацию о модифицируемом параметре окна, поэтому используйте ее в комбинации с функцией GetWindowLong для получения предыдущего значения набора флагов стилей. Например, стиль можно изменить так:
::SetWindowLong(hWnd, GWL_EXSTYLE, ::GetWindowLong(hWnd, GWL_EXSTYLE));
Здесь hWnd - дескриптор окна, найденный вследствие совершения действий, описанных в предыдущем шаге.
::SetWindowLong(hWnd, GWL_EXSTYLE, ::GetWindowLong(hWnd, GWL_EXSTYLE));
Здесь hWnd - дескриптор окна, найденный вследствие совершения действий, описанных в предыдущем шаге.
4
Сделайте окно полупрозрачным. Используйте API-функцию SetLayeredWindowAttributes или методы классов-оберток. Прототип функции SetLayeredWindowAttributes выглядит так:
BOOL SetLayeredWindowAttributes(
HWND hwnd,
COLORREF crKey,
BYTE bAlpha,
DWORD dwFlags
);
BOOL SetLayeredWindowAttributes(
HWND hwnd,
COLORREF crKey,
BYTE bAlpha,
DWORD dwFlags
);
5
Параметр hwnd функции должен являться действительным дескриптором окна, полученным в первом шаге. Параметр crKey представляет собой цветовой ключ, используемый для определения полупрозрачных областей. Параметр bAlpha определяет значение полупрозрачности. При значении параметра bAlpha, равном 0, «полупрозрачные» области будут полностью прозрачны. При значении параметра bAlpha, равном 255, они будут полностью непрозрачны. Параметр dwFlags определяет режим дальнейшего отображения содержимого окна. При включении флага LWA_COLORKEY в значение dwFlags полупрозрачные области окна будут определяться на основании цветового ключа. При включении флага LWA_ALPHA параметр bAlpha будет использоваться для определения значения полупрозрачности.
6
Для того чтобы сделать все окно полупрозрачным, примените вызов SetLayeredWindowAttributes с предпочитаемым значением параметра bAlpha, флагом LWA_ALPHA, но без флага LWA_COLORKEY. Используйте найденный дескриптор окна в качестве первого параметра функции. Например, для того, чтобы сделать окно прозрачным наполовину, используйте вызов:
::SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 128, LWA_ALPHA);
::SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 128, LWA_ALPHA);