Frage

Ich versuche, um zu bestimmen, wie ich erkennen kann, wenn der Benutzer die Windows-Schriftgröße von Normal auf Extras Large Fonts ändert, die Schriftgröße durch Ausführen der folgenden Schritte auf einem Windows XP-Computer ausgewählt ist:

  1. Rechtsklick auf den Desktop und wählen Sie Eigenschaften.
  2. Klicken Sie auf die Registerkarte Darstellung.
  3. Wählen Sie die Schriftgröße: Normal / Large Fonts / Extra Large Fonts

Mein Verständnis ist, dass die Schriftgröße ändern führt zu einer DPI ändern, hier so ist, was ich bisher ausprobiert habe.


Mein Ziel:

ich erkennen soll, wenn die Windows-Schriftgröße hat von Normal geändert Groß oder Extra Large Fonts und nehme einige Aktionen auf der Grundlage dieser Schriftgröße ändern. Ich gehe davon aus, dass, wenn die Windows-Schriftgröße ändert, auch die DPI (vor allem ändern, wenn die Größe Extra Large Fonts ist


Was ich bisher versucht:

erhalte ich mehrere Nachrichten einschließlich: WM_SETTINGCHANGE, WM_NCCALCSIZE, WM_NCPAINT, etc ... aber keine dieser Meldungen sind auf die Situation eindeutig, wenn die Schriftgröße ändert, mit anderen Worten, wenn ich die WM_SETTINGSCHANGE Nachricht empfangen Ich möchte wissen, was geändert.

In der Theorie, wenn ich definiere die OnSettingChange und Windows es nennt, die lpszSection sollte mir sagen, was der Änderungsabschnitt ist, und das funktioniert gut, aber dann prüfe ich den gegebenen Abschnitt von Systemparameter Aufruf und ich gehe in dem Aktions SPI_GETNONCLIENTMETRICS und ich trete durch den Debugger und ich sicherstellen, dass ich die Daten in dem zurück NONCLIENTMETRICS für alle Schriftartänderungen beobachten, aber keine auftreten.

Auch wenn das nicht funktioniert, soll ich noch in der Lage sein, die DPI, wenn die Einstellungen ändern zu überprüfen. Ich würde wirklich nicht über die anderen Details kümmern, jedes Mal wenn ich die WM_SETTINGCHANGE Nachricht bekommen, würde ich nur die DPI überprüfen und führen Sie die Aktionen ich bei der Durchführung interessiert bin, aber ich bin nicht in der Lage, das System DPI entweder zu bekommen.

Ich habe versucht, das DPI zu erhalten, indem die Methode GetSystemMetrics Aufruf, auch für jeden DC:

Dekstop Gleichstrom-> GetDeviceCaps LOGPIXELSX / LOGPIXELSY Fenster Gleichstrom-> GetDeviceCaps LOGPIXELSX / LOGPIXELSY Aktuelle Gleichstrom-> GetDeviceCaps LOGPIXELSX / LOGPIXELSY

Auch wenn ich die DPI in der Grafik-Eigenschaften-Fenster ändern sich diese Werte zurückgeben nichts anders, sie zeigen immer 96.

Kann jemand mir helfen, dies herauszufinden, bitte? Was soll ich suchen? Wo soll ich suchen?

afx_msg void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
{
    int windowDPI = 0;
    int deviceDPI = 0;
    int systemDPI = 0;
    int desktopDPI = 0;
    int dpi_00_X = 0;
    int dpi_01_X = 0;
    int dpi_02_X = 0;
    int dpi_03_X = 0;

    CDC* windowDC = CWnd::GetWindowDC(); // try with window DC
    HDC desktop = ::GetDC(NULL); // try with desktop DC
    CDC* device = CWnd::GetDC(); // try with current DC
    HDC hDC = *device; // try with HDC
    if( windowDC )
    {
        windowDPI = windowDC->GetDeviceCaps(LOGPIXELSY); 
        // always 96 regardless if I change the Font 
        // Size to Extra Large Fonts or keep it at Normal

        dpi_00_X = windowDC->GetDeviceCaps(LOGPIXELSX); // 96
    }

    if( desktop )
    {
        desktopDPI = ::GetDeviceCaps(desktop, LOGPIXELSY); // 96
        dpi_01_X = ::GetDeviceCaps(desktop, LOGPIXELSX); // 96
    }

    if( device )
    {
        deviceDPI = device->GetDeviceCaps(LOGPIXELSY); // 96
        dpi_02_X = device->GetDeviceCaps(LOGPIXELSX); // 96
    }

    systemDPI = ::GetDeviceCaps(hDC, LOGPIXELSY); // 96
    dpi_03_X = ::GetDeviceCaps(hDC, LOGPIXELSX); // 96

    CWnd::ReleaseDC(device);
    CWnd::ReleaseDC(windowDC);
    ::ReleaseDC(NULL, desktop);
    ::ReleaseDC(NULL, hDC);

    CWnd::OnWinSettingChange(uFlags, lpszSection);
}

Der DPI gibt immer 96, aber die Einstellungen Änderungen werden wirksam, wenn ich die Schriftgröße zu Extra Large Fonts ändern oder wenn ich die DPI auf 120 ändern (von den Grafik-Eigenschaften).

War es hilfreich?

Lösung

[EDIT nach dem erneuten Lesen] ich fast sicher bin, dass eine Änderung zu „Große Schriftarten“ keine DPI Änderung verursachen, sondern es ist ein Thema Einstellung. Sie sollten durch die Anwendung der „Große Schriftarten“ ändern, um überprüfen können, und dann die erweiterten Anzeigeeigenschaften zu öffnen, wo die DPI-Einstellung lebt, sollte es mit 96 dpi geblieben sind.


DPI Änderung soll ein Neustart erforderlich ist. Vielleicht hat sich die Einstellung zu einem Ort nicht weitergegeben, wo GetDeviceCaps abgerufen werden kann?

versuchen, vielleicht eine nicht-Neustart erfordernden Einstellung ändern (Auflösung vielleicht) und dann sehen, wenn Sie die Änderung erkennen können. Wenn Sie können, Ihre Antwort ist wahrscheinlich, dass Sie nicht DPI Änderung erst nach Neustart erfassen können.

Andere Tipps

Wenn Sie anrufen GetDeviceCaps () auf dem Desktop-DC, werden Sie vielleicht eine DC verwenden, das von MFC im Cache gespeichert werden können, und enthält daher out-of-date Informationen? Machst du die GetDeviceCaps () aufrufe, synchron aus Ihrem OnSettingsChange Handler? Ich konnte sehen, wie einer oder beide dieser Dinge könnten Sie eine veraltete Version von DPI erhalten.

Raymond Chen schrieb über dieses und seine Lösung sah wie folgt aus (Beachten Sie, dass ich hinzugefügt habe :: Betreiber auffordern, den MFC-Wrapper des APIs zu vermeiden):

int GetScreenDPI()
{
  HDC hdcScreen = ::GetDC(NULL);
  int iDPI = -1; // assume failure
  if (hdcScreen) {
    iDPI = ::GetDeviceCaps(hdcScreen, LOGPIXELSX);
    ::ReleaseDC(NULL, hdcScreen);
  }
  return iDPI;
}

Ich habe das Gefühl, WM_THEMECHANGED um Sie kümmern wird. Es hat kein Hinting über das, was geändert, though. Sie werden OpenThemeData verwenden und Anfangseinstellungen zwischenspeichern, dann jedes Mal die Meldung vergleichen.

Sie wahrscheinlich nicht brauchen, zu kümmern, was allerdings geändert haben, können nicht Sie haben eine Universal Layout-Routine, die Ihre Form paßt / dialog / was auch immer durch alles berücksichtigt und nimmt von vorne anfangen?

Welches Problem versuchen Sie zu lösen?

Siehe http://msdn.microsoft.com /en-us/library/ms701681(VS.85).aspx wird diese dort erklärt (Zitat: „Wenn Sie nicht dpi Skalierung abbrechen, kehrt dieser Aufruf den Standardwert von 96 dpi.“)

Das glaube ich nicht die Anzeige DPI ändert sich, wenn die Schriftgröße ändert. Windows wahrscheinlich nur das Senden der WM_PAINT und WM_NCPAINT Nachrichten an alle geöffneten Fenster, und sie sind neu gezeichnet selbst den Strom (jetzt groß) Systemschriftart verwendet wird.

Sehen sie sich diese Werte in der Registry:

Windows XP Theme HKCU \ Software \ Microsoft \ Windows \ Currentversion \ Thememanager \ SizeName Mögliche Werte: normal, LargeFonts und ExtraLargeFonts Diese Werte sind sprachunabhängig .

klassische Windows-Theme HKCU \ Control Panel \ Aussehen \ Current Mögliche Werte: klassisches Windows, Windows-Classic (groß), Windows Classic (extra large), Windows Standard Windows-Standard (groß), Windows Standard (extra large) Beachten Sie, dass diese Werte sprachabhängig .

Windows Vista nicht über diese Funktion unterstützen. Wenn wir eine größere Schrift, füllen Sie einfach die Einstellung DPI ändern. In diesem Fall soll GetDeviceCaps arbeiten.

Hope, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top