AppDesktopgröße unter Windows-10 [erledigt]

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

AppDesktopgröße unter Windows-10 [erledigt]

Beitrag von peternmb »

Hallo,

beim Auslesen meiner Desktopgröße fällt mir auf, dass eine unter Windows-10 festgelegte Skalierung dabei berücksichtigt wird.

Mein Monitor ist auf die vorgeschlagene Auflösung von 1680*1050 eingestellt.
Ich arbeite mit einer Skaliereung von 125%.
Mir wird beim Auslesen der AppDesktopgröße 1344*840 angezeigt.

Ich wollte, um die reale Desktopgröße zu erhalten, das dann mit dem DPI-Wert multiplizieren um die korrekte Desktopgröße zu erhalten.
Leider scheint meine Funktion dafür unter Windows-10 nicht mehr korrekt zu arbeiten, ich erhalte immer den Wert von 100%.

Was kann ich noch tun, um die reale Desktopgröße zuerhalten?
In der angezeigten MsgBox sind bei mir alle 3 Werte falsch.

Code: Alles auswählen

***********************************************************************************************************************************
*** Feststellen, welche Auflösung der Rechner hat
***********************************************************************************************************************************
FUNCTION AppDesktopDPI
//
LOCAL nHWnd := AppDesktop():GetHWnd()
LOCAL nHDC := DllCall("User32.DLL", DLL_STDCALL, "GetDC", nHWnd)
LOCAL nLogPix := 96
LOCAL LOGPIXELSY := 88
//
nLogPix := DllCall("GDI32.DLL", DLL_STDCALL, "GetDeviceCaps", nHDC, LOGPIXELSY)
DllCall("User32.DLL", DLL_STDCALL, "ReleaseDC", nHWnd, nHDC)
//
RETURN nLogPix

msgbox(str(AppDesktop():currentSize()[1],4,0)+" X "+ ;
       str(AppDesktop():currentSize()[2],4,0), ;
       "Skalierung "+str(AppDesktopDPI()/96*100,3,0)+"%")
Zuletzt geändert von peternmb am Di, 25. Dez 2018 17:55, insgesamt 1-mal geändert.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: AppDesktopgröße unter Windows-10

Beitrag von AUGE_OHR »

hi,

unter Windows 10 gibt

Code: Alles auswählen

LOCAL nXLogPixel := @Gdi32:GetDeviceCaps( hDC, LOGPIXELSX )
LOCAL nYLogPixel := @Gdi32:GetDeviceCaps( hDC, LOGPIXELSY )
immer 96

Code: Alles auswählen

#define DESKTOPVERTRES       0x0075   // (117) 
#define DESKTOPHORZRES       0x0076   // (118) 
LOCAL nDHORZRES  := @Gdi32:GetDeviceCaps( hDC, DESKTOPHORZRES )
LOCAL nDVERTRES  := @Gdi32:GetDeviceCaps( hDC, DESKTOPVERTRES )
damit bekommt man die "echte" Bildschirm Grösse / AppDeskTop() -> Scale-Faktor

frohe Weihnachten :santa:
gruss by OHR
Jimmy
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: AppDesktopgröße unter Windows-10

Beitrag von peternmb »

Hallo, vielen Dank für die Lösung. Auch dir schöne Weihnachten :santa:

Das erklärt/löst auch ein anderes Problem, mit dem ich mich über die Feiertage amüsieren wollte:
Unter Windows-10 wird bei mir die Caption von Elementen oft zu groß angezeigt.
-> na klar: ich teile die errechnete, passende CaptionSize immer noch durch die Skalierung um unabhängig von der Skalierung eine passende Schriftgröße zu erhalten. Da die Skalierung dann ja immer 1 ist, wird die Schrift nicht wirklich kleiner :banghead:

PS.: kann ich auch direkt die Skalierung auslesen lassen? Wenn ich die jetzt korrekt ausgelesene Auflösung durch die von Xbase angezeigte teile, dann funktioniert das zwar unter Windows-10 aber wie sieht es mit älteren OS z.B. XP aus?
Zuletzt geändert von peternmb am Mo, 24. Dez 2018 12:09, insgesamt 1-mal geändert.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: AppDesktopgröße unter Windows-10

Beitrag von Jan »

Peter,

um die Schriftgröße von Captions etc. mußt Du Dich nicht kümmern, wenn Du das dpiAware in Deine Manifest einbaust.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: AppDesktopgröße unter Windows-10

Beitrag von peternmb »

Jan hat geschrieben: Mo, 24. Dez 2018 11:26 ...
um die Schriftgröße von Captions etc. mußt Du Dich nicht kümmern, wenn Du das dpiAware in Deine Manifest einbaust.
Danke für den Hinweis.

Ich habe das bei mir so gelöst, dass der Anwender die Darstellung des Programmfensters in 10%-Schritten vergrößern/verkleinern kann.
Das funktioniert super, jeder kann sich das Programmfenster genauso groß machen, wie er es gerne hätte/braucht.
Dafür rechne ich auch die beste Größe der Caption aus.

Ich möchte daran auch nichts ändern, da es bis zu W10 absolut perfekt funktionierte.
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: AppDesktopgröße unter Windows-10

Beitrag von peternmb »

Code: Alles auswählen

#define DESKTOPVERTRES       0x0075   // (117) 
#define DESKTOPHORZRES       0x0076   // (118) 
PROCEDURE Main
LOCAL nEvent, ;
      nHWnd := AppDesktop():GetHWnd(), ;
      nHDC := DllCall("User32.DLL", DLL_STDCALL, "GetDC", nHWnd), ;
      nDHORZRES := @Gdi32:GetDeviceCaps( nHDC, DESKTOPHORZRES ), ;
      nDVERTRES := @Gdi32:GetDeviceCaps( nHDC, DESKTOPVERTRES )
ich erhalte beim compilieren die Fehlermeldung:
invalide use of @ (pass bei reference) operator
muss ich da noch etwas einbinden oder was mache ich denn da falsch :?
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: AppDesktopgröße unter Windows-10

Beitrag von georg »

Hallo,


ja, Du brauchst die OT4XB. Bitte auch die entsprechende Header-Datei ot4xb.ch einbinden, dann sollte es klappen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: AppDesktopgröße unter Windows-10

Beitrag von AUGE_OHR »

hi,
peternmb hat geschrieben: Mo, 24. Dez 2018 12:13 ich erhalte beim compilieren die Fehlermeldung:
invalide use of @ (pass bei reference) operator
muss ich da noch etwas einbinden oder was mache ich denn da falsch :?
sorry das ist ot4xb Syntax

hier die pure Xbase++ Version

Code: Alles auswählen

FUNCTION GetDeviceCaps( nhDC, nPIXELS )
RETURN ( DllCall( "Gdi32.dll", DLL_STDCALL, "GetDeviceCaps", nhDC, nPIXELS ) )
gruss by OHR
Jimmy
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: AppDesktopgröße unter Windows-10

Beitrag von peternmb »

Hallo, frohe Weihnachten :santa:

funktioniert prima mit ot4xb - allerdings unter Win7 muss ich meine alte Funktion verwenden.
Da gibt Xbase die korrekte Bildschirmgröße ohne Berücksichtigung der Skalierung an...
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: AppDesktopgröße unter Windows-10

Beitrag von peternmb »

peternmb hat geschrieben: Di, 25. Dez 2018 17:54 Hallo, frohe Weihnachten :santa:

funktioniert prima mit ot4xb
Allerdings muss ich unter Win7 um den Scalefaktor zu ermittlen meine alte Funktion verwenden.
Dort gibt Xbase die korrekte Bildschirmgröße ohne Berücksichtigung der Skalierung an...
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: AppDesktopgröße unter Windows-10 [erledigt]

Beitrag von Manfred »

