Klick auf HitBox ermitteln

  • Allgemein

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Gather.

    Klick auf HitBox ermitteln

    Hallo liebe Community,

    Ich will dass, mein Control erkennt wenn man auf eine zuerst gemalte hitbox klickt (X) und dann das gerade geöffnete Tab schließt.
    Mein Code:

    VB.NET-Quellcode

    1. Imports System.Collections.Generic
    2. Imports System.Text
    3. Imports System.Windows.Forms
    4. Imports System.Drawing
    5. Imports System.Diagnostics
    6. Imports System.Runtime.InteropServices
    7. Imports System.ComponentModel
    8. Namespace tabControlSample
    9. Public Class TabControlEx
    10. Inherits TabControl
    11. Public Sub New()
    12. DrawCloseButton()
    13. AddHandler Me.MouseDown, New MouseEventHandler(AddressOf TabControlEX.mousedown)
    14. End Sub
    15. Private Sub TC_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
    16. If e.Button = System.Windows.Forms.MouseButtons.Left Then
    17. MsgBox("Left click")
    18. If New Rectangle(e.Location, New Size(1, 1)).IntersectsWith(closeButtonHitbox) Then
    19. MsgBox("intersects")
    20. RaiseEvent CloseButtonClicked()
    21. End If
    22. End If
    23. End Sub
    24. Public Sub DrawCloseButton()
    25. Dim g As Graphics = Me.CreateGraphics()
    26. g.DrawImage(My.Resources._1344600839_close, New Point(Me.Size.Width - 20, 2))
    27. closeButtonHitbox = New Rectangle(New Point(Size.Width - 20, 2), New Size(16, 16))
    28. End Sub
    29. Private closeButtonHitbox As Rectangle
    30. Public Delegate Sub CloseButton()
    31. Public Event CloseButtonClicked As CloseButton
    32. Protected Overrides Sub OnResize(e As EventArgs)
    33. DrawCloseButton()
    34. MyBase.OnResize(e)
    35. End Sub

    Das Problem ist jetzt, er erkennt, dass ein linksklcik gemacht worden ist , ABER NUR (!) wenn man auf das TabControl klick und nicht auf das X.
    Das Folgende bild veranschaulicht das ganze nochmal.
    Die Kreise sollen MAUSKLICKS (Linksklicks) Darstellen.



    Die logische erklärung ist, dass er einen normal klick (wenn kein Tab davor ist) nicht erkennen kann, da dieser NICHT auf dem TabControl stattfindet.
    d.h theoretisch müsste ich nur das Form_MouseDown Event umschreiben. Doch ich denke das wäre unschön und würde auch nicht funktionieren (abgesehen davon weiß ich nicht wie ich das überschreiben kann :D)

    Könntet ihr mir weiterhelfen?
    Bitte um Hilfe,
    Danke im Vorraus.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    So als Tipp: Du solltest auf CreateGraphics() verzichten und nur im Paint-Event malen. Aber mal ganz blöd: Warum nicht einfach eine kleine PictureBox mit dem Bild über das TabControl und dann deren Click-Event nutzen?

    Viele Grüße, Phil.
    Die Rectangle-Klasse hat eine Funktion .Contains(Point), mit der man ermitteln kann, ob sich ein Punkt in dem Rectangle befindet.
    & Wie gesagt CreateGraphics() ist crap.

    Ansatz:

    VB.NET-Quellcode

    1. Private CloseRect As Rectangle = ComputeCloseRect()
    2. Sub Onpaint(..)
    3. DrawImage(..)
    4. End Sub
    5. Sub MouseClick(e)
    6. if CloseRect.Contains(e.Location) then
    7. Me.SelectedTab.Close() '?
    8. End if
    9. End Sub
    10. Function ComputeCloseRect() as Rectangle
    11. Return Foo * Bar
    12. End Function
    /nicht getestet

    YaPh1l schrieb:

    So als Tipp: Du solltest auf CreateGraphics() verzichten und nur im Paint-Event malen. Aber mal ganz blöd: Warum nicht einfach eine kleine PictureBox mit dem Bild über das TabControl und dann deren Click-Event nutzen?

    Viele Grüße, Phil.
    Warum? Weil ich das ganze als control erstelle und für andere bereitstellen will. Siehe showroom> TabControl++

    @rother
    Soweit bin ich ja chon gekommen, das problem ist ja (wie die bilder oben zeigen) dass ich an die stelle wo sich das kreuz findet keinen linksklick machen der unter das tabcontrol_mousedown event fällt.
    D.h ich müsste in der .dll das form_mousedown event überschreiben. Doch wie mache ich das?
    Oder wisst ihr eine bessere idee?
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Gather schrieb:

    Warum? Weil ich das ganze als control erstelle und für andere bereitstellen will.

    magst dus nicht lieber OpenSource bereitstellen?
    Weil bei ClosedSource ist man auf Gedeih und Verderb daran ausgeliefert, dass das Control 100% bugfrei ist.
    Hingegen bei Opensource kann man Bugs identifizieren, und der Autor kanns fixen, oder man fixts eben selber.
    Bei ClosedSource kann jeder Fehler, der in der Anwendung auftritt, in irgendeinem Zusammenhang mit dem eingebundenen Teil stehen, und man weiß nie: "isses mein Fehler, oder eine der Läuse, die ich mir inn Pelz gesetzt hab?"

    Ich jdfs. verwende nur ClosedSource aus absolut renommierter Quelle. Das heißt Microsoft, und neuerdings bin ich zu einer Ausnahme gezwungen, weil man zu Wpf eben ein kleines Toolkit braucht.
    Aber wie gesagt: Dessen Quelle ist sehr rennomiert, und das Teil ist in glaub zigtausendfacher Benutzung - also wenn da ein Bug reportet wurde, isser gesprungen, der Author, um fix zu fixen.

    Unter keinen Umständen würde ich eine Closed-Source-Dll iwo einbauen, die nicht mindestens 1000fach in mehrjährigem Betrieb ist.
    Trotz deiner recht schönen und eigentlich auch überzeugenden Ansprache lasse ich mein Control VORERST auf Closed Source.

    Wäre aber trotz allem nett wenn mir jmd. helfen würde dieses Problem zu fixxen.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!