Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi "Windows"-Rahmen unsichtbar?! (https://www.delphipraxis.net/10636-windows-rahmen-unsichtbar.html)

RedSea21w 22. Okt 2003 15:02


"Windows"-Rahmen unsichtbar?!
 
Hallo :)

Ich weiß gar nicht ob ich hier in der Kategorie richtig bin, aber kann gar nicht so genau abgrenzen zu welchem Thema mein Problem gehört.

Ich programmier grade einen Videoplayer für MPG-Files und das funktioniert auch alles, also ich benutze den integrierten Mediaplayer von Delphi und es geht mehr so um's Drumherum. Z.B habe ich einen Vollbildmodus gemacht, in den man wechseln kann, wenn man über "Optionen"(neues Pop-Up-Fenster) die Auswahl über eine CheckBox tätigt. Ist auch alles schön, also er entfernt dann das Panel (Stop/Play/Pause ..die Buttons usw), übrig bleibt dann das MediaPlayer-Panel was auch maximiert dargestellt wird über:

Delphi-Quellcode:
     Height   := Screen.Height;
     Width    := Screen.Width;
     Top      := 0;
     Left     := 0;
ich blende dann die Taskleiste von Windows aus mit:

Delphi-Quellcode:
     hTaskbar:=FindWindow('Shell_TrayWnd',nil);
     ShowWindow(hTaskBar, SW_HIDE);
Nur das Problem ist jetzt, das der Rahmen(?!) von MainForm eingeblendet bleibt, also kein richtiger Vollbildmodus ist, wie man ihn kennt.

Nun hab ich es mit
Delphi-Quellcode:
Borderstyle := bsNone;
probiert, was an sich auch funktioniert, nur starte er dann das Programm komplett neu, nachdem man bei "Optionen" Vollbild ausgewählt hat. Und geht dann bei nochmaligem Filmstarten in den Vollbildmodus, welchen ich mit Esc wieder verlassen kann, jedch mit selbigen Problem, wenn ich
Delphi-Quellcode:
Borderstyle := bsNone;
benutze. Ohne, funktioniert das hin und herwechseln ohne Probleme.

Gibts da noch irgendwie eine Alternative? Z.B. kann man ja die Taskleiste auch mit
Delphi-Quellcode:
FormStyle := FsStayOnTop;
überblenden wenn man es im Zuge der Vergrößerung des Mediaplayer-Panels macht. Nur hab ich dann das selbe Problem wie bei Borderstyle (dann also schon 2 Neustarts brauche eh er in den richtigen Vollbildmodus wechselt)

Vielleicht fällt einem von Euch dazu ja was ein, denn ich steh momentan irgendwie aufm Schlauch und bin ein bisschen ratlos. :gruebel:

Reni

Christian Seehase 22. Okt 2003 15:50

Re: "Windows"-Rahmen unsichtbar?!
 
Moin Reni,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Ich weiss zugegebener Massen nicht, wie jetzt andere Programme (WinDVD o.ä) einen solchen Vollbildmodus erzeugen, aber eine Möglichkeit wäre es, das Fenster einfach grösser als den Bildschirm zu machen, und die Ränder ausserhalb des sichtbaren Bereiches zu plazieren.
Es hindert dich niemand daran mit negativen Koordinaten zu arbeiten, um dieses zu erreichen ;-)

Da die Breite des Borders einstellbar ist, könntest Du dessen Breite in Pixel mit GetSystemMetrics(SM_CXEDGE) bzw. SM_CYEDGE ermitteln.

negaH 23. Okt 2003 00:50

Re: "Windows"-Rahmen unsichtbar?!
 
Zitat:

probiert, was an sich auch funktioniert, nur starte er dann das Programm komplett neu, nachdem man bei "Optionen" Vollbild ausgewählt hat. Und geht dann bei nochmaligem Filmstarten in den Vollbildmodus, welchen ich mit Esc wieder verlassen kann, jedch mit selbigen Problem, wenn ich
Das liegt daran das die VCL beim Ändern der BorderStyle eines Forms dessen Windows-Handle zerstört und wieder neu mit neuen Denstereigenschaften anlegt. Da aber der TMediaPlayer auf diesem Form liegt und für dessen Media Funktionen sein Fensterhandle benötigt, wird auch dieses Handle mit zerstört. Es gäbe jetzt vier Lösungen

1.) ein zweites unsichtbares TForm auf dem der TMediaPlayer sitzt
2.) der TMediaPlayer wird temporär vom TForm gelösst
3.) mit SetWindowLong(Form.Handle, GetWindowLong(Form.Handle, gwl_Style) and not (ws_OverlappedWindow or ws_Caption) or ws_Popup) lässt sich der Frame entfernen
4.) man überschreibt die Message wm_NCCalcSize und definiert dort andere Non-Client Fensterbereiche, eg. der Clientbereich wird exakt so groß gesetzt wie der Non-Client Bereich.

Gruß Hagen

RedSea21w 23. Okt 2003 10:11

Re: "Windows"-Rahmen unsichtbar?!
 
Erstmal Danke für die Antworten, :)

einfach das Fenster grßer zumachen funktioniert nur bedingt Chris in der Breite kein Problem, aber in der Höhe ist es irgendwie unmöglich beide Rahmen wegzubekommen (oder ich stell mich da nur zu blöd an).

Das mit Handle dacht ich mir schon Hagen, nur irgendwie *hm* ..also der Mediaplayer ist ja in Mainform bei mir, versteh irgendwie nicht genau was ich machen soll, ein neues Formular für Vollbild? *funktioniert irgendwie nicht* Ich habs dann mit
Delphi-Quellcode:
 SetWindowLong(MainForm.Handle, GetWindowLong(MainForm.Handle, gwl_Style) and not (ws_OverlappedWindow or ws_Caption) or ws_Popup);
versucht, also das was du da geschrieben hast, hab auch schon so im Internet gesucht nur zeigt er mir dann da folgenden Fehler an:

Zitat:

[Warnung] Videoplayer.pas(585): Vorzeichenbehaftete und -lose Typen werden kombiniert - beide Operanden werden erweitert
[Fehler] Videoplayer.pas(585): Nicht genügend wirkliche Parameter
hab schon gesucht wie genau die Funktion dann aussehen muss, aber ohne größeren Erfolg.
Achja ich hab die Funktion in meine Vollbild procedure eingefügt (vielleicht ist das ja auch falsch?)

Deinen 4. Vorschlag find ich eigentlich auch ganz gut weiß da aber überhaupt nicht was bzw. wo ich da was machen muss.
Ein neuen Form erstellen, da bin ich irgendwie nicht so begeistert von, das bringt irgendwie mein ganzen Programm durcheinander, aber wenns natürlich nicht anders geht muss ich das ja dann so machen. (ja ganz richtig ich programmier noch nicht so lang mit Delphi :wink: ist auch mehr zwangsweise :mrgreen: eigentlich mehr c++ mach, aber ist ja irgendwie doch alles ähnlich..)
Mir wär von daher natürlich eine möglichst leichte Lösung lieb, aber sowas gibts ja kaum.. Schade das das von Dir, Chris nicht so richtig funktioniert.

lg Reni

Christian Seehase 23. Okt 2003 15:40

Re: "Windows"-Rahmen unsichtbar?!
 
Moin Zusammen,

@Hagen:
Man könnte doch auch noch einen 5. Punkt in Erwägung ziehen:
Das Display wird erst nach einer Änderung zugewiesen, bzw. erneut zugewiesen.
Ich hab' mir jetzt noch nicht angesehen, ob das ein sauberer Weg ist, aber es funktioniert soweit.

@Reni:
Ich hab' das mal ausprobiert, und soweit geht's:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    MediaPlayer1: TMediaPlayer;
    procedure FormClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FfFullScreen : boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormClick(Sender: TObject);

var
  iWidth : integer;
  iHeight : integer;
  iTop   : integer;
  iLeft  : integer;
  iEdgeX : integer;
  iEdgeY : integer;

begin
  if FfFullScreen then begin
    self.FormStyle      := fsNormal;
    MediaPlayer1.Display := Form1;
    SetWindowLong(self.Handle,GWL_STYLE,GetWindowLong(self.Handle,GWL_STYLE) or WS_CAPTION);
    SetWindowPos(self.Handle,0,200,100,870,640,SWP_SHOWWINDOW);
  end else begin
    iEdgeX := GetSystemMetrics(SM_CXEDGE);
    iEdgeY := GetSystemMetrics(SM_CYEDGE);
    iWidth := Screen.Width+iEdgeX*2;
    iHeight := Screen.Width+iEdgeY*2;
    iTop   := -iEdgeY-2;
    iLeft  := -iEdgeX-2;
    self.FormStyle := fsStayOnTop;
    SetWindowLong(self.Handle,GWL_STYLE,GetWindowLong(self.Handle,GWL_STYLE) and not WS_CAPTION);
    SetWindowPos(self.Handle,0,iLeft,iTop,iWidth,iHeight,SWP_SHOWWINDOW);
    MediaPlayer1.Display := Form1;
    MediaPlayer1.Open;
    MediaPlayer1.Play;
  end;
  FfFullScreen := not FfFullScreen;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FfFullScreen := false;
end;

XeRo 23. Okt 2003 16:34

Re: "Windows"-Rahmen unsichtbar?!
 
Ich weiß nicht obs funktioniert, aber versuch mal so in den Vollbildmodus zu gehen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  HTaskbar: HWND;
  OldVal: LongInt;
begin
  try
    // Find handle of TASKBAR
    HTaskBar := FindWindow('Shell_TrayWnd', nil);
    // Turn SYSTEM KEYS off, Only Win 95/98/ME
    SystemParametersInfo(97, Word(True), @OldVal, 0);
    // Disable the taskbar
    EnableWindow(HTaskBar, False);
    // Hide the taskbar
    ShowWindow(HTaskbar, SW_HIDE);
  finally
    with Form1 do
    begin
      BorderStyle := bsNone;
      FormStyle  := fsStayOnTop;
      Left       := 0;
      Top        := 0;
      Height     := Screen.Height;
      Width      := Screen.Width;
    end;
  end
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  HTaskbar: HWND;
  OldVal: LongInt;
begin
  //Find handle of TASKBAR
  HTaskBar := FindWindow('Shell_TrayWnd', nil);
  //Turn SYSTEM KEYS Back ON, Only Win 95/98/ME
  SystemParametersInfo(97, Word(False), @OldVal, 0);
  //Enable the taskbar
  EnableWindow(HTaskBar, True);
  //Show the taskbar
  ShowWindow(HTaskbar, SW_SHOW);
end;


Deine Form wird dann(wie ein Spiel) in den Vollbildmodus gesetzt. Zudem werden auch alle System-Keys ignoriert. :wiejetzt:

RedSea21w 24. Okt 2003 13:05

Re: "Windows"-Rahmen unsichtbar?!
 
Hi :)


Vielen, vielen Dank für eure Vorschläge und Quellcodes :mrgreen:

@ XeRo so ähnlich hatte ich es vorher, das mit den SystemKeys nicht aber das mit BorderStyle:= bsNone usw. hab deins auch nochmal ausprobiert, hat dann aber den selben Effekt wie meine ersten Versuche (oben beschrieben - Neustart des Fensters) die Erklärung dazu hat ja dann Hagen gegeben (Danke auch dafür :wink: )

@Chris ...nach bisschen rumprobieren und umstellen läuft es jetzt tatsächlich so wie ich es haben will *g* daaaankeschön :)

Für alle, die auch irgendwas im Vollbildmodus machen wollen ist das sicher einer der richtigen Wege :cyclops:

Euch allen ein schönes Wochenende :thuimb:

lg Reni


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:12 Uhr.

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