Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bildschirmauflösung + Form (https://www.delphipraxis.net/1620-bildschirmaufloesung-form.html)

moin339 13. Dez 2002 21:58


Bildschirmauflösung + Form
 
Moin!

Ich möchte ein Form anzeigen während meine Anwendung im Hintergrund läuft. Wenn ich das Form anzeige wird die Bildschrimauflösung aber geändert, wenn eine Anwendung im Vordergrund im Vollbildmodus läuft. Das Problem tritt z.B. auf wenn ich gerade ein Spiel geöffnet habe und dann das Form anzeigen lasse. Wie kann ich das umgehen?

Ich möchte also ein Fenster erstellen, dass sich der aktuellen Auflösung anpasst. Wie geht das?

schönes Wochenende noch, moin339 :coder:

nailor 13. Dez 2002 22:24

du kannst auf jeden fall mit screen.width und screen.heigth die aktuelle breite und höhe des bildschirms abrufen. kannst auch unter tscreen in der hilfe nachschaun, ob es da was gibt, das dir helfen könnte.

moin339 14. Dez 2002 13:25

Moin!

screen.width und screen.heigth bringt mich aber nicht weiter. Ich weiß nicht ob ihr verstanden habt was ich eigentlich will.

Mein Programm läuft im Hintergrund und ich möchte ein weiters Fenster anzeigen wenn eine Tastenkombination gedrückt wurde. Dieses Fenster soll dann in den Vordergrund treten, auch wenn ein anderes Fenster im vordergrund ist. Das funktioniert soweit auch ganz gut aber wenn ein Programm im Vollbildmodus aktiviert ist wird erst die Auflösung umgestelt. (passiert z.b. auch wenn man gerade ein Spiel zoggt und dann die win-taste drückt) Wie kann ich also ein neues Fenster anzeigen ohne das irgentetwas an der Auflösung geändert wird? Ich hoffe es ist jetzt deutlicher.

cu, moin339

d3g 14. Dez 2002 14:35

Hallo moin,

ich glaube, dass das, was du willst, nicht zu realisieren sein wird. Wenn nämlich gerade ein Spiel läuft, ist nicht einfach die Auflösung geändert, sondern (in den meisten Fällen) ist ein spezielles DirectDraw- oder Direct3D-Device geöffnet. Du müsstest darauf zeichnen und überhaupt den Zugriff zu erlagen, dürfte nicht gerade einfach - wenn nicht unmöglich - sein (mal abgesehen davon, dass dir die VCL- und WinAPI-Controls nichts bringen würden, du müsstest du dir deine eigenen zeichnen und per Maushook eine eigene Ereignisbehandlung einbauen).

MfG,
d3g

moin339 14. Dez 2002 16:53

Moin!

Schade! :(

Eigentlich möchte ich auch nur eine Info am Bildschirm ausgeben. Es sollen also keine Buttons oder ähnliches verfügbar sein. Mit textout funktioniert es aber glaube ich immer. Nur wie kann ich es erreichen, dass der ausgegebene Text nicht von dem Spiel überschrieben wird? Ich habs mal mit einem Timer (20 ms) probiert, hat aber trotzdem geflackert! Gibt es da eine Möglichkeit?

ciao, moin339

d3g 14. Dez 2002 16:57

Wie hast du es denn überhaupt geschafft, auf das Device zu zeichnen?

moin339 14. Dez 2002 17:05

Moin!

Ungefähr so:

Delphi-Quellcode:
procedure schreiben;
var dc: hdc;
var s:string;
begin
  DC := getdc(0); // O = Desktop
  s := 'Moin!';
  SetBkMode(dc, transparent); //hintergrund transparent
  SetTextAlign(dc,ta_center); //Ausrichtung: center
  SetTextColor(dc,RGB(0,0,255)); //Farbe: blau
  TextOut(dc,(screen.width div 2),(screen.Height div 2),PChar(s),length(s));
end;
cu

d3g 14. Dez 2002 18:55

Oh. Ich wusste gar nicht, dass man so einfach auf ein DirectX-Device schreiben kann... Wie auch immer, um das Flimmern loszuwerden, müsstest du nicht auf den Desktop schreiben, sondern DirectDraw-Funktionen benutzen, und dafür musst du dir erst Zugriff auf das Device beschaffen. Also kann ich dir nur raten, einen höher auflösenden Timer zu benutzen, schau dich mal nach Multimedia-Timern um (speziell die Funktion timeSetEvent() dürfte interessant für dich sein).

MfG,
d3g

phlux 14. Dez 2002 19:06

Hi!
Folgende Lösung hab ich aus dem Delphi5 Kochbuch entnommen ("Rezept R43 ...ein Formular skalieren")

Delphi-Quellcode:
const
  ScreenHeightDev = 768;
  ScreenWidthDev = 1024;

procedure TForm1.FormCreate(Sender: TObject);
var
  x, y: Integer;

begin
  Scaled := True;
  x := Screen.Width;
  y := Screen.Height;
  if (y <> ScreenHeightDev) or (x <> ScreenWidthDev) then
  begin
    Form1.Height := (Form1.ClientHeight * y div ScreenHeightDev) +
                    Form1.Height - Form1.ClientHeight;
    Form1.Width := (Form1.ClientWidth * x div ScreenWidthDev) +
                   Form1.Height - Form1.Clientheight;
    ScaleBy(x, ScreenWidthDev);
  end;
end;
Das Formular dürfte sich jetzt der Auflösung anpassen. Hab den Code aus dem Buch abgetippt, garantiere also nicht für die Fehlerfreiheit ;) . Hoffe das rezept hat dir geholfen.

moin339 14. Dez 2002 21:48

Moin!

Danke für den Aufwand! Aber soweit ich das überblicken kann werden da ja nur die Form1.width und Form1.Height eigenschaften geändert. Das ist leider nicht mein Problem.

cu, moin339 :coder:

phlux 14. Dez 2002 21:56

Aus der Delphi Hilfe:

Zitat:

TCustomForm.Scaled

Die Eigenschaft Scaled bestimmt, ob das Formular entsprechend der Eigenschaft PixelsPerInch skaliert wird.

property Scaled: Boolean;

Beschreibung

Wenn Scaled True ist und sich der Wert von PixelsPerInch von der aktuellen Systemeinstellung unterscheidet, wird die Größe des Formulars entsprechend geändert. Wird Scaled auf False gesetzt, findet keine Skalierung statt.
Heißt alles andere wird auch vergrößert, probier einfach mal den code aus ;)

moin339 14. Dez 2002 22:00

Moin!

@phlux: ich probier den code gleich mal aus

Zitat:

Zitat von d3g
Wie auch immer, um das Flimmern loszuwerden, müsstest du nicht auf den Desktop schreiben, sondern DirectDraw-Funktionen benutzen, und dafür musst du dir erst Zugriff auf das Device beschaffen.

Und wie bekomme ich dadrauf zugriff? (Mit timeSetEvent hat es trotzdem geflimmert) Und ist es dann auch möglich mit der gleichen methode in andere anwendungen zu "schreiben" ?

Ich bin dabei ein Programm zu programmieren, dass die Lautstärke des Systems bei einer Tastenkombination ändert. Ein Freund von mir hat eine Tastatur mit ein paar extra Tasten, unter anderem zum regeln der Lautstärke. Wenn man diese drückt wird die Lautstärke geändert und eine Prozentangabe auf dem Bildschirm geschrieben. (funktioniert immer und ohne flackern) Das möchte ich jetzt für leute ohne so eine Multimedia tastatur ermöglichen.

cu, moin339

phlux 14. Dez 2002 22:03

Mach das doch einfach über systemweite Hotkeys.

moin339 16. Dez 2002 12:42

Moin!

Zitat:

Zitat von phlux
Mach das doch einfach über systemweite Hotkeys.

??? Den Hook habe ich schon programmiert (in einer dll). Das ändern der Lautstärke ist auch schon fertig, aber ich weiß nicht, wie ich die aktuelle Lautstärke auf dem Bildschirm ausgeben kann. Die Lautstärke sollte für etwa 5 Sekunden angezeigt werden. Auch wenn ein Spiel im Vordergrund ist.

@phlux: Dein code hat leider nicht funktioniert. Es wurde nur die größe des Formulars geändert. Das Formular wurde auch angezeigt, aber vorher wurde die auflösung umgestellt :-(

Vielleicht hat ja noch jemand eine Idee

cu, moin339


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz