Díky autorovi za uveřejnění postupu, jak dosáhnout průhledných oken !!!!
Pokud pracujete ve Visual C++, a chtěli byste si použití průhledných oken vyzkoušet, narazíte na problém, že ve Visual C++ vč. verze 6.0 chybějí definice pro tyto funkce. Ty jsou k dispozici až ve Visual Studiu.NET. Ale co když jej nemáte ?
Zde jsou definice a příklad potřebný pro začlenění průhledných oken do projektu ve VC++ 6.0.
Uvedené příkladu nejsou zrovna optimalizované, to už nechám na vás.
Doufám, že se na mě nebude autor článku zlobit, že mu nabourávám články o C++ Builderu kódem
pro konkurenční Visual C++ .
/*****************************************************************************/
/* Layered.h Copyright Ladislav Zezula 2002 */
/*---------------------------------------------------------------------------*/
/* This is the layered windows support for Visual C++ 6.0 */
/*****************************************************************************/
#ifndef __LAYERED_WINDOWS_H__
#define __LAYERED_WINDOWS_H__
//-----------------------------------------------------------------------------
// Defines
#define WS_EX_LAYERED 0x00080000 // Define the style
#define LWA_COLORKEY 0x00000001
#define LWA_ALPHA 0x00000002
//-----------------------------------------------------------------------------
// Functions
BOOL WINAPI GetLayeredWindowAttributes(
HWND hwnd, // handle to the layered window
COLORREF *pcrKey, // color key
BYTE *pbAlpha, // Alpha value
DWORD *pdwFlags // layering flags
);
BOOL WINAPI SetLayeredWindowAttributes(
HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
BYTE bAlpha, // value for the blend function
DWORD dwFlags // action
);
#endif __LAYERED_WINDOWS_H__
/*****************************************************************************/
/* Layered.cpp Copyright Ladislav Zezula 2002 */
/*---------------------------------------------------------------------------*/
/* This is the implementation file for layered windows using Visual C++ 6.0 */
/* This feature is supported only in Win2X and WinXP, so we have to try to */
/* retrieve functions dynamically. Layered functions are exported by */
/* User32.dll */
/*****************************************************************************/
#include
#include "Layered.h"
typedef BOOL (WINAPI * SETLAYEREDWINDOWATTRIBUTES)(HWND, COLORREF, BYTE, DWORD);
typedef BOOL (WINAPI * GETLAYEREDWINDOWATTRIBUTES)(HWND, COLORREF *, BYTE *, DWORD *);
BOOL WINAPI SetLayeredWindowAttributes(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags)
{
SETLAYEREDWINDOWATTRIBUTES fn;
HINSTANCE hUser32 = LoadLibrary("User32.dll");
BOOL result = FALSE;
// Retrieve pointer to the function. If succeeded, call it.
fn = (SETLAYEREDWINDOWATTRIBUTES)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
if(fn != NULL)
result = fn(hwnd, crKey, bAlpha, dwFlags);
else
SetLastError(ERROR_NOT_SUPPORTED);
FreeLibrary(hUser32);
return result;
}
BOOL WINAPI GetLayeredWindowAttributes(HWND hwnd, COLORREF *pcrKey, BYTE *pbAlpha, DWORD *pdwFlags)
{
GETLAYEREDWINDOWATTRIBUTES fn;
HINSTANCE hUser32 = LoadLibrary("User32.dll");
BOOL result = FALSE;
// Retrieve pointer to the function. If succeeded, call it.
fn = (SETLAYEREDWINDOWATTRIBUTES)GetProcAddress(hUser32, "GetLayeredWindowAttributes");
if(fn != NULL)
result = fn(hwnd, pcrKey, pbAlpha, pdwFlags);
else
SetLastError(ERROR_NOT_SUPPORTED);
FreeLibrary(hUser32);
return result;
}
// Example :
VOID AppearWindow(HWND hDlg)
{
for(int i = 0; i < 255; i++)
SetLayeredWindowAttributes(hDlg, COLOR_WINDOW, (BYTE)i, LWA_ALPHA | LWA_COLORKEY);
}
VOID FadeWindow(HWND hDlg)
{
for(int i = 255; i >= 0; i--)
SetLayeredWindowAttributes(hDlg, COLOR_WINDOW, (BYTE)i, LWA_ALPHA | LWA_COLORKEY);
}