Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Bildschirmeinstellung

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
HD



Anmeldungsdatum: 14.11.2015
Beiträge: 35
Wohnort: Polen

BeitragVerfasst am: 13.06.2018, 10:43    Titel: Bildschirmeinstellung Antworten mit Zitat

Hallo!
Beim start des untenstehenden programms habe ich je nach verwendetem computer folgendes problem:
neuer Laptop mit grossem bildschirm: einen leeren bildschirm, schrift nur durch alt+enter sichtbar;
Laptop mit altem LCD-monitor (geringe aufloesung und quadratfoermiges bild): keine probleme.
Wie kann ich das programm einstellen, dass es auf jedem computer laeuft?

Hier das Programm:
Code:
#include "dir.bi"
#include once "fbgfx.bi"
#include once "utf_conv.bi"
#include once "font.bi"
dim shared font as FT_Face
DIM shared AS INTEGER Breite,f,fab,fabe,fal,far,fas,faw,Fe,hoehe
dim shared as integer sf,sfr,sfw,sfx,sfy,st,x,y
sf=&hFFFFFF'schriftfarbe weiss
screeninfo Breite,hoehe
SCREENRES breite,hoehe,32
'Font initialisieren
FT_Var.ErrorMsg = FT_Init_FreeType(@FT_Var.Library)
if FT_Var.ErrorMsg then print "Could not load library"
font = getFont("font.ttf")
f=28'fontgroesse
x=30:y=30
printFT x,y,"+ - * oder :?",font,f,sf:y=Y+60
sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 17.06.2018, 16:16    Titel: Antworten mit Zitat

Du erstellst einen Grafikbereich in Desktop-Größe. Das könnte zu Problemen führen, wenn du eine Bildschirm-Skalierung > 100% verwendest und dein Programm nicht als "dpiAware" gekennzeichnet hast. In diesem Fall ist nämlich der Grafikbereich zu groß für den Bildschirm und du siehst folglich Teile davon nicht.

Hier ein Beispielprogramm "program.bas", das einen Grafikbereich in Desktop-Größe (ohne Titelleiste) initialisiert und in die 4 Ecken jeweils ein Rechteck zeichnet:
Code:
#include once "fbgfx.bi"

dim shared as integer screenWidth, screenHeigth

screeninfo screenWidth, screenHeigth
screenres screenWidth, screenHeigth, 32,, fb.GFX_NO_FRAME


const as integer BOX_SIZE = 100

line (0,0)-(BOX_SIZE, BOX_SIZE), &hffffff, BF
line (screenWidth,screenHeigth)-step(-BOX_SIZE, -BOX_SIZE), &hffffff, BF
line (0,screenHeigth)-step(BOX_SIZE, -BOX_SIZE), &hff0000, BF
line (screenWidth,0)-step(-BOX_SIZE, BOX_SIZE), &hff0000, BF

sleep


Damit das Programm auch auf Hi-DPI Monitoren korrekt funktioniert, musst du Windows mitteilen, dass dein Programm "dpiAware" ist und entsprechend selbst die Skalierung vornimmt, ansonsten versucht Windows eher schlecht als recht dein Programm zu skalieren.

Dazu erstellst du ein Anwedungs-Manifest "application.manifest", wie dieses:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <!-- dpiAware: windows vista, 7, 8.0 -->
      <!-- per monitor dpiAware: windows 8.1, 10 before 1706  -->
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
   
      <!-- dpiAwareness: windows 10 1607+ -->
      <!-- PerMonitorV2: windows 10 1703+ -->
        <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
       
      <!-- GDIscaling: windows 10 1703+ -->
      <!--<gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">true</gdiScaling>-->
    </windowsSettings>
</application>
</assembly>
Ich hab bei den jeweiligen Einstellungen dazugeschrieben welche Windows Versionen unterstützt werden, für Details siehe https://msdn.microsoft.com/library/windows/desktop/mt843498.aspx und https://msdn.microsoft.com/en-us/library/windows/desktop/aa374191.aspx

Das Manifest bindest du als Resource in dein Programm ein, indem du eine Resourcen-Datei "program.rc" mit folgendem Inhalt anlegst (und beim compilieren zusätzlich angibst):
Code:
#define RT_MANIFEST                        MAKEINTRESOURCE(24)
#define CREATEPROCESS_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(1)

CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "application.manifest"

_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
HD



Anmeldungsdatum: 14.11.2015
Beiträge: 35
Wohnort: Polen

BeitragVerfasst am: 17.06.2018, 19:06    Titel: Antworten mit Zitat

Puh! Da habe ich ja etwas zu tun. Vielen Dank fuer die ausfuehrliche Antwort.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 17.06.2018, 20:57    Titel: Antworten mit Zitat

Um Dir das ausprobieren zu erleichtern habe ich obiges Beispiel (inkl. bereits compilierter EXE) hochgeladen: http://users.freebasic-portal.de/stw/files/prog/fb/misc/dpiaware-demo.zip

Ich hoffe dass Du damit das Problem lösen kannst, allerdings kann die Fehlerursache auch eine ganz andere sein, obiges ist nur eine Vermutung. Probiere am Besten zuerst ob mein Beispielprogramm auf Deinen beiden Laptops funktioniert und versuche dann mein Beispielprogramm durch Deinen Code zu ersetzen. Falls mein Beispielprogramm auch nicht funktioniert liegt die Fehlerursache vermutlich nicht in der automatischen Skalierung, sondern woanders.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
HD



Anmeldungsdatum: 14.11.2015
Beiträge: 35
Wohnort: Polen

BeitragVerfasst am: 18.06.2018, 09:12    Titel: Antworten mit Zitat

Da hast du dir ja viel muehe gemacht. Auf dem alten laptop sehe ich bei deinem programm die vier ecken. Auf dem neuen laptop sehe ich nur die linke obere weisse ecke. Die ganze sache finde ich furchtbar kompliziert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 18.06.2018, 22:15    Titel: Antworten mit Zitat

HD hat Folgendes geschrieben:
Auf dem alten laptop sehe ich bei deinem programm die vier ecken. Auf dem neuen laptop sehe ich nur die linke obere weisse ecke.
Schade, dann ist wohl die Skalierung nicht das Problem und eine schwierige Fehlersuche könnte bevorstehen. Aber fangen wir einmal mit den Grundlagen an: ein paar Systeminfos deiner beiden Laptops (insbesondere von dem, auf dem es nicht funktioniert)

Ich habe dazu ein kleines Programm "monitorInfo" geschrieben, das ein paar wichtige Infos zusammensucht:
http://users.freebasic-portal.de/stw/files/prog/fb/misc/monitorInfo.zip
Könntest du bitte dessen Text-Ausgabe auf deinem Problem-Laptop hier hereinstellen?

Wie du vielleicht weißt bietet FreeBasic mehrere verschiedene "Treiber" an, mit denen die Grafikausgabe erzeugt wird - unter Windows sind das "DirectX" (standard), "GDI" und "OpenGL". Eventuell tritt das Problem nur bei einem davon auf bzw. funktioniert ein bestimmter Treiber. Um das zu testen ist in obigem ZIP ein zweites Programm "driverTest" enthalten, das der Reihe nach die genannten Treiber probiert und jeweils das Testbild aus dem ersten Beispiel zeichnet. Je nach Systemkonfiguration ist es möglich das manche Treiber überhaupt nicht funktionieren - in diesem Fall verwendet FreeBasic jedoch automatisch einen anderen. Bitte führe das Programm auf deinem Problem-Laptop aus und berichte über dessen Verhalten.

Der Quellcode ist jeweils enthalten, wenn du die Testprogramme selber compilieren möchtest nicht vergessen die Resourcen-Datei "screen.rc" auch jeweils zu verwenden, ansonsten könnten die Programme nicht richtig funktionieren (weil Windows automatisch Kompatibilitätseinstellungen anwendet).
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
HD



Anmeldungsdatum: 14.11.2015
Beiträge: 35
Wohnort: Polen

BeitragVerfasst am: 19.06.2018, 07:34    Titel: Antworten mit Zitat

Die Treiber arbeiten alle richtig auf meinem neuen Laptop (Kiano):

windows version 10.0
build 16299
service pack 0.0
global dpi: 144, 144
Monitor # 1 (primary)
\\.\DISPLAY1
size: 1920 x 1080
area: (0,0) - ( 1920, 1080)
DPI eff: 144, 144
DPI raw: 199, 142[/url]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 19.06.2018, 18:47    Titel: Antworten mit Zitat

