Einsteiger bittet um Hilfe

madgyver1

Grünschnabel
Edit: Ja der Titel ist sehr aussagekräftig ich weiss - ist mir leider zu spät Ausgefallen und wie ich jetzt sehe kann man das noch nichtmal ändern :( entschuldigt bitte

Seid gegrüßt :),

gleich vorweg ich habe leider recht wenig Zeit und bin dazu noch neu bei VB.net (3 Tage). Ich habe bisher nur C++; C; Java und ASM für 8051derivate, picxx und C167 von Studiumswegen programmiert aber alles halt auf uC ausgelgt und habe daher von der Windowsprogrammierung nicht so die Ahnung.

Zum Vorhaben:

Die Anwendung besteht im Wesentlichen aus einem Form mit TreeView und Panel. Im TreeView befindet sich eine Auflistung neben der bei einem MouseHover Event eine Bildvorschau angezeigt werden soll (Also beim Hover erscheint das Bild neben dem Cursor).
Wenn der Benutzer dann auf den TreeNode klickt soll er Ihn per DragDrop in das Panel ziehen können. Dabei soll die Vorschau verschwinden sobald entweder der TreeNode angeklickt oder der Mauszeiger den Node verlassen würde. Sobald der DragEnter Event im Panel eintritt soll wieder ein Bild angezeigt werden das der Nutzer dann verschieben kann.

Zu den Problemen bisher:

Fängt schon ganz vorn an. Ich habe versucht in einem TreeView1.NodeMouseHover Event das Anzeigen der Vorschau zu realisieren. Aber erstens Verschwindet das Bild nicht mehr wenn ich den Node Verlasse (warum ist mir klar - weil ich kein Event dafür habe - aber wie löse ich das? ich habe ja kein TreeView1.NodeLostFocus oder etwas in der Art) und zweitens fehlt mir die genaue Cursorposition am Besten mit dem TreeView als Origin - im moment ist die Position für das Bild von der Position des Fensters abhängig was nat. Blödsinn ist - zumindest für meine Anwendung.

Ich habe im Code unten auch versucht die Cursor Kordinaten mit Me.TreeView1.Cursor.Position.X zu ermitteln aber dann kommt der Fehler: "Zugriff des freigegebenen Members, konstanten Members, Enumerationsmembers oder geschachtelten Typs über eine Instanz; der qualifizierende Ausdruck wird nicht ausgewertet." Kann das mal einer Erklären bitte - nur zum besseren Verständnis?

Code:
Private Sub PreviewNodePics_OnHover(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseHoverEventArgs) Handles TreeView1.NodeMouseHover

        Dim sX As Integer = RectangleToClient(New Rectangle(Windows.Forms.Cursor.Position.X, Windows.Forms.Cursor.Position.Y, 1, 1)).Left
        Dim sY As Integer = RectangleToClient(New Rectangle(Windows.Forms.Cursor.Position.X, Windows.Forms.Cursor.Position.Y, 1, 1)).Top

        Select Case e.Node.Text

            Case "AND"

                'SystemHelpVar(0) = True
                PictureBox1.ImageLocation = "sowieso"
                PictureBox1.Top = Control.MousePosition.Y - TreeView1.Top : PictureBox1.Left = Control.MousePosition.X - TreeView1.Left + 50
                PictureBox1.Visible = True

            Case usw....


            Case Else
                PictureBox1.Visible = False

        End Select
    End Sub

Ich werde wohl noch weitere Fragen zu dem Projekt stellen. Ich möchte keinen kompletten Code aber ein Fingerzeig wie und wo ich die Lösung umsetze/finde wär mir schon Hilfe genug.

(aber bitte nicht als www[dot]hier-gibts-n-prima-e-book-mit-3000-seiten-da-findest-du-was-du-suchst[dot]de oder :google: das hatte ich schon, hilft mir nicht - und ich Denke ich bemühe mich ja auch selber Antworten zu finden.)
 
Zuletzt bearbeitet:
Hallo,

hier ist ein Beispiel für eine eigene Implementierung eines ToolTips (Text, Bild usw.). In meinem Beispiel mach ich das mit 2 Buttons. Das gleiche funktioniert auch bestimmt mit entsprechenden Nodes aus deinem TreeView.

C#:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace CustomToolTip
{
    public class CustomToolTip
    {
        public CustomToolTip()
        {
            controls = new Dictionary<Control, CustomToolTipInfo>();

        }
        IDictionary<Control, CustomToolTipInfo> controls;

        public void Add(Control aControl, CustomToolTipInfo aTipInfo)
        {
            aControl.MouseEnter += new EventHandler(aControl_MouseEnter); 
            aControl.MouseLeave += new EventHandler(aControl_MouseLeave);
            controls.Add(aControl, aTipInfo);
        }

        

        void aControl_MouseEnter(object sender, EventArgs e)
        {
            if (sender is Button)
            {
                Point p = new Point(Control.MousePosition.X,Control.MousePosition.Y);
                
                CustomTipWindow.ShowToolTip(controls[sender as Control], p);
            }
        }

        

        void aControl_MouseLeave(object sender, EventArgs e)
        {
            CustomTipWindow.HideWindow();
        }



    }

    public class CustomToolTipInfo
    {
        public CustomToolTipInfo(string aText, Image anIcon)
        {
            text = aText;
            icon = anIcon;
        }
        string text;

        public string Text
        {
            get { return text; }
            set { text = value; }
        }

        Image icon;

        public Image Icon
        {
            get { return icon; }
            set { icon = value; }
        }
    }
}
hier das Fenster, das angezeigt wird, wenn ein MouseEnter Ereignis auf den registrierten Elementen auftritt.
C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace CustomToolTip
{
    public partial class CustomToolTipWindow : Form
    {
        public CustomToolTipWindow()
        {
            InitializeComponent();
        }

        static CustomToolTipWindow window;
        static bool showed;
        public static CustomToolTipWindow GetInstance()
        {
            if (null == window)
            {
                window = new CustomToolTipWindow();
            }
            return window;
        }

        public static void HideWindow()
        {
            if (window != null)
            {
                window.Hide();
                showed = false;
            }
        }

        public static void ShowToolTip(CustomToolTipInfo customTipInfo, Point aPoint)
        {
            CustomToolTipWindow w = GetInstance();
            w.label1.Text = customTipInfo.Text;
            w.pictureBox1.Image = customTipInfo.Icon;
            w.Left = aPoint.X;
            w.Top = aPoint.Y;
            if (!showed)
            {
                w.Show();
                showed = true;
            }
        }
    }
}

C#:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;

namespace CustomToolTip
{
    static class Program
    {
        
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form = new Form1();
            CustomToolTip tip = new CustomToolTip();
            CustomToolTipInfo info = new CustomToolTipInfo("Hello Bubu!",Image.FromFile(@"c:\icon.png"));
            CustomToolTipInfo secondInfo = new CustomToolTipInfo("Example", Image.FromFile(@"c:\icon2.png"));
            tip.Add(form.button1, info);
            tip.Add(form.button2, secondInfo);
            Application.Run(form);
        }
    }
}

Gruß Konstantin
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück