Falsche Skalierung auf koreanischen PCs

9

Die Situation

Wir verkaufen eine Windows Forms-Anwendung für Kunden auf der ganzen Welt. Wir haben es in mehreren Ländern in Europa und Amerika installiert. Keine Probleme. Letzte Woche haben wir unsere Software in Südkorea installiert und ein seltsames Verhalten erkannt ...

Das Problem tritt nur auf den Office-PCs des Kunden auf, aber auf allen. Einige haben Windows 7 Professional K, andere Windows XP.

Der Kunde hat einen neuen PC mit einem installierten Windows 7 Ultimate gekauft. Auf diesem PC gibt es kein Problem.

Die Funktion

Alle Elemente in unserer Anwendung sind von einer "Eltern-Benutzer-Kontrolle" abgeleitet, die spezielle Funktionen bietet. Eine dieser Funktionen ist "Autosizing und Positionierung". Wenn das übergeordnete Element die Größe ändert, wird diese Funktion aller untergeordneten Elemente aufgerufen.

Wenn unsere Anwendung startet, speichern wir die "ClientSize":

%Vor%

Wenn sich die Größe der Anwendung ändert, berechnen wir den Skalierungsfaktor und lösen damit ein Ereignis aus:

%Vor%

Nun führt jedes abonnierte Kind eine automatische Größenanpassung und Positionierung durch:

%Vor%

Das Problem

Wenn unsere Anwendung auf den PCs der Kunden in Südkorea startet, ist die Breite etwa 20% zu klein. Das heißt, auf der rechten Seite befindet sich ein Bereich, der nur einen grauen Hintergrund hat. Die Höhe ist etwa 10% zu hoch. Das heißt, die Artikel, die sich am unteren Rand unserer Anwendung befinden, befinden sich außerhalb des Bildschirms.

Die Korrektur

Zuerst dachten wir, dass das Problem von der Windows DPI-Einstellung herrührt. Als ich meinen Laptop auf 125% stellte, sah es ähnlich aus. Aber die Kunden PCs sind alle auf 100% eingestellt ...

Dann haben wir über die Bildschirmauflösung nachgedacht. Alle haben andere, einige genauso wie mein Laptop ...

Alle haben verschiedene Grafikadapter ...

Alle haben .NET 4.5.1 ...

Der einzige Weg, das das Problem gelöst hat, war ein seltsames:

%Vor%

Ändern Sie in der Datei "Designer" die ClientSize manuell von (1016, 734) auf ungefähr (900, 800). Dadurch sah es auf den meisten Kunden-PCs gut aus. Aber nicht auf alle.

Die Frage

Was kann die wirkliche Lösung für dieses Problem sein? Woher kommt es?

    
d.wing 14.11.2014, 07:32
quelle

1 Antwort

2

Haben Sie die gleichen Probleme auf denselben Computern, wenn Sie AutoScaleMode.Dpi oder AutoScaleMode.None anstelle von AutoScaleMode.Font für jedes Steuerelement verwenden?

Wenn dies Ihr Problem behebt, kann das Problem mit der Verwendung von AutoScaleMode.Font

zusammenhängen

Auf einer hohen Ebene laut MSDN , der Effekt von AutoScaleMode.Font ist, dass das Steuerelement relativ zu den Dimensionen der Schriftart skaliert wird, die die Klassen verwenden, das ist normalerweise die Systemschrift . " (Betonung meiner.)

Ich habe in die System.Windows.Forms.ContainerControl Quellcode ein bisschen. Die Methode PerformAutoScale wird automatisch aufgerufen > während des Ereignisses OnLayout eines Steuerelements. Wenn AutoScaleMode auf Font gesetzt ist, wird GetFontAutoScaleDimensions indirekt von OnLayout aufgerufen. Die Kommentare in GetFontAutoScaleDimensions erklären, wie AutoScaleMode.Font ist implementiert:

%Vor%

Also nimmt die Methode eine "lange" Zeichenkette, sendet sie an GDI und fragt: "Was sind die Dimensionen dieser Zeichenkette?" Bemerkenswerterweise berücksichtigt diese Methode die Schriftart des Steuerelements, bei der es sich normalerweise um die Systemschriftart handelt.

Wussten Sie, dass das koreanische Alphabet (Hangul) nicht in Arial dargestellt wird? (Ich habe nicht, bis ich diese Antwort recherchiert habe!) Es macht vollkommen Sinn, dass Ihre Systemschrift (etwas wie Tahoe oder Arial) anders ist als die Ihrer Kunden in Südkorea. Es macht auch Sinn, dass zwei verschiedene Schriftarten dieselbe Zeichenkette mit unterschiedlicher Höhe und Breite anzeigen. Also, ich wette, dass die fraglichen Probleme auf Arbeitsstationen mit einer anderen Systemschriftart als Ihrer Systemschriftart auftreten.

Wenn Sie also ein paar Tests durchführen und feststellen, dass AutoScaleMode.Font wirklich der Täter ist, dann haben Sie ein paar Möglichkeiten:

  1. Verwenden Sie nicht AutoScaleMode.Font .

  2. Legen Sie explizit die Schriftart aller enthaltenen Steuerelemente fest ausdrücklich. Dadurch wird sichergestellt, dass die Schriftart von ContainerControl ist nicht die Systemschriftart des Computers.

Unabhängig davon, was Sie tun, stellen Sie sicher, dass alle Ihre Container dieselbe AutoScaleMode Einstellung verwenden. Mischen und Anpassen wird zu Kopfschmerzen führen.

Viel Glück!

    
Mike 16.11.2014, 09:54
quelle

Tags und Links