Formuláře v C++ Builderu III. (prozatím) naposled

Diskuze čtenářů k článku

Ladislav Zezula  |  10. 01. 2002 09:35

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);
}

Souhlasím  |  Nesouhlasím  |  Odpovědět
Radek Chalupa  |  10. 01. 2002 10:04

Před časem jsem zde psal článek o průhledných oknech ve Visual C++, najdete ho také zde:

http://www.radekchalupa.cz/tools/clanek.asp?page=developer\visual_cpp\clanky\2001\layered_windows.htm

Obávám se, že pouze tyto definice nestačí, musíte mít také novější verze knihoven. Není to ani tak věc Visual C++ 6 vs. .Net Studio, ale příslušného Windows SDK. Doporučuji stáhnout (pokud máte pevnou linku nebo kabelový modem) poslední verzi - listopad 2001. zde:

http://www.microsoft.com/msdownload/platformsdk/sdkupdate/

Po instalaci SDK stačí v nastavení (pokud to instalátor neudělá za vás), přidat do "directories" cesty k složce \inc a \lib, a ty přesunout nahoru, aby do nich "lezl" jako první.

Námět pro všechny? Zkoušel již někdo výše uvedené stažené SDK začlenit do C++ Builderu? Zatím jsem necítil potřebu a po zkušenostech s C++ Builderem zatím věnuji čas něčemu užitečnějšímu, obávám se že by to až tak snadnu neprošlo.

Radek Chalupa - www.radekchalupa.cz

Souhlasím  |  Nesouhlasím  |  Odpovědět
Ladislav Zezula  |  10. 01. 2002 10:28

Tak to se omlouvám, nevšiml jsem si toho, že tam takový článek už je. Příště se budu líp dívat

Ale tyto definice 100%ně stačí, mám to odzkoušené (až na syntaktickou chybu ve funkci GetLayeredWindowAttributes). Nové verze knihoven jsou potřeba pouze pokud chcete linkovat obě funkce přímo při sestavení programu. Takový program ovšem při pokusu o spuštění z Win98 zobrazí něco jako "Symbol GetLayeredWindowAttributes nebyl nalezen v tabulce exportovaných symbolů knihovny User32.dll", navíc se budou "hádat" moje funkce Set/GetLayeredWindowAttributes a ty, které jsou v User32.lib.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Radek Chalupa  |  10. 01. 2002 13:01

Omlouvat se nemáte za co, zmínil jsem se o tom článku jen pro případné zájemce o více podrobností.

Ale to s těmi knihovnami se mi opravdu nějak nezdá, že by v user32.lib té původní verze z krabice Visual C++ byly tyhle funkce pro Win2000?. Já už je mám na HD přepsané novějšími, když tak se zkusím podívat na instalační CD.....

Jinak když máte nové SDK, tak prostě stačí dát "nahoru" ty nové includy (windows.h) a knihovny a nastavit správně definice WINVER a WIN32_WINNT a můžete používat ty funkce bez problémů

Radek Chalupa

Souhlasím  |  Nesouhlasím  |  Odpovědět
Ladislav Zezula  |  10. 01. 2002 13:11

V user32.lib tyhle funkce skutečně nejsou, ale právě proto jsem napsal příklad pro jejich dynamické natahování z User32.dll .

Souhlasím  |  Nesouhlasím  |  Odpovědět
Radek Chalupa  |  10. 01. 2002 13:17

Máte to vyzkoušené, takže máte pravdu, já měl jen dojem, že i tak se po nich bude linker shánět v user32.lib a bude řvát, že je tam nenaěšel. Ale je to tak jak říkáte.....

Souhlasím  |  Nesouhlasím  |  Odpovědět
KOPRajs  |  03. 02. 2005 14:00

Dobry den, mam mensi problem...
dostal se mi do ruky programek, ktery zrejme pouziva vyse zmineneho postupu pro vytvoreni pruhledneho okna, ovsem pri spusteni pod Windows 98/Me samozrejme hlasi chybu, chybi potrebne API funkce v user32.dll.
Zajimalo by me, jake mam moznosti, kdyz potrebuji prislusny programek rozchodit, krom reinstalace Win Me na 2k, nebo XP... nema nekdo tuseni, zda existuje nejaka moznost aktualizace knihoven Win98/Me, nebo jiny zpusob, jak to rozbehat... P.S. Nepotrebuji, aby to okno bylo pruhlene, byl bych vdecny, kdyby se ho povedlo zobrazit normalne...
Dekuji za pripadnou pomoc...

Souhlasím  |  Nesouhlasím  |  Odpovědět
Zasílat názory e-mailem: Zasílat názory Můj názor