Die Größe des Windows Volume Mixer-Symbols ist zu groß

9

Wenn im Windows-Volumemixer Sounds in Ihrer Anwendung wiedergegeben werden, werden das Symbol Ihrer Anwendung und ein benutzerdefinierter Lautstärkeregler hinzugefügt, um die für diese Anwendung spezifische Lautstärke einzustellen ... nett! Wenn Sie jedoch ein großes Symbol für Ihre Anwendung verwenden (besonders wichtig bei hoher DPI, wenn Windows Ihre Symbole für die Taskleiste skaliert, usw.), wird das Symbol im Volume-Mixer nicht korrekt skaliert. Insbesondere verwende ich den folgenden Code, um das Symbol der Anwendung festzulegen:

%Vor%

Der Schuldige ist der "Hallo-Res wenn verfügbar" -Teil. Wenn ich das einschließe, sieht das Taskbar-Icon gut aus, aber der Volume Mixer ist nicht skaliert und sieht schrecklich aus. Wenn ich das ausschließe, sieht das Taskbar-Icon schlecht aus (furchtbare Skalierung), aber der Volume Mixer hat mindestens die richtige Größe:

Hat jemand eine Lösung gefunden, die dafür sorgt, dass BEIDE Icons gut aussehen?

BEARBEITEN : In meiner Symboldatei habe ich folgende Auflösungen: 256x256, 48x48, 32x32, 24x24 und 16x16, alle 32-Bit. Die 256x256 ist PNG komprimiert, die anderen sind roh. Alle Größen sehen gut aus bei den Auflösungen, die sie in der Datei haben (ich habe versucht, das ICO hier oder imgur zu setzen, aber anscheinend keine Icons zu erlauben). Außerdem habe ich versucht, einige 8-Bit-Bilder einzubauen, aber das scheint die Dinge nicht zu ändern.

BEARBEITEN : Ich verwende GetDeviceCaps( hdc, LOGPIXELSX ) (und Y), um die Desktop-Skalierung zu bestimmen. Normalerweise ist die Desktop-Skalierung 100% und ich bekomme das normale 96-Ergebnis. Aber mehr und mehr sehe ich Computer standardmäßig auf 125%. Dies kann mit der rechten Maustaste geändert werden Desktop, Personalisieren, andere: Display ... dort ist ein Schieberegler (erfordert Abmelden / in für Änderung).

BEARBEITEN : Ich möchte auch darauf hinweisen, dass das Tray-ICON in High-DPI-Modi (also bei Verwendung von Shell_NotifyIcon ) einem ähnlichen Skalierungsproblem unterliegt. In diesem Fall kann ich jedoch GetDeviceCaps( hdc, LOGPIXELSX ) verwenden, um zu bestimmen, was Windows will. Wenn ich die Größe habe, stelle es direkt zur Verfügung, ansonsten stelle 256x256 ein und Windows macht es richtig skalieren .

BEARBEITEN : Traurigkeit folgt. Dieses Problem kann ein Windows-Problem sein. Bei der Aufnahme von Bildern zu Demonstrationszwecken fiel mir auf, dass das Volume-Mixer-Symbol selbst schlecht aussieht. Zum Vergleich:

FINAL EDIT : Wie unten beschrieben, besteht die Problemumgehung für das Problem darin, die Symbole zu skalieren. Der letzte funktionierende Code ist das Laden eines Zeigers auf die LoadIconWithScaleDown -Funktion von Comctl32.dll (nicht gezeigt) und das Verwenden, wenn es verfügbar war, oder das Zurückfallen auf den "normalen / alten" Weg:

%Vor%     
mark 30.07.2013, 14:22
quelle

3 Antworten

2

Ja, ich kann das Problem, das Sie beschreiben, reproduzieren, wenn ich denselben Code wie in der Frage verwende. Wie wir festgestellt haben, tritt das Problem nur bei hohen DPI-Einstellungen auf. Bei 100% Skalierung (~ 96 dpi) müssen Sie sogar für Windows Vista und höher nur die "große" Version des Symbols ( SM_CXICON und SM_CYICON ; normalerweise 32x32 Pixel) für ein Fenster verwenden, nicht die 256x256 Pixelversion. Das ist es, was die mit Windows gebündelten Apps tun, einschließlich des Volume Mixer Applet, mit dem Sie testen.

Das Problem tritt auf, wenn Sie hohe DPI-Einstellungen verwenden, wodurch die Größe "groß" erhöht wird:

%Vor%

Beim Laden des 256x256-Pixel-Symbols funktioniert alles einwandfrei, unabhängig von der DPI, da Windows die Größe automatisch auf die erforderliche Größe herunterskaliert. Dies erzeugt ein Icon mit einer viel besseren Qualität (ohne all die Schattierungen und andere Artefakte), als zu versuchen, ein hoch 32x32 Pixel Icon zu skalieren. Ihre Vermutung ist also richtig, das Problem hängt tatsächlich mit der Skalierung zusammen.

Ich gehe davon aus, dass das, was Sie im Volume Mixer-Applet sehen, wenn Sie ein 256x256 Pixel-Icon verwenden, ein Bug ist - es sollte dieses große Icon auf die erwartete Größe skalieren, was ein "großes" ist "Symbol ( SM_C?ICON ). Vermutlich ruft es die Funktion DrawIconEx auf, wobei die Parameter cxWidth und cxHeight beide auf 0 gesetzt sind und nicht das Kennzeichen DI_DEFAULTSIZE übergibt. Das bewirkt, dass das Symbol mit seiner tatsächlichen Größe gezeichnet wird - sehr groß.

Sie müssen das Problem manuell umgehen, indem Sie die Symbole selbst skalieren. Glücklicherweise führt Windows Vista eine Reihe von Funktionen ein, die speziell für diesen Zweck entwickelt wurden. Die einfachste Methode in diesem Fall ist LoadIconWithScaleDown . Wie der Name schon andeutet, funktioniert es ähnlich wie die älteren LoadIcon / LoadImage -Funktionen, aber anstatt ein zu kleines Icon zu skalieren, skaliert es ein größeres Icon herunter - perfekt für einen Giganten, von hoher Qualität 256x256 Pixel-Symbol in Ihrer ICO-Datei.

Leider sind diese Funktionen in älteren Windows-Versionen nicht verfügbar, da bei höheren DPI-Einstellungen wahrscheinlich das gleiche Problem auftritt. Sie müssen dort Alternativen finden oder sich einfach mit gezackten, skalierten Symbolen auf diesen älteren Betriebssystemen zufrieden geben.

Beispielcode:

%Vor% %Vor%

Beachten Sie, dass Sie zur Verwendung dieser neuen Funktionen eine Verknüpfung mit Version 6 der Bibliothek für allgemeine Steuerelemente herstellen müssen. Dazu müssen Sie den Compiler anweisen, in comctl32.lib zu verlinken und ein Manifest in Ihre Anwendung einzubetten. Beides kann mithilfe der MSVC-spezifischen #pragma s, die im obigen Beispielcode gezeigt wird, oder in den Eigenschaften Ihres Projekts konfiguriert werden. Wenn Sie eine der folgenden Maßnahmen nicht ausführen, erhalten Sie beim ersten Start der App einen Link-Zeit-Fehler oder den Fehler "Ordinal nicht gefunden".

    
Cody Gray 02.08.2013, 05:37
quelle
1

Ich habe ein ähnliches Problem mit einem C # / WPF-Programm festgestellt.

In meinem Fall scheint das Problem auf fehlende Größen in der ico-Datei zurückzuführen zu sein. Die kleinste Größe der ico-Datei meiner App war 64x64. Sobald ich kleinere Größen in dieser Datei hinzugefügt habe, wurde das Problem gelöst.

    
Yoav Feuerstein 14.06.2017 13:01
quelle
0

Danke euch sehr dafür. Ich habe das in unserer Wx-App zur Arbeit, wenn jemand möchte, dass ein vorgebackener Code in seine Wx-App passt, hier ist meine unten:

%Vor%

Die erste Zeile in Ihrer app.rc wäre dann etwa so:

%Vor%     
Rafael Kitover 19.09.2017 22:49
quelle

Tags und Links