Announcement

Collapse
No announcement yet.

ChangeDisplaySettings Hilfe

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ChangeDisplaySettings Hilfe

    Ich möchte bei Programmstart die Bildschirmauflösung ändern und bei Ende wieder zurücksetzen.
    Dafür habe ich 3 Routinen.
    1. Auslesen der möglichen Einstellungen mit EnumDisplaySettings(0,0-n,tDisplaymode);
    Angezeigt werden sämtliche Auflösung die unterstützt werden.
    Nur die Flags und die Frequenz ist immer 0(null);

    2. Setzen der neuen Einstellungen mit ChangeDisplaySettings(pDisplayMode,0);
    Ich übergebe dabei Bits := 16 oder 32, width := 640, height = 480, Flags := 0,Frequenz := 0;
    Beim Versuch die Auflösung zu ändern gescha folgendes:
    1. Mit Delphi IDE geöffnet -> Kein Problem. Alles Okay.
    2. Ohne Delphi IDE -> Kein Umschalten.
    3. Nach neuCompilierung -> kein Umschalten mehr sondern Fehler beim Aufruf
    mit Result -2 ->Flascher Mode.

    3. Zurücksetzen auf alte Einstellungen mit ChangeDisplaySettings(Nil,0);

    Wer kann mir helfen? Woher kann es kommen?

    Viele Grüße

    A.Weiler
    [email protected]

  • #2
    Hallo,

    was passiert bei dem folgenden Aufruf?
    <pre>
    var
    i : integer;
    devmode : tDeviceMode;
    hasMode : boolean;
    begin
    i := 0;
    hasMode := false;
    { Check for presence of 640x480 16 colors (8 bit pixel depth) }
    while EnumDisplaySettings(nil, i, devmode) do begin
    with devmode do begin
    if (dmBitsPerPel = 8) and (dmPelsWidth=640) and (dmPelsHeight=480) then
    hasMode := true;
    end;
    inc(i);
    end;
    if hasMode then
    with devmode do begin
    dmBitsPerPel := 8;
    dmPelsWidth := 640;
    dmPelsHeight := 480;
    dmFields := DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT;

    ChangeDisplaySettings(devmode, 0);
    end
    else
    ShowMessage('Sorry - cannot run this program - requirements not met!');
    end;
    </pre&gt

    Comment


    • #3
      Hallo Herr Kosch,

      auch hierbei gibt es eine Fehlermeldung.
      Flags sind falsch.

      Ich denke ich weis woran es liegt.
      Wenn ich nur die Bildschirmauflösung ändere, funktioniert es sofort.
      Versuche ich aber Die Bildschirmauflösung und die Farbtiefe zu ändern,
      kommt eine Fehlermeldung.

      Der Grund hierfür liegt nicht an dem gelichzeitigen ändern, sondern vielmehr daran, daß mein Rechner unter WIN95 mit ATI Rage Fury Grafikkarte Win95 neu booten will sobald ich die Farbtiefe ändern will ohne das Programm von ATI zu benutzen.

      Vielen Dank

      A.Weiler
      [email protected]

      Comment


      • #4
        Hallo, Herr Kosch !<p>

        Ihre Procedure (vom 12.02.2000) klappt eigentlich ganz prima, mit einem kleinen aber unangenehmen Schönheitsfehler:<P>

        Ich möchte mit dieser Funktion eine Auflösung von mindestens <br>
        1024 x 768 erzwingen und nach dem Programmende auf die Ursprungseinstellung zurückschalten.<p>
        Das Umschalten aus 800 x 600 klappt; die Windows-Taskleiste steht jetzt jedoch auf der alten Bildschirmhöhe 600 (in Länge der alten
        Bildschirmbreite 800).<p>
        Selbstverständlich hat auch ein Hintergrundbild diese Größe (das wäre aber für mich nicht wichtig).<p>
        Wie kann man das verhindern ? Oder ist das vielleicht ein Problem von Windows ME ? <p>
        Außerdem wäre interessant, wie man die vor dem Umschalten eingestellten "dmBitsPerPel" auslesen kann, damit man auch diese nach Programmende wieder ordnungsgemäß zurückstellen kann.<p>
        <b>Für eine baldmögliche Antwort wäre ich Ihnen außerordentlich dankbar !<p>

        Klaus F. Jäd

        Comment


        • #5
          Hallo,

          tritt das Problem mit der Windows-Taskleiste auch dann auf, wenn die Auflösung von Hand umgeschaltet wird?

          Die aktuellen Einstellungswerte können über <b>GetDeviceCaps</b> abgefragt werden:
          <pre>
          procedure TForm1.Button1Click(Sender: TObject);
          var
          iBITSPIXEL : Integer;
          iVREFRESH : Integer;
          begin
          iBITSPIXEL := GetDeviceCaps(Form1.Canvas.Handle, BITSPIXEL);
          iVREFRESH := GetDeviceCaps(Form1.Canvas.Handle, VREFRESH);
          ShowMessage(IntToStr(iBITSPIXEL) + #13 +
          IntToStr(iVREFRESH));
          end;
          </pre>
          &#10

          Comment


          • #6
            Hallo Herr Kosch,

            Nein das Problem tritt beim Umschalten per Hand <b> nicht </b> auf,
            nur, wenn ich Changedisplaysettings im Programm verwende ! Inzwischen habe ich festgestellt, dass beim programmgesteuerten Umschalten von hoher (1024x768) in eine niedrige (800x600) Auflösung die Windows-Taskleiste völlig verschwindet (vermutlich in den nicht mehr sichtbaren Bereich).
            <p>
            <b>Wie kann man das lösen ?</b><P>

            Klaus Jäd

            Comment


            • #7
              Hallo,

              im Platform SDK steht, dass nach ein Änderung die Botschaft WM_DISPLAYCHANGE an alle Anwendungen geschickt wird, damit diese ihre Darstellung anpassen können. Anscheindend reicht das bei der Task Bar in Ihrem Fall nicht aus. Ich würde daher folgendes probieren: <br>
              a) letzten Parameter von 0 auf <i>CDS_UPDATEREGISTRY</i> ändern<br>
              b) oder letzten Parameter von 0 auf <i>CDS_UPDATEREGISTRY or CDS_GLOBAL</i> ändern <br>
              c) <i>SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0);</i> <br>
              d) <i>SystemParametersInfo(SPI_SETWORKAREA, 0, 0, 0); </i> <br>
              e) SHAppBarMessage aufrufen, um über ABM_SETPOS die Position der Taskbar zu setzen

              &#10

              Comment


              • #8
                <b> Super Herr Kosch ! </b><P>

                Bereits der Hinweis a) war erfolgreich: CDS_UPDATEREGISTRY hat gewirkt und das Problem beseitigt.

                Herzlichen Dank für die schnelle Hilfe !

                Klaus Jäd

                Comment


                • #9
                  Hallo,<p>Ok, mit ChangeDisplaySetitings kann ich die Bildschirmsauflösung des gesamten Systems ändern. Nun habe ich folgendes Problem. Wenn ich die Auflösung von 800x600 auf 640x480 runterschalte und nach dem Ende des Programms wieder auf die ursprüngliche Größe zurückschalte, hat sich alles auf dem Desktop verschoben. Gibt es eine Möglichkeit, nur die Auflösung des Programms (läuft als Vollbild) zu verändern - So wie bei DelphiX. Ich möchte eigentlich nicht, dass für das Programm noch zusätzlich DirectX installiert sein muss. Geht das irgendwie mit API's

                  Comment


                  • #10
                    Hallo,<p>
                    Ok, mit ChangeDisplaySetitings kann ich die Bildschirmsauflösung des gesamten Systems ändern. Nun habe ich folgendes Problem. Wenn ich die Auflösung von 800x600 auf 640x480 runterschalte und nach dem Ende des Programms wieder auf die ursprüngliche Größe zurückschalte, hat sich alles auf dem Desktop verschoben. Gibt es eine Möglichkeit, nur die Auflösung des Programms (läuft als Vollbild) zu verändern - So wie bei DelphiX. Ich möchte eigentlich nicht, dass für das Programm noch zusätzlich DirectX installiert sein muss. Geht das irgendwie mit API's

                    Comment

                    Working...
                    X