5 Stimmen

Der Dialog hat ein modernes Aussehen bei der Gestaltung, aber ein altes Aussehen bei der Ausführung (unter Verwendung von Visual C++ und Resource Editor)

Ich erstelle einen Dialog mit dem Ressourceneditor von Visual C++.

Wenn ich die Testschaltfläche des Editors ausführe, werden die Komponenten des Dialogs mit einem modernen Aussehen angezeigt, während beim Ausführen der Anwendung, die den Dialog erstellt und anzeigt, dieser mit einem alten Aussehen angezeigt wird... Ich verwende nur WINAPI-Aufrufe, um den Dialog anzuzeigen, nicht MFC.

Hier sind die Screenshots (das obere Bild ist ein Beispiel für das Aussehen der Benutzeroberfläche zur Entwurfszeit, das andere ist das Aussehen der Benutzeroberfläche zur Laufzeit):

Linktext

Weiß jemand, was ich falsch mache?

5voto

DavidK Punkte 3834

Haben Sie ein Manifest korrekt eingerichtet, um Version 6 von commctl32.dll in Ihrem Projekt zu verwenden? Wenn nicht, werden Sie die thematischen Steuerelemente nicht erhalten.

In späteren Versionen von Visual Studio wird dies in der Regel mit einem #pragma gemacht, etwa so (dieses hier ist für x86, kopiert aus einem neuen Projekt, das mit VS2005 erstellt wurde):

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

Wenn Sie dies zu einer der Quelldateien in Ihrem Projekt hinzufügen und neu erstellen, wird das Manifest vom Linker generiert und zu Ihrer Anwendung hinzugefügt. Für andere Prozessorarchitekturen müssen Sie den Wert "processorArchitecture" ändern. (Warum VS dies nicht selbst herausfinden kann, bleibt ein Rätsel, das der Leser lösen muss...)

(Wie bereits von anderen erwähnt, können Sie das Manifest auch manuell erstellen und der .rc-Datei hinzufügen. Das ist zwar etwas langwieriger, gibt Ihnen aber die vollständige Kontrolle über den Inhalt des Manifests).

0 Stimmen

Eine weitere Möglichkeit, dies einzustellen, ist der Projekteigenschaften-Dialog. Erforderliche Option in VS2010 ist unter Konfigurationseigenschaften - Linker - Manifestdatei - Zusätzliche Manifest-Abhängigkeiten.

1 Stimmen

Genauer Wert, der einzugeben ist, wenn Sie den Rat von @IvanNikitin befolgen: "type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'" (Ich habe eine Weile gebraucht, um das herauszufinden). source

4voto

1800 INFORMATION Punkte 125009

Ist in Ihrem Anwendungsmanifest angegeben, dass Sie comctl32.dll Version 6 verwenden möchten? Dies ist eine der Voraussetzungen für die Verwendung von visuelle Stile und ein moderneres Aussehen in Windows XP.

So erstellen Sie ein Manifest und ermöglichen Ihrer Anwendung die Verwendung visueller Stile.

Verknüpfen Sie mit ComCtl32.lib und rufen Sie InitCommonControls auf (siehe die Platform SDK Dokumentation in der MSDN Library).

Fügen Sie eine Datei namens YourApp.exe.manifest zu Ihrem Quellbaum hinzu, die das folgende XML-Format hat:

<?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.YourApp"
  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>

Fügen Sie das Manifest wie folgt in die Ressourcendatei Ihrer Anwendung ein

CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "YourApp.exe.manifest"

Hinweis: Wenn Sie den vorherigen Eintrag zur Ressource hinzufügen, müssen Sie ihn in einer Zeile formatieren. Alternativ können Sie die XML-Manifestdatei in das gleiche Verzeichnis wie die ausführbare Datei Ihrer Anwendung legen. Das Betriebssystem lädt zuerst das Manifest aus dem Dateisystem und überprüft dann den Ressourcenabschnitt der ausführbaren Datei. Die Dateisystemversion hat Vorrang.

1voto

VolkerK Punkte 93746

Einige Windows Forms-Steuerelemente nehmen ihr neues Gewand an, sobald die Anwendung an die Version 6.0 von Comctl32.dll gebunden ist.

und wie Sie das erreichen können, wird unter Verwendung von Windows XP Visual Styles mit Steuerelementen in Windows Forms

1voto

Nick Dandoulakis Punkte 41402

Ich habe eine Lösung für VC6, aber ich bin nicht sicher, ob es in VS 2008 funktionieren wird.
(siehe auch dieser Artikel was die Ursache des Problems ist)

Hier ist ein Beispiel für eine einfache Manifestdatei, die ich zur Lösung dieses Problems verwendet habe:

Erstellen Sie die folgende XML-Datei,

<?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="Microsoft.Windows.YourApplication"
    type="win32"
/>
<description>YourApplication</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

Fügen wir zunächst zwei Zeilen in die Datei resource.h ein. Kopieren Sie einfach die folgenden Zeilen und fügen Sie sie ein:

#define IDR_MANIFEST  1
#define RT_MANIFEST  24

Öffnen Sie nun die anwendungsspezifische Ressourcendatei. Sie befindet sich normalerweise im Verzeichnis res; die Standarderweiterung ist .rc2. Fügen Sie manuell die folgende Zeile hinzu:

// Add manually edited resources here...
IDR_MANIFEST RT_MANIFEST MOVEABLE PURE
             "res\\ApplicationManifestXMLFile"

Ersetzen Sie ApplicationManifestXMLFile durch den tatsächlichen Dateinamen (die von Ihnen erstellte XML-Datei).

0voto

user1944491 Punkte 447

Die Frage spezifiziert C++ und diese andere Frage zeigt, wie man es sauberer machen kann.

Für .Net 2.0+, siehe >dieser MSDN-Artikel< wie man das mit einer Zeile Code machen kann, nämlich:

Main() 
{
    Application.EnableVisualStyles();
}

Ich hoffe, dies hilft jemandem, der nach diesem Thema sucht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X