Vizualizace v aplikacích pro Windows XP

S novými Windows XP přichází také jejich výrazně nový vizuální vzhled, který částečně modifikuje i starší aplikace. Pokud chcete, aby i prvky v klientské oblasti měly nový vzhled, musíte učinit další kroky – o nich si dnes řekneme.
S novými Windows XP přichází také jejich výrazně nový vizuální vzhled. Pokud si uživatel nechá nastavený tento nový vzhled, i u starších aplikací dojde ke znatelné změně jejich vzhledu. U „starých“ aplikací spuštěných pod Windows XP se však tato změna týká pouze neklientské oblasti okna. Změní se styl okrajů a především titulkového pruhu s jeho systémovými ikonami, dále jsou zde změny v nabídkách s jejich stínováním a pod.

Ani naše nové aplikace, tedy aplikace vytvořené a přeložené pod Windows XP, nemají z nového vzhledu nic než neklientskou oblast. Pokud chceme, aby i prvky v klientské oblasti měly nový vzhled, musíme učinit další kroky – o nich si dnes řekneme.

Nový vzhled běžných prvků Windows

O zobrazení běžných prvků Windows – pokud nejsou uživatelsky kreslené (owner-draw) – se „stará“ knihovna ComCtl32.dll (common control library). Windows XP obsahují 2 verze této knihovny: původní verzi 5, odpovídající předchozí verzi Windows, a novou verzi 6, která obsahuje nový vzhled prvků. Když si necháte vyhledat soubor ComCtl32.dll, zjistíte, že jeden takový je ve složce \windows\system32 a druhý ve složce \windows\winsxS\..... Ten ve složce system32 je právě knihovna verze 5, o čemž se můžete přesvědčit přímo z průzkumníka, když si necháte zobrazit vlastnosti. Druhý soubor pak je zmíněná nová verze 6. Pro použití nového vzhledu musí tedy aplikace použít právě verzi 6 (nebo vyšší) této knihovny. Navíc se zde však vyskytuje několik „problémů“:
  • Verzi 6 není možné redistribuovat do starších verzí Windows. Nelze tedy nijak použít nové vizuální styly ve starších verzích Windows. Samozřejmě nemám na mysli uživatelské kreslení – pomocí něho můžeme „nakreslit cokoli“, to je ale o něčem jiném než o vizuálních stylech.
  • I ve Windows XP používají aplikace jako výchozí verzi 5 zmíněné knihovny.
V ukázkovém projektu je aplikace založená na dialogu s několika různými prvky Windows. I když ji přeložíme a spustíme pod Windows XP, bude výsledek vypadat takto:

Jak nařídit aplikaci, aby používala knihovnu verze 6?

Máme v podstatě 2 možnosti:

1. Vytvořit tzv. manifest, což je soubor v XML formátu, obsahující potřebné informace, který nazveme stejně jako spustitelný soubor, s příponou .manifest. Tedy například pokud máme aplikaci mojeaplikace, .exe soubor manifestu se musí jmenovat mojeaplikace.exe.manifest. Obsah souboru manifestu vidíte na následujícím výpisu:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="X86"
    name="CompanyName.ProductName.YourApplication"
    type="win32"
/>
<description>Your application description here.</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

Je zřejmé, že soubor obsahuje různé informace obsahující např. název a popis aplikace, název firmy apod. Důležitá je informace o verzi common-controls, to jsou ty 2 řádky

name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"

Tento soubor musíme umístit do stejné složky jako spustitelný program

2. Pokud nechceme mít soubor manifestu v externím souboru, můžeme vytvořit zdroj (resource) typu RT_MANIFEST nazvaný CREATEPROCESS_MANIFEST_RESOURCE_ID, který obsahuje binární data totožná s obsahem výše uvedeného souboru manifestu. Nejjednodušším způsobem, jak takový resource „vytvořit“, je jednoduše importovat do resourců výše uvedený soubor manifestu s tím, že jako typ resource musíme zadat RT_MANIFEST a identifikátor nazveme CREATEPROCESS_MANIFEST_RESOURCE_ID.

Nyní se již můžeme podívat na výsledek po přidání uvedeného resource nebo po použití souboru manifestu:

Jak vidíte, nyní je aplikace kompletně „vizualizovaná“, včetně prvků v klientské oblasti.

Takto „upravit“ tedy můžeme jakoukoli, i „starou“ aplikaci. Pokud máme k disposici pouze konečný .exe soubor, musíme samozřejmě použít variantu 1., tedy externí soubor manifestu.

Uživatelsky kreslené prvky v XP

Při aplikaci nového vzhledu výše uvedeným způsobem narazíme na problém, pokud daná aplikace používá uživatelsky kreslené prvky. Ty jsou u „starých“ aplikací samozřejmě kresleny s využitím „klasických“ funkcí, jako například DrawFrameControl, které samozřejmě způsobí to, že prvky jsou kresleny „natvrdo“ ve starém stylu a použití manifestu jej nijak neovlivní. Pro kreslení uživatelsky kreslených prvků v novém stylu musíme použít nové sady funkcí – o nich si řekneme někdy příště.

Pár doporučení na závěr

Pokud použijeme vizualizaci pomocí manifestu na systému, kde není k dispozici verze 6 knihovny ComCtl32.dll, „nic se nestane“. Vzhled klientské oblasti nebude nijak ovlivněn.

Před použitím manifestu bychom měli aplikaci sami „vizuálně otestovat“. Především na zmíněné uživatelsky kreslené prvky, které mohou leckterým programátorům zůstat skryty třeba pod závojem VCL. Na následujícím obrázku vidíte aplikaci vytvořenou v C++ Builderu (u Delphi je to totéž, používá stejnou knihovnu – VCL), kde je kromě standardního tlačítka (komponenta TButton) použita komponenta TBitBtn a dále TSpeedBtn, které jsou uvnitř VCL knihovny kreslené uživatelsky.

Jak je vidět, celkový dojem není příliš pozitivní a v tomto případě je lépe nechat „vše při starém“ a popřípadě počkat, až bude aplikace přepsána kompletně. Pokud tento článek náhodou čte někdo, kdo vlastní Delphi 6, zajímalo by mě, zda poslední verze VCL už umí uživatelsky kreslit v novém stylu. Dejte prosím vědět.

Zde je ke stažení ukázkový projekt visual_styles_xp.zip.

Diskuze (7) Další článek: Quake III Arena rychlejší na Linuxu

Témata článku: , , , , , , , , , , , , , , , , , , , , , ,