Office: Bildschirmauflösung auslesen - irgend etwas klappt nicht

Helfe beim Thema Bildschirmauflösung auslesen - irgend etwas klappt nicht in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Moin, moin um verschiedene UserForms platziert starten zu können, lese ich mit folgendem Code die Bildschirmauflösung aus: diese soll rechts oben... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von fette Elfe, 16. November 2010.

  1. fette Elfe Erfahrener User

    Bildschirmauflösung auslesen - irgend etwas klappt nicht


    Moin, moin

    um verschiedene UserForms platziert starten zu können, lese ich mit folgendem Code die Bildschirmauflösung aus:

    diese soll rechts oben in die Ecke

    Code:
    Private Declare Function GetSystemMetrics Lib _
       "user32" (ByVal nIndex As Long) As Long
    Private Const SM_CXSCREEN As Long = 1       'Bildschirmbreite
    
    
    Private Sub UserForm_Activate()
    
            BildschirmBreite = GetSystemMetrics(SM_CXSCREEN)
            Me.Left = BildschirmBreite - Me.Width
            Me.Top = 0
    
    End Sub

    bzw. bei einer anderen:

    diese soll mittig an den unteren Rand:

    Code:
    Private Declare Function GetSystemMetrics Lib _
       "user32" (ByVal nIndex As Long) As Long
    Private Const SM_CYSCREEN As Long = 1       'Bildschirmhöhe
    
    Private Sub UserForm_Activate()
        
        BildschirmHöhe = GetSystemMetrics(SM_CYSCREEN)
        Me.Top = BildschirmHöhe - Me.Height
        
    End Sub

    Im ersten Code wird mir statt der Breite die Bildschirmhöhe ausgegeben.
    Und im zweiten Code wird zwar die Bildschirmbreite ausgegeben, aber trotzdem rutscht die UF ausserhalb des Bildschirmes nach unten.

    Nun gibt es ja haufenweise Lösungen dazu im Netz.
    Unteranderem wird
    Private Const SM_CXSCREEN As Long = 0
    anstatt wie bei mir auf 1 gesetzt.
    Habe ich alles ausprobiert, nichts funktioniert. Bei 0 ist die UF meilenweit ausserhalb des Bildschirmes.

    Klar kann ich feste Werte für Left und Top nehmen, aber bei unterschiedlichen Monitoren...

    Bin gespannt ob von Euch jemand ne Lösung kennt.
     
    fette Elfe, 16. November 2010
    #1
  2. Exl121150 Erfahrener User
    Hallo Achim,

    damit Du die Bildschirmbreite bekommst, musst Du die Konstante SM_CXSCREEN auf 0 setzen, denn mit 1 bekommst Du die Bildschirmhöhe.

    Allerdings liefert die Funktion GetSystemMetrics(..) die Bildschirmmaße in Pixeln, während bei den Fenstereigenschaften der UserForm (Me.Width bzw. Me.Height) die Werte in Punkt geliefert werden.

    Dabei gilt: 72 Punkt = 1 Zoll

    Der Wert für die Pixelumrechnung hängt von der Bildschirmauflösung ab, ein häufiger Wert ist jedoch: 96 Pixel = 1 Zoll
    Diesen Wert kannst Du zB. unter Windows XP ermitteln wie folgt:
    Klick mit rechter Maustaste auf den Desktop > Eigenschaften > Tab. Einstellungen > Button "Erweitert" > Tab. Allgemein: DPI-Einstellung (Normalgröße zB. 96 DPI = 96 Dots per Inch)

    Berechnung:
    Da Du für Me.Left und Me.Top die Angabe in Punkt brauchst, musst Du die Pixel-Werte in Bildschirmbreite und Bildschirmhöhe in Punkt umrechnen, was unter Voraussetzung der 96 DPI wie folgt gelingt:
    Me.Left = BildschirmBreite * 72/96 - Me.Width
    Me.Top = BildschirmHöhe * 72/96 - Me.Height

    Dadurch wird die UserForm in der rechten unteren Ecke angezeigt.

    Code:
    Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
    
    Private Const SM_CXSCREEN As Long = 0 'Bildschirmbreite in Pixels
    Private Const SM_CYSCREEN As Long = 1 'Bildschirmhöhe in Pixels
    Dim Bildschirmbreite As Long, Bildschirmhöhe As Long
    
    Private Sub userform_activate()
      Bildschirmbreite = GetSystemMetrics(SM_CXSCREEN)
      Bildschirmhöhe = GetSystemMetrics(SM_CYSCREEN)
      Me.Left = Bildschirmbreite * 72 / 96 - Me.Width
      Me.Top = Bildschirmhöhe * 72 / 96 - Me.Height
    End Sub
     
    Exl121150, 16. November 2010
    #2
  3. Exl121150 Erfahrener User
    Hallo Achim,

    um auch die aktuelle Bildschirmauflösung per Programm zu ermitteln (DPI):

    Code:
    Option Explicit
    
    Private Declare Function GetSystemMetrics& Lib "user32" (ByVal nIndex&)
    Private Declare Function GetDeviceCaps& Lib "gdi32" (ByVal hDC&, ByVal nIndex&)
    Private Declare Function CreateICA& Lib "gdi32" (ByVal lpDriverName$, ByVal lpDeviceName$, ByVal lpOutput$, ByVal lpInitData&)
    Private Declare Function DeleteDC& Lib "gdi32" (ByVal hDC&)
    
    Private Const SM_CXSCREEN As Long = 0 'Bildschirmbreite in Pixels
    Private Const SM_CYSCREEN As Long = 1 'Bildschirmhöhe in Pixels
    Private Const LOGPIXELSX  As Long = 88
    Private Const LOGPIXELSY  As Long = 90
    
    Dim Bildschirmbreite As Long, Bildschirmhöhe As Long
    Dim DPI_Breite As Long, DPI_Höhe As Long
    
    Private Sub UserForm_Activate()
      Dim hDC As Long
      
      'Die log. Pixels pro Zoll für den Bildschirm werden ermittelt:
      hDC = CreateICA("DISPLAY", "", "", 0&)
      DPI_Breite = GetDeviceCaps(hDC, LOGPIXELSX)
      DPI_Höhe = GetDeviceCaps(hDC, LOGPIXELSY)
      DeleteDC hDC
      
      'Die Breite/Höhe des Bildschirm-Fensters (in Pixeln) wird ermittelt:
      Bildschirmbreite = GetSystemMetrics(SM_CXSCREEN)
      Bildschirmhöhe = GetSystemMetrics(SM_CYSCREEN)
      
      'Die linke obere Ecke der UserForm (in Punkten) wird ermittelt,
      'wobei 72 Punkte = 1 Zoll beträgt:
      Me.Left = Bildschirmbreite * 72 / DPI_Breite - Me.Width
      Me.Top = Bildschirmhöhe * 72 / DPI_Höhe - Me.Height
      
      'Die UserForm erscheint daraufhin in der rechten unteren Ecke
      'des Bildschirms.
    End Sub
     
    Exl121150, 16. November 2010
    #3
  4. fette Elfe Erfahrener User

    Bildschirmauflösung auslesen - irgend etwas klappt nicht

    Hallo Exl121150,

    absolut perfekt!

    Super erklärt, kurzer und knapper Code, auch für mich verständlicher Code.. und es funktioniert sowohl auf den großen Monitoren in der Firma, als auch auf meiner kleinen alten Gurke zuhause.

    Alternativ hatte ich im Netz nur ellenlange Api-Lösungen gefunden, und die hab ich nicht mal im Ansatz begriffen.
    So gefällts mir viel besser.

    Dafür kannste Dich gern mal von mir auf ein Bierchen einladen lassen (falls Du mal in der Nähe von Wuppertal bist).



    Eine Frage hab ich noch:

    Du schreibst von Punkten und Dpi.

    Aus der Fotografie und Bildbearbeitung weiß ich:
    Bildschirme haben Pixel und Ppi (Pixel per inch)
    Punkte und Dpi (Dots per inch) benutzen Drucker.

    Meinst Du mit Dpi eigentlich Ppi, oder sind UserForms wirklich in Dpi, also einem Druckformat hinterlegt?



    Eine Anmerkung noch:

    ich habe festgestellt (vorher nicht darüber nachgedacht):
    Code:
    Me.Top = Bildschirmhöhe * 72 / DPI_Höhe - Me.Height 
    ist nicht unbedingt schlau.
    Eigentlich müsste in dem Fall die Fensterhöhe von Excel ausgelesen werden, denn so liegt der untere Rand der UserForm hinter der Taskleiste und wird verdeckt.
    Macht mir jetzt aber nix aus, habe nach oben genug Platz und nehme einfach:
    Code:
    Me.Top = Bildschirmhöhe * 72 / DPI_Höhe / 2 
     
    fette Elfe, 16. November 2010
    #4
  5. Exl121150 Erfahrener User
    Hallo Achim,

    Wenn Du unter Windows-XP an der Stelle nachschaust, auf die ich Dich verwiesen habe:
    so findest Du dort folgenden Text:
    Code:
    Der DPI-Wert kann als Kompensierung vergrößert werden, wenn Elemente bei der aktuellen Bildschirmauflösung zu klein angezeigt werden.
    Es handelt sich also um einen logischen, nicht um einen physikalischen (=Pixel) Wert der Bildschirmauflösung. Deshalb haben auch die beiden Windows-Konstanten, die für die Abfrage dieser Werte verwendet werden, die Namen LOGPIXELSX bzw. LOGPIXELSY von Microsoft erhalten.

    Darüberhinaus muss es zwischen Drucker und Bildschirm eine gewisse "Seelenverwandtschaft" geben, denn wenn Du Dir in einem Office-Programm eine Seitenvoransicht der Druckerausgabe am Bildschirm anzeigen lässt, rufst Du dazu zwar den Druckertreiber auf, aber verwendest - notgedrungenermaßen - dabei die (logische) Bildschirmauflösung und nicht die Druckerauflösung.
     
    Exl121150, 17. November 2010
    #5
  6. fette Elfe Erfahrener User
    Hallo Exl121150,

    sry das ich mich erst jetzt zurück melde, private Dinge...

    Danke für die Erklärung, sowas in der Richtung ist auch eigentlich logisch, wenn ich mal weiter gedacht hätte.

    Alleine schon dass man zoomen kann, ohne dass die Darstellung irgendwann pixelig wird, so wie bei einem jpeg, hätte mir zumindest die Vermutung nahelegen müssen, dass die Darstellungsform nicht über Pixel funktioniert.
    Wohl eher ähnlich wie eine Vektorgrafik, oder auch ganz anders, egal, aber halt keine Pixel.

    Ergo, sind Probleme bei einer 1:1 Umrechnung von Bildschirmbreite (in Pixel) minus Breite einer Grafik (Userform) schon fast vorprogrammiert.

    So zumindest mein Verständnis.
     
    fette Elfe, 18. November 2010
    #6
  7. schatzi Super-Moderator
    Hallo!

    Ein kleiner Exkurs:

    Alles, was sich am Bildschirm abspielt, sind ppi (Pixel per inch)!
    Auch wenn Windows/Microsoft hier fälschlicherweise dpi schreibt...
    ALLES auf deinem Bildschirm wird in Pixel dargestellt!
    Auch eine Vektorgrafik wird von deinem Bildschirm in Pixel angezeigt! Bei einer neuen Zoomstufe wird die Grafik neu berechnet und auf deine Bildschirmauflösung (ppi) angepasst.

    Excel hat mit Druckvorstufe leider überhaupt nix am Hut...
     
  8. fette Elfe Erfahrener User

    Bildschirmauflösung auslesen - irgend etwas klappt nicht

    Hallo schatzi,

    Vollkommen klar.
    Geht ja auch garnicht anders, weil ein Bildschirm (zur Zeit) nunmal aus einzelnen Bildpunkten (Pixeln) besteht.

    Aber, das bedeutet ja nicht das eine Grafik auch aus Pixeln bestehen muss.
    Genauso gut kann Ihre Einheit in Kartoffeln oder Lila Kühen angegeben werden.
    Es muss dann vor der Anzeige auf dem Bildschirm halt nur eine Umrechnung erfolgen.

    Bsp:
    Ein jpeg besteht aus schon von sich aus aus Pixeln.
    Im angenommenen Idealfall hat es höchstens soviele Pixel wie der Bildschirm und kann bei 100% Zoomstufe 1:1 angezeigt werden.
    Da sollte dann eigentlich keinerlei Umrechnung nötig sein.

    Erhöhe ich die Zoomstufe zum Beispiel auf 400%, muss immernoch noch keine Umrechnung stattfinden. Zumindest nicht im klassischen Sinn des Wortes. Es werden einfach nur jeweils 4 Pixel auf dem Bildschirm "gebündelt", die dann jeweils das gleiche anzeigen. D.h. 4 Pixel auf dem Schirm zeigen 1 Pixel aus dem jpeg.
    Dadurch nehmen wir das jpeg als "pixelig" war.


    Anders aber eine Vektorgrafik.
    In welcher Einheit die im System abgelegt ist weiß ich nicht.
    Aber wie Du selbst schon sagtest, sie wird beim Zoomen neu berechnet.
    D.h. sie kann systemintern nicht als Pixeldatei gespeichert sein, denn sie wird ja auch bei 400% Zoom noch glatt und eben nicht pixelig dargestellt.
    Natürlich wird sie dann in Pixel umgerechnet, bevor sie auf dem Schirm angezeigt werden kann.

    Ähnlich stelle ich es mir bei Excel vor.
    Aus dieser Überlegung heraus würde
    für mich auch wieder einen Sinn ergeben, ja sogar logisch notwendig sein.
    Auch wenn "Dpi" in dem Zusammenhang wohl nur zur totalen Verwirrung der meisten führen dürfte.
    Vielleicht sollte man besser von "Sip" (System-interne-Punkte) reden. ;O)


    So jedenfalls meine Überlegung, was genau davon so alles stimmt, weiß ich nicht (falls überhaupt etwas).
    Das Thema ist auch nicht ganz einfach in Worte zu fassen, finde ich.
    Hoffentlich ist halbwegs verständlich was ich meine.

    Den Unterschied zwischen Ppi und Dpi (Drucker, Druckerei) kenne ich jedenfalls schon seit Jahren. ;O)
     
    fette Elfe, 19. November 2010
    #8
Thema:

Bildschirmauflösung auslesen - irgend etwas klappt nicht

Die Seite wird geladen...
  1. Bildschirmauflösung auslesen - irgend etwas klappt nicht - Similar Threads - Bildschirmauflösung auslesen klappt

  2. Benutzerdefinierte Textgröße (DPI) der Bildschirmauflösung auslesen

    in Microsoft Excel Hilfe
    Benutzerdefinierte Textgröße (DPI) der Bildschirmauflösung auslesen: Hallo zusammen und ein Gutes Neues Jahr Euch allen! Wie man die Bildschirmauflösung per VBA ausliest, ist ja hinlänglich bekannt. Leider finde ich keine Einträge dazu, wie man nun auch die...
  3. Bildschirmauflösung auslesen

    in Microsoft Excel Hilfe
    Bildschirmauflösung auslesen: Hallo, ich will per VBA die eingestellte Bildschirmauflösung auslesen und abhängig davon die Zoom-Eigenschaft für eine UserForm festlegen. Gibt es dafür einen Befehl?Und wenn ja wie kann ich...
  4. Bildschirmauflösung anpassen

    in Microsoft Excel Hilfe
    Bildschirmauflösung anpassen: Hallo zusammen, Ich habe einen User der eine bildschirmauflösung von 1024 x 768 eingestellt hat. Nun ist das problem das meine excel applikation in dieser auflösung die form nicht mehr...
  5. Formular an Bildschirmauflösung anpassen

    in Microsoft Access Hilfe
    Formular an Bildschirmauflösung anpassen: Hallo, vor Jahren bestelle ich einen Daten mit allerhand Zeug zum Ausprobieren, unter anderem wird das Formular der Bildschirmauflösung angepasst und der vba-Code mit einem Kennwirt versehen)....
  6. Bildschirmauflösung/Formulardarstellung

    in Microsoft Access Hilfe
    Bildschirmauflösung/Formulardarstellung: Hallo an die Spezialisten! Ich stehe (wieder einmal) vor einem Riesenproblem: Meine Anwendung wurde mit einer Bildschirmauflösung 1920 x 1080 entwickelt und getestet. Sie wurde auch auf schon auf...
  7. Formulare automatisch an Bildschirmauflösung anpassen

    in Microsoft Access Hilfe
    Formulare automatisch an Bildschirmauflösung anpassen: Aus Access-Secrets vom 12.09.2008: ACCESS-DOWNLOAD: Formulare automatisch an Bildschirmauflösung anpassen Versionen: Access 2007, 2003, 2002/XP und 2000 Sicherlich kennen Sie die Situation: Sie...
  8. Banner paßt sich nicht der Bildschirmauflösung an

    in Microsoft FrontPage Hilfe
    Banner paßt sich nicht der Bildschirmauflösung an: Hallo, ich bastle mir gerade eine HP mit Frontpage. Leider paßt sich die Größe des Banners nicht automatisch der Bildschirmauflösung an. Woran kann das liegen? Was muß ich ändern? Bin für jeden...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden