Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Ich wollte unter meinen Textbox einen Fenster mit ShowDialog aufpopen lassen. Das Problem ist, wie kriege ich die Globale Position des Textboxes auf heraus. den Txt.Location gibt nur die Relative Position zu dem Parent Element.
Wie kriege ich den die Globale Position des Textboxes heraus?
kennt sich da jemand aus?
Die "Globale" Position der textbox kannse durch die position des fensters ermitteln
Die findest einfach die Fensterposition und rechnest die Position der Textbox dazu dann hasses.
hmm die Werte von PointToScreen sind aber auch nicht wirklich überzeugend.
Wenn ich über Mouseposition die Positions des Textboxes ermittle, komme ich auf die andere Werte als die von PointToScreen.
Code:
Point p = PointToScreen(Txt.Location);
newForm.Location = p;
ps: Wenn ich sogar
Code:
Txt.PointToScreen(Txt.Location)
mache komme ich ja viel weiter von meinen Elementen ab als ohne den Txt.P... zu machen
PS: so ich habe das jetzt korregieren können! Da kommt man irgendwie nicht ohne herumzufummeln durch das ganze durch.
Code:
zc = new WinForm();
Point PFDF = Txt.PointToScreen(Txt.Location);
Point p = new Point (PFDF.X - zc.Size.Width - PLZ.Size.Width, PFDF.Y - zc.Size.Height + (int)(PLZ.Size.Height*4));
zc.Location = p;
Die kurze beschreibung:
Also wir berechnen erst den Punkt am Bildschirm. Dieser Wert wird irgendwie nicht korrekt dargestellt, deswegen muss man mit der Korrektur durchgreifen. Diese wäre: für die X Position muss man auf jeden Fall die Länge des neuen Fenster substrahieren. Zusätzlich muss noch eine Korrektur des Textboxes selbst berechnen.
Für Y erfolgt die gleiche Korrektur. Bei der Höhe muss man aber das 4-fache der Höhe des Textboxes nehmen.
Fragt mich nicht wieso es so ist aber es funktioniert für jede Auflösung und sowie auf XP als auch in Vista.
Irgendwas musst du falsch machen, bei mir funktionierts auch ohne rumgerechne.
Hab mal ne Form mit nem Button und ner Textbox gemacht, im Button Click EventHandler hab ich das stehen:
Code:
private void button1_Click(object sender, EventArgs e)
{
Form popup = new Form();
popup.StartPosition = FormStartPosition.Manual;
popup.Location = PointToScreen(textBox1.Location);
popup.ShowDialog();
}
Es funktioniert.
Du musst halt beachten, dass Location immer die linke obere Ecke der Form oder Der Textbox angibt.
Edit:
Nochmal zur Veranschaulichung:
Wenn ich jetzt will, dass die Form nicht die Textbox überlappt, sondern genau rechts von der Textbox aufpoppt, dann müsste ich ein Offset einfügen:
Code:
private void button1_Click(object sender, EventArgs e)
{
Form popup = new Form();
Point point = textBox1.Location;
point.Offset(textBox1.Width, 0);
popup.StartPosition = FormStartPosition.Manual;
popup.Location = PointToScreen(point);
popup.ShowDialog();
}
Wie gesagt, bei mir funktioniert das perfekt, probiers doch aus, mach einfach ne neue Windows Forms Anwendung und copy&paste meinen Code.
Poste doch mal ein bisschen mehr Code, am besten von der Stelle an, wo die die "Popup" Form instanzierst, bis dahin wo du sie mit ShowDialog() anzeigst, vllt. hast du ja irgendwo nen Fehler.
Irgendwie kann ich dem ganzen nicht folgen:
Grantig verwendet eine Form, während roker eine WinForm verwendet. Für mich sind das 2 unterschiedliche Klassen. Form kenne ich ja, aber WinForm? Ist das eine neue Klasse der WPF? Klärt mich bitte mal auf...
Edit: Wie ist die Form.StartPosition Eigenschaft eingestellt?
Roker: Etwas abseits aber u.U. auch recht informativ wäre ob du jetzt das .Net Framework (inkl. Version) auf einem Windowsclient oder stattdessen Mono unter Linux betreibst. Ist zwar nur so eine Idee...
Merkwürdig ist es schon das die Lösung von Grantig nicht so recht bei dir funktionieren will, zumal ich selbst diese Methode in verschiedenen Projekten angewendet habe und bisher noch keine Probleme damit hatte. (das war jeweils Windows + .Net 2.0).
Ebenso kommt mir in den Sinn, dass deine Textbox nicht direkt auf der Form liegt, sondern entweder in einem UserControl ist oder auf einem anderen Containercontrol liegt. Beschreibe mal den Aufbau der Form oder poste mal die InitializeComponent() Methode der Form (die kann recht groß sein, wenn viele Controls und Componenten in der Form sind).
Verwendest du das TableLayoutPanel?
Wie Grantig schon schrieb, alles in allem mehr Infos nötig ...
Das Problem ist ganz simpel der Bezugspunkt.
Du hast zwei Möglichkeiten die Bildschirmkoordinaten der linken oberen Ecke eines Controls herauszufinden:
1.) Point p = Control.PointToScreen(new Point(0,0));
2.) Point p = Control.Parent.PointToScreen(Control.Location);
Location gibt dir ja die Position des Controls innerhalb des übergeordneten (Parent) Controls zurück und PointToScreen rechnet eine Koordinate innerhalb des Controls an dem es aufgerufen wird in Bildschirmkoordinaten um. Daher entweder der Aufruf am Control selber mit Koordinaten 0,0 (obere linke Ecke) oder am Parentcontrol mit der Location-Property.
habe auch auf dem Testrechner mit XP ausprobiert, was mir die gleiche ergebnisse liefern wie auf meinen vista.
winform ist nur eine klassenname nicht das geerbte element. Es ist von einen FORM geerbt. und ja es ist C#
StartPosition ist auf Manuell gestellt.
@Benston
Ja die 1.) hats geholfen. Ich habe irgendwie schon geahnt worauf es hinausgeht. Das ding ist, ich habe 2 Dialogfenster mit ShowDialog. Das erste ruft den 2ten auf. Deswegen sind meine PointToScreen Koordinaten immer auf das übergeordnetes Dialogfenster bezogen und nicht auf das aller erster fenster was den ersten ShowDialog macht. Irgendwie verwirrend aber es macht sinn.
2 ineinander gebundene Dialogfenster sind schon was anderes als nur einer.... keine ahnung wieso.