2010-12-09 69 views
0

Je suis en train de programmer une interface graphique avec winapi, mais mon application ressemble au thème Windows 98. Comment utiliser le thème de la fenêtre en cours?Comment utiliser le thème de l'interface graphique par défaut sous Windows?

J'ai essayé de créer un fichier manifeste, mais cela ne fonctionne pas.

Test.cpp

# include <windows.h> 

int WINAPI WinMain(
    HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow 
){ 
    MessageBox(NULL, "Hello World!", "Hello", MB_OK); 
    return 0; 
} 

Test.exe.Manifest

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

Manifest.rc

1 24 "Test.exe.Manifest" 

Je compilé avec Mi Compilateur nGW sur Windows XP SP3. Mais quand j'exécute le fichier exécutable, il se ferme.

g++ Test.cpp -c 
windres Manifest.rc -O coff -o Manifest.res 
g++ Test.o Manifest.res -o Test.exe -Wl,-subsystem,windows 

Sans les fichiers manifestes et de ressources, cela fonctionne, mais utilise le thème Windows 98.

Merci


Edit:

Merci, maintenant il fonctionne.

J'ai copié le fichier manifeste à partir d'un tutoriel et je n'ai pas appelé InitCommonControls().

InitCommonControls() fonctionne.

J'ai dû éditer mon commctrl.h, parce que InitCommonControlsEx() a été désactivé là, et fonctionne maintenant.

commande Linker a changé:

g++ Test.o Manifest.res -o Test.exe -Wl,-subsystem,windows -lcomctl32 
+0

Avez-vous essayé d'appeler InitCommonControls ou InitCommonControlsEx? – Jon

Répondre

2

Essayez ce code avant d'appeler MessageBox

INITCOMMONCONTROLSEX iccx = { sizeof(INITCOMMONCONTROLSEX), ICC_COOL_CLASSES | ICC_BAR_CLASSES}; 
::InitCommonControlsEx(&iccx); 
+0

Ah, c'est vrai, c'est l'appel dont je ne me souvenais plus. – Mario

1

est votre installation MinGW à jour? N'a plus XP mais essayé sur Win7 et la boîte de message utilise le style Vista/7 (bouton "OK" en bas à droite, fond blanc/gris, etc.).

Vous ne devriez pas avoir à fournir de commutateurs de compilation, devrait être suffisant pour simplement exécuter g++ test.cpp -o test.exe pour créer un exécutable Win32 sous Windows. Cependant, je me souviens d'avoir des problèmes similaires lorsque je travaillais encore avec Visual Basic 6. Je pense que vous devez initier les contrôles communs dans votre application (désolé, je ne me souviens pas de l'appel en ce moment). Si vous ne le faites pas, le forcer à travers le fichier manifeste entraînera un plantage. Je ne suis pas sûr à 100% sur celui-ci, ça fait des années ... mais j'essaierais de chercher ça en premier. Aussi, à des fins de test, vous ne devriez pas avoir à inclure le manifeste dans votre exécutable. Il suffit de le mettre comme "test.exe.manifest" - cela devrait fonctionner aussi bien et vous permet de tester avec/sans le fichier manifeste sans recompilation. Editer: Voir la réponse de DreJ - c'est l'appel dont je parlais aussi.

0

Il y a un guide utile sur MSDN

Dans ce cas particulier, il semble que vous n'êtes pas liez comctl32.lib, et vous n'êtes pas appeler InitCommonControls ou InitCommonControlsEx pour préparer les nouveaux styles visuels à utiliser.