Visual C# - Beim Rechtsklick auf einer TabPage/TabControl Contextmenü öffnen
lima-city → Forum → Programmiersprachen → Programmieren mit .NET & Mono
abruf
ansatz
anwendung
aufbau
basic
befehl
button
context
edition
express
funktion
handle
koordinate
oberkante
reiter
right
sen
sender
show
window
-
Hi.
Folgendes:
Wenn ich auf einem TabControl in der Anwendung mit Rechts klicke, geht ein Contextmenü auf. Jedoch fühlt sich beim draufklicken die TabPage angesprochen.
Ich habe demnach ein Event dort abgefangen.
Durch den Rechtsklick sollen Funktionen dargestellt wie "Schließen, Andere Schließen, Alle Schließen u.s.w.". Es ist also so eine Leiste wie die TabPages in Browsern.
Über die TabPage (also beim Rechtsklicken den Registrierkarten) kann ich aber irgendwie nicht abfragen, welche Registrierkarte ich genau geklickt habe. Selbst über ein paar Child-oder Member-Funktionen bekam ich das nicht raus.
Wenn ich das Event versuchen würde, über jeden einzelnen TabControl (bei Visual C# 2005 heißt die Eigenschaft z.B. "ToolStrip1 auf TapPage1") seperat zu ziehen, readgiert der Klickbereich nicht mehr, sondern das Contextmenü erscheint auf der Fläche des TabControls.
Weiß jemand eine Lösung auf dieses Problem?
PS: Ich benutze Visual C#2005 Express Edition. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Leider hat noch keiner geschrieben?
Hmmm...
vielleicht eine Idee meinerseits, allerdings weiß ich auch nicht, wie man darauf zugreifen kann:
Wenn man über ein TabControl (also sprich einen Reiter) geht, entsteht ein Hovereffekt. Bei mir wird in diesem Fall die Oberkante des Reiters gelb eingefärbt.
Es ist weder ein MouseOver- noch MouseHover-Event der TabPage oder des TabControls. Beide lassen sich auch nicht direkt abfragen. Das MouseOver bei der TabPage bezieht sich wieder auf den gesamten Reiterbereich und das MouseOver des TabControls löst das Event erst im Inhaltsbereich aus.
Wenn jetzt jemand wüßte, wie man ein Event über den HoverEffekt auslösen könnte, würde dies vielleicht auch schon die Lösung bringen.
PS: Nur zur Hilfe:
Form.EnableVisualStyles = true,
OS = WinXP SP2,
Net-FrameWork 2,
Installierte SDKs in VC#2005 Express Edition: PSDK, DirectX9 SDK, XNA
-
Hi,
da du mit Visual Studio 2005 arbeitest, ist die Sprache egal (Visual Basic, C++, ...), der Aufbau ist gleich.
Zum TabControl:
Wenn du für dem TabControl dein "richtiges" ContextMenuStrip zuweist und den einzelnen TabPages ein leeres ContextMenuStrip, dann wird dieses Menü nur in den TabPage-köpfen angezeigt. Allerdings hast du dann das Problem, dass man nicht sofort abrufen kann, über welcher TabPage das Menü aufgerufen wurde.
Ein Ansatz wäre es, die Mausposition zu ermitteln und zu überprüfen, welche TabPage-Köpfe sich dort befinden. Dazu müsstest du die Positionen vorher speichern.
Du kannst auch das MouseClick-Ereignis in dem TabControl verwenden und damit die Mausposition abrufen und das Context-Menü über Code einblenden lassen.
Auszug von VB:
Private Sub TabControl1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TabControl1.MouseClick
If e.Button = Windows.Forms.MouseButtons.Right Then
MsgBox(e.X & " " & e.Y)
End If
End Sub -
Da hast du aufjedenfall ne gute Idee mit den leeren Boxen.
Den Code von dir kann ich gerade ins C# gut ausm Kopf übersetzen:
Private void TabControl1_MouseClick(onject sender, System.Windows.Forms.MouseEventArgs e) { If (e.Button == Windows.Forms.MouseButtons.Right) { MessageBox.Show(e.X + " " + e.Y); } }
Letztendlich ist es ein Event-Aufruf, sowie ich es auch versucht habe.
Nur wie ich ja schon sagte, ist in C# dann das Problem, das es nur auf der Oberfläche geht, und nicht im Reiter.
Ich hatte es so geplant nach folgendem Aufruf:
Private void TabPage1_MouseClick(onject sender, System.Windows.Forms.MouseEventArgs e) { If (e.Button == Windows.Forms.MouseButtons.Right) { MessageBox.Show(e.X + " " + e.Y); } }
e.X und e.Y wären hierbei die Koordinate auf den Reitern.
Ich hatte einen Befehl mal, der in etwa GetChildAtPoint (oder ...Position - habs gerade nicht im Kopf) ausgab. Doch ich bekam dort immer einen NULL (Nothing in VB)-Wert oder sogar eine Exception.
Ich versuch mal mehr über GetChildAtPoint-Methode rauszufinden. Vielleicht hilft das ja. -
Schau mal dieses Beispiel an:
http://www.codeproject.com/cs/miscctrl/draggabletabcontrol.asp
Hier wird gezeigt, wie TabPages verschoben werden können über Drag&Drog, was du zwar nicht brauchst, aber es ist eine Abfrage eingebaut, ob der Benutzer den TabPage-Kopf angeklickt hat oder nicht. -
Das ist genau das, was ich gesucht habe. Aber selbbst das mit dem Drag&Drop hört sich sehr interessant an.
Werds mir mal genauer unter die Augen nehmen.
Dank dir vielmals :thumbb: -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage