• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

Videoausschnitt im laufenden Film vergrößern

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Kann ich bestätigen.

Findest Du aber raus, wenn Du Dir das noch mal anschaust: ;)

[src=csharp]
axWindowsMediaPlayer1.settings.mute = true;
axWindowsMediaPlayer2.settings.mute = false;
radioButton1.Checked = true;
[/src]

[src=csharp]
axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = true;
radioButton2.Checked = true;

[/src]
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #22
Jetzt hatte ich das tatsächlich genau falsch herum gemacht. Interessant, dass es überhaupt funktionierte und erst bei einem nochmaligen Klick zu diesem Bug kam. Ich glaube da wäre ich in 100 Jahren nicht drauf gekommen. Danke.

Glaube das wars jetzt endgültig. Keine Fehler mehr. (Außer, dass die GUI halt bei zu kleinen Bildschirmauflösungen nicht mehr passt)
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Es hat nicht funktioniert. Aber wenn beide Tonspuren das gleiche Ereignis aufgezeichnet haben, fällt es nicht auf. Ich hatte den einen Player auf leise, den anderen auf laut gestellt.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #24
Ich hatte (fast) immer unterschiedliche Videos genommen. Wie dem auch sei. Morgen folgt dann der Start der nächsten Version. GUI ist schon fertig, aber da gehen dann auch schon die Probleme los. Dürfte spannend werden, ob das Projekt weiterhin so gut für mich läuft.
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #26
Abschluss dieser Version:

[Features / Changelog]
- Multicamdatei kann erstellt und geladen werden (Damit muss man nicht mehr jedes einzelne Video in die Player laden)
- Player synchronisieren sich jetzt gegenseitig an den Sprungmarken
- Echtes Bind in Bild
- Player-Steuerelemente des verkleinerten Players werden ausgeblendet
- Bild in Bild kann kann eine der vier Ecken zugewiesen werden
- Freie Wahl der Audiospur
- Optimierte Playergröße für 16:9

Anhang anzeigen 45298

[src=csharp]using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using WMPLib;


namespace Multicam_View_PoC2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// Globale Variablen
int lastPlayer;
bool playerAusgangsstellung;

public void MediaPlayer1_Klick()
{

// Player nicht mehr in Ausgangsstellung
playerAusgangsstellung = false;

// Größe der Player
axWindowsMediaPlayer1.Size = new Size(996, 625);
axWindowsMediaPlayer2.Size = new Size(284, 160);

// Position des großen Players
axWindowsMediaPlayer1.Location = new Point(0, 24);
// Kleiner gemachte Player in den vordergrund
axWindowsMediaPlayer2.BringToFront();
// Steuerelemente des kleineren Players ausblenden
axWindowsMediaPlayer2.uiMode = "none";
// Steuerelemente des großen Players (wieder) einblenden
axWindowsMediaPlayer1.uiMode = "full";

// Ton an / aus
axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = true;
radioButton1.Checked = true;

// Fenstergröße anpassen
this.Size = new Size(1010, 800);
}

public void MediaPlayer2_Klick()
{
// Player nicht mehr in Ausgangsstellung
playerAusgangsstellung = false;

// Größe der Player
axWindowsMediaPlayer2.Size = new Size(996, 625);
axWindowsMediaPlayer1.Size = new Size(284, 160);

// Position des großen Players
axWindowsMediaPlayer2.Location = new Point(0, 24);
// Kleiner gemachte Player in den vordergrund
axWindowsMediaPlayer1.BringToFront();
// Steuerelemente des kleineren Players ausblenden
axWindowsMediaPlayer1.uiMode = "none";
// Steuerelemente des großen Players (wieder) einblenden
axWindowsMediaPlayer2.uiMode = "full";

// Ton an / aus
axWindowsMediaPlayer1.settings.mute = true;
axWindowsMediaPlayer2.settings.mute = false;
radioButton2.Checked = true;

// Fenstergröße anpassen
this.Size = new Size(1010, 800);
}

public void keinBildInBild()
{
// Player in Ausgangsstellung
playerAusgangsstellung = true;

// Größe der Player
axWindowsMediaPlayer1.Size = new Size(640, 427);
axWindowsMediaPlayer2.Size = new Size(640, 427);

// Possition des Player nebeneinander anordnen
axWindowsMediaPlayer1.Location = new Point(0, 24);
axWindowsMediaPlayer2.Location = new Point(645, 24);

// Ton beider Player an
axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = false;
radioButton3.Checked = true;

// Steuerelemente beider Player (wieder) einblenden
axWindowsMediaPlayer1.uiMode = "full";
axWindowsMediaPlayer2.uiMode = "full";

// Fenstergröße anpassen
this.Size = new Size(1303, 800);
}

private void Form1_Load(object sender, EventArgs e)
{
playerAusgangsstellung = true;
}

// Datei öffnen für Player 1
private void dateiÖffnenKamera1ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Videodateien (*.mp4)|*.mp4|Alle Dateien (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
string file = ofd.FileName;
axWindowsMediaPlayer1.URL = ofd.FileName;
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

// Datei öffnen für Player 2
private void dateiÖffnenKamera2ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Videodateien (*.mp4)|*.mp4|Alle Dateien (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
{
string file = ofd.FileName;
axWindowsMediaPlayer2.URL = ofd.FileName;
axWindowsMediaPlayer2.Ctlcontrols.stop();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void mutlicamDateiErstellenToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Multicam View (*.mcv)|*.mcv";
if (sfd.ShowDialog() == DialogResult.OK)
{
string file = sfd.FileName;
string pfadVideo1 = axWindowsMediaPlayer1.URL;
string pfadVideo2 = axWindowsMediaPlayer2.URL;
File.WriteAllText(sfd.FileName, pfadVideo1 + "\r\n" + pfadVideo2, Encoding.UTF8);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void playlistÖffnenToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Multicam(*.mcv|*.mcv";
if(ofd.ShowDialog() == DialogResult.OK)
{
string file = ofd.FileName;
var lines = File.ReadAllLines(file);
// Teile 1 auslesen
axWindowsMediaPlayer1.URL = lines[0];
axWindowsMediaPlayer1.Ctlcontrols.stop();
// Zeile 2 auslesen
axWindowsMediaPlayer2.URL = lines[1];
axWindowsMediaPlayer2.Ctlcontrols.stop();
}
}

private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
MessageBox.Show("Multicam View PoC2.1");
}

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
// Ton für Player 1 einschalten
axWindowsMediaPlayer1.settings.mute = false;
// Ton für Player 2 ausschalten
axWindowsMediaPlayer2.settings.mute = true;
}

private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
// Ton für Player 1 ausschalten
axWindowsMediaPlayer1.settings.mute = true;
// Ton für Player 2 einschalten
axWindowsMediaPlayer2.settings.mute = false;
}

private void radioButton3_CheckedChanged(object sender, EventArgs e)
{
// Ton beider Player einschalten
axWindowsMediaPlayer1.settings.mute = false;
axWindowsMediaPlayer2.settings.mute = false;
}

private void cmdPlay_Click(object sender, EventArgs e)
{
// Beide Player gleichzeitig die Videos abspielen lassen
axWindowsMediaPlayer1.Ctlcontrols.play();
axWindowsMediaPlayer2.Ctlcontrols.play();
// Text des Play-Buttons (wieder) auf Play setzen.
cmdPlay.Text = "Play";
}

private void cmdPause_Click(object sender, EventArgs e)
{
// Videos pausieren
axWindowsMediaPlayer1.Ctlcontrols.pause();
axWindowsMediaPlayer2.Ctlcontrols.pause();
// Text des Play-Buttons wenn die Videos pausiert werden
cmdPlay.Text = "Weiter";
}

private void axWindowsMediaPlayer1_MouseDownEvent(object sender, AxWMPLib._WMPOCXEvents_MouseDownEvent e)
{
// Wird Player 1 (egal wo und wie) angeklickt den Player entsprechend markieren
// Wichtig um bei den Sprungmarken unterscheiden zu können welcher Player sich dem Anderen anpassen muss
lastPlayer = 1;
}

private void axWindowsMediaPlayer2_MouseDownEvent(object sender, AxWMPLib._WMPOCXEvents_MouseDownEvent e)
{
// Wird Player 2 (egal wo und wie) angeklickt den Player entsprechend markieren
// Wichtig um bei den Sprungmarken unterscheiden zu können welcher Player sich dem Anderen anpassen muss
lastPlayer = 2;
}

private void axWindowsMediaPlayer1_PositionChange(object sender, AxWMPLib._WMPOCXEvents_PositionChangeEvent e)
{
// Wird die Sprungmarke an Player 1 geändert zieht Player 2 gleich
if (lastPlayer == 1)
{
axWindowsMediaPlayer2.Ctlcontrols.currentPosition = axWindowsMediaPlayer1.Ctlcontrols.currentPosition;
}
}

private void axWindowsMediaPlayer2_PositionChange(object sender, AxWMPLib._WMPOCXEvents_PositionChangeEvent e)
{
// Wird die Sprungmarke an Player 2 geändert zieht Player 1 gleich
if (lastPlayer == 2)
{
axWindowsMediaPlayer1.Ctlcontrols.currentPosition = axWindowsMediaPlayer2.Ctlcontrols.currentPosition;
}
}

// <!-- Anfang Bild in Bild Possitionen --->
private void radioAus_CheckedChanged(object sender, EventArgs e)
{
playerAusgangsstellung = true;
keinBildInBild();
}

private void radioObenLinks_CheckedChanged(object sender, EventArgs e)
{
// Prüfen, ob beide Player in Ausstellungsstellung
// Falls ja nicht auf den Radio-button reagieren
if (playerAusgangsstellung == false)
{
// Prüfen an welchem Player die Steuerelemente ausgelendet sind
// Das ist dann der kleinere Player und wird entsprechend der Beschreibung des Radio-Buttons verschoben
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(0, 24);
}
else if (axWindowsMediaPlayer2.uiMode != "full")
{
axWindowsMediaPlayer2.Location = new Point(0, 24);
}
else { }
}
}

private void radioObenRechts_CheckedChanged(object sender, EventArgs e)
{
// Prüfen, ob beide Player in Ausstellungsstellung
// Falls ja nicht auf den Radio-button reagieren
if (playerAusgangsstellung == false)
{
// Prüfen an welchem Player die Steuerelemente ausgelendet sind
// Das ist dann der kleinere Player und wird entsprechend der Beschreibung des Radio-Buttons verschoben
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(712, 24);
}
else if (axWindowsMediaPlayer2.uiMode != "full")
{
axWindowsMediaPlayer2.Location = new Point(712, 24);
}
else { }
}
}

private void radioUntenLinks_CheckedChanged(object sender, EventArgs e)
{
// Prüfen, ob beide Player in Ausstellungsstellung
// Falls ja nicht auf den Radio-button reagieren
if (playerAusgangsstellung == false)
{
// Prüfen an welchem Player die Steuerelemente ausgelendet sind
// Das ist dann der kleinere Player und wird entsprechend der Beschreibung des Radio-Buttons verschoben
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(0, 425);
}
else if (axWindowsMediaPlayer2.uiMode != "full")
{
axWindowsMediaPlayer2.Location = new Point(0, 425);
}
else { }
}
}

private void radioUntenRechts_CheckedChanged(object sender, EventArgs e)
{
// Prüfen, ob beide Player in Ausstellungsstellung
// Falls ja nicht auf den Radio-button reagieren
if (playerAusgangsstellung == false)
{
// Prüfen an welchem Player die Steuerelemente ausgelendet sind
// Das ist dann der kleinere Player und wird entsprechend der Beschreibung des Radio-Buttons verschoben
if (axWindowsMediaPlayer1.uiMode != "full")
{
axWindowsMediaPlayer1.Location = new Point(712, 425);
}
else if (axWindowsMediaPlayer2.uiMode != "full")
{
axWindowsMediaPlayer2.Location = new Point(712, 425);
}
else { }
}
}
// <!-- Ende Bild in Bild Possitionen --->

private void axWindowsMediaPlayer1_ClickEvent(object sender, AxWMPLib._WMPOCXEvents_ClickEvent e)
{
if (radioAus.Checked)
{
playerAusgangsstellung = true;
keinBildInBild();
}

if (radioObenLinks.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer2.Location = new Point(0, 24);
MediaPlayer1_Klick();
}
if (radioObenRechts.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer2.Location = new Point(712, 24);
MediaPlayer1_Klick();
}
if (radioUntenLinks.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer2.Location = new Point(0, 425);
MediaPlayer1_Klick();
}
if (radioUntenRechts.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer2.Location = new Point(712, 425);
MediaPlayer1_Klick();
}
}

private void axWindowsMediaPlayer2_ClickEvent(object sender, AxWMPLib._WMPOCXEvents_ClickEvent e)
{
if (radioAus.Checked)
{
playerAusgangsstellung = true;
keinBildInBild();
}
if (radioObenLinks.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer1.Location = new Point(0, 24);
MediaPlayer2_Klick();
}
if (radioObenRechts.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer1.Location = new Point(712, 24);
MediaPlayer2_Klick();
}
if (radioUntenLinks.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer1.Location = new Point(0, 425);
MediaPlayer2_Klick();
}
if (radioUntenRechts.Checked)
{
playerAusgangsstellung = false;
axWindowsMediaPlayer1.Location = new Point(712, 425);
MediaPlayer2_Klick();
}
}
// <!-- Ende Bild in Bild Possitionen --->
}
}[/src]
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
Schöne Sache, und auch so weiter der Support.

Ich bin gespannt was du @Cyberfriend noch so aus deinem Tool herausholen kannst. :T
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #28
Wie angekündigt geht es nun an die nächste Version. Diese soll dynamisch sein und nicht mehr auf feste Größen begrenzt sein. Ich schätze mal, dass dies nun um einiges schwerer wird. Zuvor konnte ich mich an festen Werten orientieren und das geht jetzt nicht mehr. Sobald etwas zu dynamisch wird und / oder zu komplex setzt es bei mir ja aus. Da grundlegende Funktionen in der vorherigen Version nun vorhanden sind und es "nur noch" um die Darstellung geht hoffe ich auf nicht mehr all zu viele Hindernisse zu treffen.

Was ich alles vor habe, bzw. ändern möchte sieht man bereits anhand der GUI.
- Player von der Größe her dynamisch zur Fenstergröße
- Anzahl der Player von 2-4 wählbar
- Standardoptionen festlegen

Auch hier geht es nur wieder darum, das es funktioniert. Ob der Code am Ende optimiert, sauber und Profis vor Neid erblassen lassen wird ist völlig nebensächlich.
Ich habe in dieser Build praktisch keinen Code (Außer den Aufruf der Einstellungen und der Versuch die Playergröße zu ändern)

Damit möchte ich auch anfangen. Durch das tableLayoutPanel und der Einstellung "Fill" beim Dock ändern die Player ihre Größe dynamisch zur Fenstergröße Das funktioniert.
Was aber nicht funktioniert ist das ändern der Größe der einzelnen Player. Will ich einen Player kleiner machen blitzt es nur kurz in der jeweiligen Zelle (Player wird also für einen Bruchteil der Sekunde klein, dockt sich dann aber an die gesamte Zelle). Will ich den Player größer machen passiert gar nichts. Es scheint so als wäre der Player in seiner Zelle gefangen.

Davon abgesehen, dass der Player, welcher angeklickt wird das gesamte tableLayoutPanel ausfüllen soll und auch weiterhin dynamisch zum Programmfenster größer oder kleiner werden soll machen feste Größen keinen Sinn. Ich habe aber keine Ahnung, wie ich das nun dynmisch hinbekomme. Mache ich schon im Designer was falsch und ist das tableLayoutPanel für meine Zwecke ungeeignet oder wie muss ich das angehen?

Der zweite Punkt ist, dass ich für nur zwei oder drei Player nicht das Layout mit den vier Playern brauche. Wie kann ich das machen? Ich könnte jetzt die schmutzige Lösung wählen und einfach eine neue Form aufmachen und die Vorherige schließen, aber so schmutzig muss es ja nun auch nicht wieder sein.

Ich hoffe ihr könnt mir in diesen Punkten helfen. Mal sehen, wie weit ich dann anschließend komme.

Projektordner hängt an.
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Ein Control kann sich nicht gleichzeitig größenmäßig an einem Container, hier der Form, orientieren und gleichzeitig Deine Größen annehmen.

Wenn Du das Layoutpanel in Spalten und Zeilen unterteilst, müßtest Du die Größe der Zellen so wählen, daß eine Zelle den gesamten Platz einnimmt. wenn der darin enthaltene Player das Panel ausfüllen soll.

Ich denke, man sollte sich da etwas vom Designer lösen und mehr über geschriebenen Code lösen. Wenn Du da später einen kleinen Player über einen größeren legen möchtest (Bild in Bild), wird das kaum anders gehen.
Du kannst die Size der Controls lesen und setzen. An manchen Stellen wirst Du simpel Prozentrechnung anwende können.
Du kannst das aber in Containern/Panels machen und nicht für jeden Player. Dann legst Du die Player später entsprechend in die Container.

Wahrscheinlich hast Du (noch) kein Wort verstanden. (?)

Kommen wir erst noch zu dem 2 Punkt. Auch hier ist das Stichwort Code.
Man sollte nicht 4 Player per Designer in die Anwendung packen und sich dann überlegen, welche man überhaupt braucht.
Das geht auch per Code.
Das ist gar nicht wild. Das kannst Du Dir in der Designer cs ja angucken, wie das gemacht wird
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #30
OK, verstanden habe ich in der Tat nicht sehr viel. Aber was mir im Grunde schon vorher durch den Kopf ging war, dass die kleineren Player sich über Prozentangaben am vergrößerten Player orientieren sollten, damit sie auch in Abhängigkeit des Programmfensters größer oder kleiner werden. Feste Größen machen keinen Sinn, bestenfalls zum probieren, ob das die grundlegende Funktonion überhaupt funktioniert.

Verstanden habe ich auch, dass sich die Steuerelemente immer an den Panels und Containern orientieren und daraus nicht ausbrechen können. Daher sind sie für dynamische Dinge, wie ich sie jetzt vor habe nicht geeignet.

Im Kern geht es also darum die Player ohne Designer so zu positionieren wie das jetzt der Fall ist. An dem Punkt muss ich leider wirklich passen, da ich nicht den Hauch einer Ahnung habe wie man das macht. (Ich weis nichtmal wie ich ansetzen und wonach ich suchen soll) Bislang wurde alles benötigte einfach in den Designer gezogen und dort so positioniert und festgelegt, wie es gebraucht wurde.

Ich habe mir die Form1.Designer.cs angeguckt. Ich vermute du redest von folgenden Zeilen und die habe nach meinem Verständnis kommentiert. (Das heißt aber nicht, dass ich verstanden habe, wie ich die Elemente eigenmächtig anders anordnen kann)

[src=csharp]
// Erstellt wohl das Media Player-Steuerelement
// Zeile 63-66
this.axWindowsMediaPlayer1 = new AxWMPLib.AxWindowsMediaPlayer();
this.axWindowsMediaPlayer2 = new AxWMPLib.AxWindowsMediaPlayer();
this.axWindowsMediaPlayer3 = new AxWMPLib.AxWindowsMediaPlayer();
this.axWindowsMediaPlayer4 = new AxWMPLib.AxWindowsMediaPlayer();

// Keine Ahnung was das macht
// Zeile 79-82
((System.ComponentModel.ISupportInitialize)(this.axWindowsMediaPlayer1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.axWindowsMediaPlayer2)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.axWindowsMediaPlayer3)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.axWindowsMediaPlayer4)).BeginInit();

// Fügt die Media Player wohl den einzelnen Zellen des tableLayoutPanel1 hinzu
// Zeile 211-222
this.tableLayoutPanel1.Controls.Add(this.axWindowsMediaPlayer1, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.axWindowsMediaPlayer2, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.axWindowsMediaPlayer3, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.axWindowsMediaPlayer4, 1, 1);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 2;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(788, 415);
this.tableLayoutPanel1.TabIndex = 0;

// Eigenschaften der Anordnung der Player
// Zeile 381-420
this.axWindowsMediaPlayer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.axWindowsMediaPlayer1.Enabled = true;
this.axWindowsMediaPlayer1.Location = new System.Drawing.Point(4, 4);
this.axWindowsMediaPlayer1.Name = "axWindowsMediaPlayer1";
this.axWindowsMediaPlayer1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axWindowsMediaPlayer1.OcxState")));
this.axWindowsMediaPlayer1.Size = new System.Drawing.Size(386, 200);
this.axWindowsMediaPlayer1.TabIndex = 0;
this.axWindowsMediaPlayer1.ClickEvent += new AxWMPLib._WMPOCXEvents_ClickEventHandler(this.axWindowsMediaPlayer1_ClickEvent);
//
// axWindowsMediaPlayer2
//
this.axWindowsMediaPlayer2.Dock = System.Windows.Forms.DockStyle.Fill;
this.axWindowsMediaPlayer2.Enabled = true;
this.axWindowsMediaPlayer2.Location = new System.Drawing.Point(397, 4);
this.axWindowsMediaPlayer2.Name = "axWindowsMediaPlayer2";
this.axWindowsMediaPlayer2.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axWindowsMediaPlayer2.OcxState")));
this.axWindowsMediaPlayer2.Size = new System.Drawing.Size(387, 200);
this.axWindowsMediaPlayer2.TabIndex = 1;
this.axWindowsMediaPlayer2.Enter += new System.EventHandler(this.axWindowsMediaPlayer2_Enter);
//
// axWindowsMediaPlayer3
//
this.axWindowsMediaPlayer3.Dock = System.Windows.Forms.DockStyle.Fill;
this.axWindowsMediaPlayer3.Enabled = true;
this.axWindowsMediaPlayer3.Location = new System.Drawing.Point(4, 211);
this.axWindowsMediaPlayer3.Name = "axWindowsMediaPlayer3";
this.axWindowsMediaPlayer3.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axWindowsMediaPlayer3.OcxState")));
this.axWindowsMediaPlayer3.Size = new System.Drawing.Size(386, 200);
this.axWindowsMediaPlayer3.TabIndex = 2;
//
// axWindowsMediaPlayer4
//
this.axWindowsMediaPlayer4.Dock = System.Windows.Forms.DockStyle.Fill;
this.axWindowsMediaPlayer4.Enabled = true;
this.axWindowsMediaPlayer4.Location = new System.Drawing.Point(397, 211);
this.axWindowsMediaPlayer4.Name = "axWindowsMediaPlayer4";
this.axWindowsMediaPlayer4.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axWindowsMediaPlayer4.OcxState")));
this.axWindowsMediaPlayer4.Size = new System.Drawing.Size(387, 200);
this.axWindowsMediaPlayer4.TabIndex = 3;
[/src]

Ich überlege gerade, ob es Sinn macht der Übersicht und Einfachheit halber das Programm wieder auf zwei Player zu reduzieren. Ich glaube die Aufgabe der dynamischen Playergrößen und das "reincoden" ohne den Designer zu benutzen sind erstmal Arbeit genug. Theoretisch dürfte das Hinzufügen von weiteren Playern dann eher weniger schwierig sein, wenn die entsprechenden Basics sitzen.
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Gib mir etwas Zeit und ich lade Dir vielleicht schon heute abend ein kleines Beispiel hoch.

Da sollte drin sein:

a) Dynamisches hinzufügen von Playern
b) Resize von einem großen Player und 4 kleinen in den darüber liegenden Ecken
c) Verschieben eines Players von großer Ansicht zur kleinen in einer Ecke.

Dazu gehen wir vielleicht ein kleines bißchen über die Basics hinaus.



-Wir werden ein Usercontrol estellen mit 5 Panels.
-Wir erstellen im Code Öffentliche Properties für die Panels, damit wir beim Intellisense auf die Panels zugreifen können
- Wir schreiben Code, damit die Panels auf Größenänderungen reagieren
- Wir versuchen die kleinen Panels transparent zu machen, was sie standardmäßig nicht sei können.
-Wir verschieben einen Player während des Abspielens von der Großen Ansicht in eine kleine und zurück.

Ich hoffe, ich habe nichts vergessen. Soweit der Plan.

Danach solltest Du genug Beispielcode haben, um Dein Programm dynamisch zu gestalten. Fragen sind ja dann immer noch erlaubt. ;)

In der Zwischenzeit könntest Du vielleicht mal mit Anchor und Dock rumspielen. Damit steuert man standardmäßig das Verhalten bei Größenänderungen.
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
So. Es sind jetzt 2 Projekte geworden, die minimal von einander abweichen, weil im einen Sachen auskommentiert, bzw im Designer einige Eigenschaften verändert sind, damit man jeweils bestimmt Dinge besser sieht

Das erste soll zeigen, wie man dynamisch die Mediaplayer an die verschiedenen Stellen lädt, das zweite zeigt die Größenveränderungen, prozentual zu dem parent.
Der Code, der das Panel transparent macht, wird möglicherweise ab .Net 4.5 nicht benötigt. Ich habe hier gerade nur 4.0.

Das gilt auch für eine Stelle, die ich markiert habe, wo man bei einem Panel die Transparenz abschalten muß, wenn das Panel leer ist. Da funktioniert die Transparenz beim jeweils letzte Panel aus irgend einem Grund bei mir nicht. Das muß aber nicht überall so sein. Dadurch erscheint beim Umschalten da ein schwarzer Fleck, wo das untere rechte Fenster wäre. Das ignorieren wir hier hier einfach
Man sollte vielleicht Transparenz immer nur anstellen, wenn sie benötigt wird. Aber für das Beispiel ist das hier auch nicht wichtig, also sparen wir uns den Code.

Zum 2. Beispiel muß man wohl nichts sagen.

Mehr schreibe ich jetzt nicht. Einfach anschauen und dann evtl fragen.




Anhang anzeigen codebeispiele für multicam view - gui only.rar
 

Cyperfriend

Der ohne Avatar

Registriert
14 Juli 2013
Beiträge
1.123
  • Thread Starter Thread Starter
  • #33
Danke für die Mühen. Ich werde mir das ganz genau anschauen und versuchen auf mein Projekt zu übertragen.
Bei Multicam View2 passiert aber beim Button-Click gar nichts. Auch wenn ich die roten Punkte anklicke passiert nix.
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Nein. Da geht es nur um das Resize-Thema. Die Farbe ist nur zum Kennzeichnen der 5 Panels.
 
Oben