ich klinke mich nochmal hier ein. Irgendwas mache ich total falsch. Ich bekomme auch nur verkehrte Werte zurück. Können wir das nochmal Schritt für Schritt durchgehen, was man machen muß um unter Windows 10 vernünftig die Desktopmaße und die DPI Einstellung zu ermitteln? Weiterhin habe ich festgestellt, das die stufenlose Verstellung der % Angaben überhaupt nicht erkannt wird.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: AppDesktopgröße unter Windows-10 [erledigt]

Beitrag von AUGE_OHR »

es gibt 3 Möglichkeiten

1.) DPIaware
2.) X,Y Faktor
3.) Font Grösse

bei 1.) bleibt die App in der realen Grösse unabhängig von der Auflösung oder Skale-Faktor

Nr. 2.) ist wohl das was du hast. dabei muss man die reale (native) Auflösung im Verhältnis zu AppDesktop():CurrentSize() nehmen

die Methode 3.) ist nun die Version die ich nehme. Ich habe dazu einen Referenz String woraus ich den X,Y Faktor berechne.
gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: AppDesktopgröße unter Windows-10 [erledigt]

Beitrag von Manfred »

erstmal eine Frage zu Anfang. Wenn ich einen PC habe, der mehrere Bildschirme hat, die unterschiedliche Auflösung und DPI Einstellungen haben, kann man dann für jeden Bildschirm die DAten exakt ermitteln, oder bringt das schon Chaos? Ich bekomme Werte geliefert, die sind total abstrus.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: AppDesktopgröße unter Windows-10 [erledigt]

Beitrag von AUGE_OHR »

moin,
Manfred hat geschrieben: Di, 05. Feb 2019 8:08 Ich bekomme Werte geliefert, die sind total abstrus.
Ich schätze mal das man für AppDeskTop():CurrentSize() die Breite der Summe aller Monitore bekommt und für die Höhe ... den höchsten Wert :?:

mit "pure" Xbase++ könnte es schwierig werden aber Pablo hat wohl eine Lösung die man erweitern könnte (erfordert ot4xb)
MonitorInfo.zip
Source
need ot4xb
(2.29 KiB) 248-mal heruntergeladen

Code: Alles auswählen

function GetMonitorInfoArray()
local hData     := _Var2Con( {} )
@user32:EnumDisplayMonitors(0,0,_callback_MonitorEnumProc(),hData)
return _ConRelease(hData)
das ganze arbeitet mit einem Callback (OBJ anbei) der so aussieht

Code: Alles auswählen

XPPCBK VERSION 001.000.012
BEGIN CALLBACK MonitorEnumProc AS BOOL
  PARAM HANDLE 
  PARAM HANDLE
  PARAM POINTER32
  PARAM LONG
END CALLBACK
mittels des Callback fragt er nun jeden einzeln Monitor ab.
die Pointer zeigen nun jeweils zur entsprechenden Monitor Structure

Code: Alles auswählen

BEGIN STRUCTURE MONITORINFOEX
   MEMBER DWORD    cbSize 
   MEMBER @ RECT   rcMonitor
   MEMBER @ RECT   rcWork 
   MEMBER DWORD    dwFlags 
   MEMBER SZSTR    szDevice SIZE 32
END STRUCTURE
ich bin mir allerdings nicht sicher ob es die realen native Werte sind oder durch irgendwas beeinflusst wird.
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: AppDesktopgröße unter Windows-10 [erledigt]

Beitrag von georg »

Hallo,


also, ich habe mir das mal angesehen und bekomme bei meinen zwei Monitoren (links: 2560*1440, rechts: 1920*1080, wobei der linke Monitor der Hauptmonitor ist) folgendes Ergebnis:

Bild

Windows betrachtet den rechten Monitor als #1, das ist eben so. Aber die Auflösungswerte finde ich nur "teilweise" wieder, d.h. r:2560 b:1400 - hier fehlen 40 Pixel bei der Höhe (das ist die Höhe der Taskleiste), genau wie beim zweiten Monitor r:4480 (2560+1920=4480) und b:1040 (anstelle der 1080, die ich erwartet hätte).

Auf jeden Fall sehr interessant.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten