В данной статье я попытаюсь изложить в доступной форме порядок создания многоуровневых, или проще говоря, прозрачных окон.
Для создания приложения с прозрачным окномнужно применить функцию 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)


От dmitry

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *