1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
// Prototyp für den Funktionspointer auf 'SetLayeredWindowAttributes'.
typedef int (__stdcall * SLWA) (::HWND__* hwnd, unsigned long key, unsigned char alpha, unsigned long flag);
// ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Setzt dem Fenster einen Transparenzwert (Alphablending) zwischen 0 und 100.
// ACHTUNG: Nur lauffähig auf Systemen von NT4 aufwärts.
// ///////////////////////////////////////////////////////////////////////////
bool IWindow::set_alpha (unsigned long percent)
{
// Bei 100 Prozent den Stil '0x00080000' für das Blending entfernen.
if (percent >= 100)
{
// Stil '0x00080000' entfernen
if (::SetWindowLongW (hwnd_, GWL_EXSTYLE, ::GetWindowLongW (hwnd_, GWL_EXSTYLE) & ~0x00080000) != 0)
return (false);
// Fenster und Kinder auffordern sich neu zu zeichnen.
return (::RedrawWindow (hwnd_, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN) != 0);
}
// Funktionspointer für die Funktion 'SetLayeredWindowAttributes' bereitstellen
// und Zeiger auf das Modul 'user32.dll"' beschaffen
::SLWA set_layered_window_attributes = NULL;
::HINSTANCE__* module = ::GetModuleHandleW (L"USER32.DLL");
// Prüfen ob das Modul geladen werden konnte
if (!module)
return (false);
// 'SetLayeredWindowAttributes' aus dem Modul 'user32.dll' entnehmen und auf Funktionspointer legen.
if (!(set_layered_window_attributes = reinterpret_cast<::SLWA>(::GetProcAddress (module, static_cast<char*>("SetLayeredWindowAttributes")))))
return (false);
// Stil '0x00080000' setzen.
::SetWindowLongW (hwnd_, GWL_EXSTYLE, ::GetWindowLongW (hwnd_, GWL_EXSTYLE) | 0x00080000);
// Alphablending setzen.
return (set_layered_window_attributes (hwnd_, 0, static_cast<unsigned char>(percent * 255 / 100), 0x00000002) != 0);
}
|