HD hat Folgendes geschrieben:
Die Treiber arbeiten alle richtig auf meinem neuen Laptop (Kiano)
Das verstehe ich nicht, denn weiter oben hattest du ja gesagt, dass beim Beispielprogramm "dpiaware-demo" nur ein Rechteck sichtbar war. Sind beim "driverTest" Beispielprogramm wirklich alle 4 Rechtecke sichtbar?
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
HD



Anmeldungsdatum: 14.11.2015
Beiträge: 35
Wohnort: Polen

BeitragVerfasst am: 20.06.2018, 07:10    Titel: Antworten mit Zitat

Habe vorhin nochmal alles durchgetestet. Diesmal sind im Beispielprogramm auch alle 4 Ecken sichtbar. Ich habe aber keine Ahnung, wieso auf einmal. Bei meinem eigenen Programm habe ich aber noch immer einen leeren Bildschirm. Nun habe ich aus dem Beispielprogramm die compile.bat gestartet, konnte damit aber keine neue program.exe erstellen, obwohl ich die fbc, … in Deinen Beispielordner kopiert habe. Kenne mich mit manifest und .rc nicht aus. Hier aber eine Aufstellung der Dateien in dem Ordner. Gruß HD

Verzeichnis von dpiaware-demo

18.06.2018 07:58 <DIR> .
18.06.2018 07:58 <DIR> ..
17.06.2018 21:37 1.189 application.manifest
17.06.2018 21:47 33 compile.bat
17.06.2018 21:36 470 program.bas
17.06.2018 21:37 198 program.rc
07.04.2005 18:38 15.960 mingwm10.dll
18.06.2018 08:57 <DIR> IDE
21.05.2011 17:51 4.024.832 fbide.exe
13.06.2011 21:32 43.008 FbIdeFix.dll
17.06.2018 21:47 113.152 rem-program.exe
31.01.2016 12:09 1.159.168 fbc.exe
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 20.06.2018, 16:02    Titel: Antworten mit Zitat

Anstatt die fbc.exe irgendwo hin zu kopieren (das funktioniert nicht, weil auch anderen Dateien aus dem Freebasic-Ordner benötigt werden) verwendest du besser eine passende Pfadangabe oder setzt die PATH Umgebungsvariable.

Beispiel:
Wenn sich der FreeBasic in D:\Apps\FreeBasic\fbc.exe befindet dann schreibst du entweder anstatt "fbc" den vollständigen Pfad "D:\Apps\FreeBasic\fbc.exe" oder schreibst davor die Zeile
Code:
set PATH="D:\Apps\FreeBasic";%PATH%
(danach kannst du ganz normal "fbc" verwenden)


Zur Verwendung der Resourcen-Datei: Diese muss wie eine zusätzliche Quellcodedatei angegeben werden beim Compilieren. Ich sehe du verwendest FbIde - das unterstützt leider diesen Anwedungsfall nicht direkt, aber als Workaround kannst du in den Einstellungen bei "Compiler command" die resourcen-Datei (mit einem Leerzeichen getrennt) hinten anfügen. Wenn du andere Programme compilierst wirst du vermutlich die Einstellung wieder auf den Ursprungswert zurückstellen wollen.
Empfehlenswert wäre auf eine bessere IDE wie etwa poseidonFB oder FBedit umzusteigen.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
HD



Anmeldungsdatum: 14.11.2015
Beiträge: 35
Wohnort: Polen

BeitragVerfasst am: 21.06.2018, 09:42    Titel: Antworten mit Zitat

Habe meine lebensfreude wiedergefunden. Danke fuer die hilfe und den zeitaufwand! Mein programm laeuft jetzt einwandfrei, und ich compiliere jetzt wohl alle meine programme mit deiner rc.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 21.06.2018, 11:43    Titel: Antworten mit Zitat

Bitte gerne. Beachte dass du, wenn du Windows quasi mitteilst dass sich das Programm selbst um die Skalierung kümmert, das auch machen solltest. Sonst ist deine Ausgabe eventuell auf hochauflösenden Bildschirmen zu klein bzw. auf niedrigauflösenden zu groß.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz