В данной статье я попытаюсь изложить в доступной форме порядок создания многоуровневых, или проще говоря, прозрачных окон.
Для создания приложения с прозрачным окномнужно применить функцию WinApi - SetLayeredWindowAttributes.
Вот её синтаксис:
BOOL SetLayeredWindowAttributes(
HWND hwnd,
COLORREF crKey,
BYTE bAlpha,
DWORD dwFlags
);
где:
hwnd - дескриптор(хендл) создаваемого прозрачного окна. Прозрачное окно создано, определяя стиль WS_EX_LAYERED при создании окна с функцией CreateWindowEx, или установкой WS_EX_LAYERED через SetWindowLong после того, как окно было создано.
crKey - ключ структуры COLORREF , который определяет, уровень цвета,который используется при создании прозрачного окна. Все пиксели, окна в этом цвете будут прозрачны. Чтобы генерировать COLORREF, используйте макрокоманду RGB.
bAlpha - это значение описывает степень прозрачности окна, когда bAlpha - 0, окно полностью прозрачно. Когда bAlpha - 255, окно непрозрачно.
dwFlags - определение требуемого действия. Этот параметр может принимать одно или более из следующего величин:
LWA_COLORKEY -
использование crKey как цвет прозрачности.
LWA_ALPHA -
использование bAlpha, чтобы определять непрозрачность многоуровневого окна
Создаем приложение основанное на диалоге по примеру и инструкции указаной на сайте winmain.ru смотреть
// MyDialogApp.cpp : Определяет точку входа приложения.
#include “stdafx.h”
#include “resource.h”
BOOL CALLBACK MainDlgProc(HWND hDlg, UINT message, WORD wParam, LONG lParam)
{
switch (message) {
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch (wParam) {
case IDOK:
EndDialog( hDlg, TRUE );
return TRUE;
case IDCANCEL:
EndDialog( hDlg, FALSE );
return TRUE;
}
break;
}
return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)
{
DialogBox( hInst, MAKEINTRESOURCE(IDD_DIALOG1), 0, (DLGPROC) MainDlgProc );
return 0;
}
После компиляции должно появиться вот такое диалоговое окно:
Теперь для того, что бы сделать его прозрачным необходимо внести следующие дополнения в код:
#include < windows.h >
#include “stdafx.h”
#include “resource.h”
#include < tchar.h >/*библиотека для работы со строками в кодировке юникод
объявить прототип функции для Win2000/XP API: SetLayeredWindowAttributes, которую мы берём из библиотеки USER32.dll*/
typedef BOOL (WINAPI * SLWAProc)(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
// объявим необходимые константы
ifndef WS_EX_LAYERED
#define WS_EX_LAYERED 0×00080000
#endif
#define LWA_ALPHA 0×00000002
BOOL CALLBACK MainDlgProc(HWND hDlg, UINT message, WORD wParam, LONG lParam)
{
switch (message) {
case WM_INITDIALOG:<
SLWAProc pSLWA;
HINSTANCE hUser32;
//сюда импортируем функцию
hUser32 = GetModuleHandle(_T(”USER32.DLL”));
{
pSLWA = (SLWAProc)GetProcAddress(hUser32, (char *)”SetLayeredWindowAttributes”);
if(pSLWA == 0)
return FALSE;
}
// проверим состояние окна и добавим стиль WS_EX_LAYERED
SetWindowLong(hDlg, GWL_EXSTYLE, GetWindowLong(hDlg, GWL_EXSTYLE) | WS_EX_LAYERED);
return pSLWA(hDlg, 0, 130, LWA_ALPHA);/*уровень прозрачности окна можно изменять от 0 до 255, в нашем примере ==130*/
return TRUE;
case WM_COMMAND:
switch (wParam) {
case IDOK:
EndDialog( hDlg, TRUE );
return TRUE;
case IDCANCEL:
EndDialog( hDlg, FALSE );
return TRUE;
}
break;
}
return FALSE;
}
int APIENTRY wWinMain(HINSTANCE hInst, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
DialogBox( hInst, MAKEINTRESOURCE(IDD_DIALOG1), 0, (DLGPROC) MainDlgProc );
return 0;
}
Компилируем проект и видим результат:
Да чуть не забыл, всё создано только лишь на WnApi, никаких сторонних библиотек.
© Goodluck Дмитрий (Cema)