AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

"Windows"-Rahmen unsichtbar?!

Ein Thema von RedSea21w · begonnen am 22. Okt 2003 · letzter Beitrag vom 24. Okt 2003
Antwort Antwort
RedSea21w

Registriert seit: 22. Okt 2003
Ort: HST
7 Beiträge
 
Delphi 5 Professional
 
#1

"Windows"-Rahmen unsichtbar?!

  Alt 22. Okt 2003, 15:02
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 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 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 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.

Reni
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: "Windows"-Rahmen unsichtbar?!

  Alt 22. Okt 2003, 15:50
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#3

Re: "Windows"-Rahmen unsichtbar?!

  Alt 23. Okt 2003, 00:50
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
  Mit Zitat antworten Zitat
RedSea21w

Registriert seit: 22. Okt 2003
Ort: HST
7 Beiträge
 
Delphi 5 Professional
 
#4

Re: "Windows"-Rahmen unsichtbar?!

  Alt 23. Okt 2003, 10:11
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  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 ist auch mehr zwangsweise 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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: "Windows"-Rahmen unsichtbar?!

  Alt 23. Okt 2003, 15:40
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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
XeRo

Registriert seit: 23. Okt 2003
Ort: Warth
461 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: "Windows"-Rahmen unsichtbar?!

  Alt 23. Okt 2003, 16:34
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.
  Mit Zitat antworten Zitat
RedSea21w

Registriert seit: 22. Okt 2003
Ort: HST
7 Beiträge
 
Delphi 5 Professional
 
#7

Re: "Windows"-Rahmen unsichtbar?!

  Alt 24. Okt 2003, 13:05
Hi


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

@ 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 )

@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

Euch allen ein schönes Wochenende

lg Reni
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 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