Utilizzando l'API di Windows, come posso garantire che i controlli mantengano un aspetto nativo?

StackOverflow https://stackoverflow.com/questions/111630

Domanda

Alcuni dei controlli che ho creato sembrano predefiniti al vecchio tema di Windows 95, come posso impedirlo? Ecco un esempio di pulsante che non mantiene l'aspetto nativo del sistema operativo (sto usando Vista come ambiente di sviluppo):

HWND button = CreateWindowEx(NULL, L"BUTTON", L"OK", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
                                  170, 340, 80, 25, hwnd, NULL, GetModuleHandle(NULL), NULL);

Sto usando C ++ nativo con l'API di Windows, nessun codice gestito.

È stato utile?

Soluzione

Credo che non abbia nulla a che fare con il tuo codice, ma è necessario impostare un file manifest appropriato per ottenere i controlli a tema.

Alcune informazioni qui: @ msdn.com e qui: @ blogs.msdn.com

Puoi vedere una differenza tra l'applicazione con e senza manifest qui: heaventools.com

Altri suggerimenti

Per aggiungere un manifest all'applicazione è necessario creare un file MyApp.manifest e aggiungerlo al file di risorse dell'applicazione:

//-- This define is normally part of the SDK but define it if this 
//-- is an older version of the SDK.
#ifndef RT_MANIFEST
#define RT_MANIFEST              24
#endif

//-- Add the MyApp XP Manifest file
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "MyApp.manifest"

Con le versioni più recenti di Visual Studio è presente una scheda Strumento manifest nelle impostazioni del progetto e il campo File manifest aggiuntivi presente in questo scheda può anche essere utilizzata per definire il file manifest.

Ecco un semplice file MyApp.manifest per un'applicazione Win32:

<?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.1"
    processorArchitecture="X86"
    name="Microsoft.Windows.MyApp"
    type="win32"
/>
<description>MyApp</description>
</assembly>

Se l'applicazione dipende dalle altre DLL, questi dettagli possono anche essere aggiunti al manifest e Windows utilizzerà queste informazioni per assicurarsi che l'applicazione utilizzi sempre le versioni corrette di queste DLL dipendenti.

Ad esempio, ecco i dettagli sulla dipendenza manifest per le librerie di runtime C di controllo comune e versione 8.0:

<dependentAssembly>
    <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        processorArchitecture="X86"
        publicKeyToken="6595b64144ccf1df"
        language="*"
    />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity
        type="win32"
        name="Microsoft.VC80.CRT"
        version="8.0.50608.0"
        processorArchitecture="x86"
        publicKeyToken="1fc8b3b9a1e18e3b" />
</dependentAssembly>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top