Picturebox entseht an falscher Stelle

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von lustlosz.

    Picturebox entseht an falscher Stelle

    Hallo alle zusammen,
    alos mein problem ist folgendes das ich bei einem linksklick mit der maus eine picturebox erstellt haben will
    das funktioniert einigermasen nur die Picturebox wird nihct an der mausposition erstellt sondern in der linken oberen ecke der aktiven Form:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. mausposi = Cursor.Position.ToString
    3. End Sub
    4. Sub einfügen()
    5. Me.Text = "test"
    6. Dim Picturebox1 As New PictureBox
    7. Picturebox1.Image = My.Resources.bild1
    8. Picturebox1.Location = New Point(mausposi)
    9. Picturebox1.Size = New Size(10, 10)
    10. Picturebox1.Visible = True
    11. Picturebox1.Enabled = True
    12. Me.Controls.Add(Picturebox1)
    13. End Sub

    der Timer ist auf interval 1 gestellt
    ich hoffe auf eure Hilfe.
    mit freundlichen Grüssen Lustlosz ;)
    Der Timer is quatsch.
    Bei Linksclick auf was genau soll denn eine Picturebox erstellt werden?
    Auf die Form ?
    Auf ein Panel ?

    (Fast?) Jedes grafisch darstellbares Control hat ein OnClick oder OnMouseDown event.
    In diesem sind MouseEventArgs enthalten, welche wiederum informationen über die Location der Maus und der gedrückten Taste enthalten sind.

    Ciao Mono
    Das ist meine Signatur und sie wird wunderbar sein!
    Hi,

    ich habe den Code so wie er ist kopiert. Das einzige was an deinem Problem schuld sein kann ist, dass der Timer nicht auf Enabled=True steht. Desweiteren solltest du aber das ganze Konstrukt nocheinmal überarbeiten. Der Timer kann eigentlich raus, du solltest das MouseClick Ereignis des Formulars nehmen und von dort aus die Einfügen Prozedur aufrufen. Das Ereignis gibt dir aus dem EventArgs Parameter die genaue Position an der geklickt wurde.

    Des Weiteren musst du die Position der PictureBox vermutlich etwas anders berechnen, je nachdem was du vorhast. Denn die PictureBox wird nicht mittig an der ClickPosition erstellt. In diesem Fall befindet sich die linke obere Ecke der PictureBox an dem Punkt an dem geklickt wurde. Ich hoffe du verstehts was ich meine.

    Falls ich mit irgendwas falsch liege berichtigt mich bitte. Hoffe ich konnte dir etwas helfen.

    Lg, Atrion.
    Du liest die Mauskoordinaten in Screen-Koordinaten aus.
    Mach das doch bitte im MouseDown-Event, dort bekommst Du die MouseKoordinaten im aktuellen System.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es funktioniert alles Danke schön nur das er die Mausposition anscheinen faslch berechnet...
    aber erstmal danke für eure hilfe :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „lustlosz“ ()

    Wie falsch ist denn die Mausposition?
    Schieb mal Dein Fenster genau in die linke obere Ecke und mal weit weg von links oben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hier wird nichts berechnet. Du weist hier

    VB.NET-Quellcode

    1. mausposi = Cursor.Position.ToString

    einer offensichtlich nicht deklarierten Variable einen STRING zu (lass ihn dir mal anzeigen),
    und daraus versuchst du hier

    VB.NET-Quellcode

    1. Picturebox1.Location = New Point(mausposi)
    wieder eine Location zu machen.
    Location ist ein POINT, und kann mit STRING nix anfangen. Warum machst du oben alles mit .ToString zunichte?
    habs jetzt anders zwar immernoch als strings und immer noch falsch berechnet:

    VB.NET-Quellcode

    1. mausposi = Cursor.Position.X
    2. mausposi2 = Cursor.Position.Y

    VB.NET-Quellcode

    1. Picturebox1.Location = New Point(x:=mausposi, y:=mausposi2)

    und deklaration

    VB.NET-Quellcode

    1. Dim mausposi As String
    2. Dim mausposi2 As String

    kann location etwas mit integer anfangen?

    lustlosz schrieb:

    kann location etwas mit integer anfangen?

    Wie schon oben erwähnt: Location ist ein POINT. Die Zuweisung an ein Point-Objekt ist kein Integer, oder String, oder Grasbüschel, sondern ein Point!
    In deinem Beispiel solltest du Mausposi und mausposi2 als integer definieren. Mit den beiden Integern erzeugst du im zweiten Codeblock... ein neues Point-Objekt.

    Abgesehen von deinen Versuchen:
    Was hältst du von folgendem Code:

    VB.NET-Quellcode

    1. Private Sub Form1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    2. PictureBox1.Location = e.Location
    3. End Sub


    PS: Bitte hör auf die Kollegen, und verschrotte den Timer.
    @Der Kurt:
    Deine Methode funktioniert aber leider nicht richtig. Wenn man die Maus nach rechts unten bewegt (also die maus über die Picturebox geht) verscheibt sich die box nicht mehr. Erst, wenn man von der box runter ist springt auch die box wieder zur Mausposition.
    Das ist richtig. Wenn man mit dem Mauszeiger auf der Picturebox ist, wird logischerweise kein Mousemove-Event auf der Form ausgelöst.
    Dann muss man u.Umständen auch auf Events der Picturebox zurückgreifen. Oder man zeichnet gleich mal die Grafik, ohne dass man eine Picturebox verwendet.

    Ich entschuldige mich dafür, sollte mein Code den Anschein einer fertigen Lösung gemacht haben.
    Das ist nicht so.
    Mein Anliegen war: Kein Timer, wenn er nicht notwendig ist
    Also ich habe jetzt etwas rumprobiert und die Mauspositionen als integer deklariert doch ich hab herausgefunden ums so grösser die form ist ums so genauer ist die Mausposition berechnet. also auf vollbild ist die Picturebox nur um eine Mauslänge nach unten verschoben. kann mir jemand helfen?
    lg Lustlosz
    Hier:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim mausposi As Integer
    3. Dim mausposi2 As Integer
    4. Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
    5. Select Case MouseButtons.Left
    6. Case MouseButtons.Left
    7. Dim Picturebox1 As New PictureBox
    8. Picturebox1.Image = My.Resources.bild1
    9. Picturebox1.Location = New Point(x:=mausposi, y:=mausposi2)
    10. Picturebox1.Size = New Size(10, 10)
    11. Picturebox1.Visible = True
    12. Picturebox1.Enabled = True
    13. Me.Controls.Add(Picturebox1)
    14. End Select
    15. End Sub
    16. Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    17. mausposi = Cursor.Position.X
    18. mausposi2 = Cursor.Position.Y
    19. End Sub
    20. End Class

    RodFromGermany schrieb:

    Mach das doch bitte im MouseDown-Event, dort bekommst Du die MouseKoordinaten im aktuellen System.

    VB.NET-Quellcode

    1. Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    2. mausposi = e.X
    3. mausposi2 = e.Y
    4. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe den Code nochmal kopiert und ausprobiert, 2 Sachen:

    1. Falls es keinen bestimmten Grund hat, würde ich die 2 Integer Variablen: mausposi & mausposi2 durch eine Point-Variable ersetzen. Klappt natürlich so auch aber denke dass macht das ganze etwas schöner:

    VB.NET-Quellcode

    1. Dim MausPosi As Point
    2. Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
    3. ...
    4. Picturebox1.Location = MausPosi
    5. ...
    6. End Sub
    7. Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    8. MausPosi = e.Location
    9. End Sub


    2. Ich verstehe nicht ganz genau was du damit meinst, dass die Berechnung der Mausposition nicht stimmt. Bei mir wird die linke obere Ecke der PictureBox genau an die Position des Cursors platziert. Falls du möchtest, dass die Mitte der PictureBox an der Cursor Position ist, musst du das mithilfe der Breite und Höhe der PictureBox berechnen.

    Atrion
    warum eigentlich so umständlich?

    VB.NET-Quellcode

    1. Private Sub tabTwo_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles tabTwo.MouseClick
    2. Dim pb As New PictureBox
    3. With pb
    4. .Size = New Size(100, 100)
    5. .BackColor = Color.Chocolate
    6. .Location = Me.tabTwo.PointToClient(MousePosition)
    7. End With
    8. Me.tabTwo.Controls.Add(pb)
    9. End Sub

    tabTwo halt mit dem ersetzen, wo du Deine Picturebox hin han willst ;)