Das nächste Entwicklertreffen findet Anfang Mai in Münster statt - weitere Infos bzw. zur Anmeldung!

AppDesktopgröße unter Windows-10 [erledigt]

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
peternmb
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 489
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

AppDesktopgröße unter Windows-10 [erledigt]

Beitrag von peternmb » So, 23. Dez 2018 13:39

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: 11651
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: AppDesktopgröße unter Windows-10

Beitrag von AUGE_OHR » Mo, 24. Dez 2018 2:53

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
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 489
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: AppDesktopgröße unter Windows-10

Beitrag von peternmb » Mo, 24. Dez 2018 11:18

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: 13237
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: AppDesktopgröße unter Windows-10

Beitrag von Jan » Mo, 24. Dez 2018 11:26

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
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 489
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: AppDesktopgröße unter Windows-10

Beitrag von peternmb » Mo, 24. Dez 2018 12:08

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
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 489
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: AppDesktopgröße unter Windows-10

Beitrag von peternmb » Mo, 24. Dez 2018 12:13

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
Foren-Administrator
Foren-Administrator
Beiträge: 2286
Registriert: Fr, 08. Feb 2008 21:29

Re: AppDesktopgröße unter Windows-10

Beitrag von georg » Mo, 24. Dez 2018 17:41

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11651
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: AppDesktopgröße unter Windows-10

Beitrag von AUGE_OHR » Mo, 24. Dez 2018 21:27

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
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 489
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: AppDesktopgröße unter Windows-10

Beitrag von peternmb » Di, 25. Dez 2018 17:54

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
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 489
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: AppDesktopgröße unter Windows-10

Beitrag von peternmb » Di, 25. Dez 2018 17:57

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: 18378
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

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

Beitrag von Manfred » Mo, 04. Feb 2019 18:43

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 Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11651
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

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

Beitrag von AUGE_OHR » Mo, 04. Feb 2019 23:59

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: 18378
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

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

Beitrag von Manfred » Di, 05. Feb 2019 8:08

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 Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11651
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

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

Beitrag von AUGE_OHR » Di, 05. Feb 2019 15:02

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) 7-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
Foren-Administrator
Foren-Administrator
Beiträge: 2286
Registriert: Fr, 08. Feb 2008 21:29

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

Beitrag von georg » Sa, 09. Feb 2019 13:45

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Antworten