Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > ToolTip на элемент ListBox. Как?


Автор: Wanderer2019 24.1.2006, 16:09
Всем привет!
Подскажите. Возможно ли реализовать такое (Subj).
Т.е. хотелось бы так: по наведению на определенную запись ListBox`а появляется ToolTip с информацие именно для этой записи.
У ToolTip`а есть такой метод: SetToolTip (Control,string)
а вот можно ли настроить свой ToolTip для каждого объекта ListBox`а???
Кто мож делал такое или есть какие нить мысли?

Автор: Wanderer2019 24.1.2006, 16:35
Тему можна закрыть. Решение нашел.

Автор: arilou 24.1.2006, 16:38
Цитата(Wanderer2019 @ 24.1.2006, 16:35 Найти цитируемый пост)

Тему можна закрыть. Решение нашел

А поделиться со всеми? smile

Автор: Exception 24.1.2006, 19:57

Автор: Wanderer2019 24.1.2006, 21:06
Решение заключается в обыкновенном создании класса наследника класса ListBox и использовании нескольких API функций.
Код

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;


public class ToolTipListBox : System.Windows.Forms.ListBox
{
    [StructLayout(LayoutKind.Sequential)]
    public struct SIZE
    {
        public int cx;
        public int cy;
    }
    [DllImport("gdi32.dll")]
    public static extern int GetTextExtentPoint32(IntPtr hdc, 
        String str, int len, ref SIZE size);

    [DllImport("user32.dll")]
    public static extern IntPtr GetDC(IntPtr hWnd);

    [DllImport("user32.dll")]
    public static extern int ReleaseDC(IntPtr hWnd,IntPtr hdc);

    private ToolTip tp = new ToolTip();
    private int LastIndex = -1;

    public ToolTipListBox()
    {           
        tp.InitialDelay = 500;
        tp.ReshowDelay = 500;
        tp.AutoPopDelay = 3000;         
        tp.Active = true;           
    }   


    protected override void OnMouseMove(
        System.Windows.Forms.MouseEventArgs e)
    {               
        /* Получаем индекс элемента на котором находится курсор */
        int index = IndexFromPoint(e.X,e.Y);

        if(index != ListBox.NoMatches )
        {               
            if( LastIndex != index )
            {
                string s = Items[index].ToString(); 

                IntPtr hdc = GetDC(this.Handle);
                SIZE size;
                size.cx = 0;
                size.cy = 0;
                GetTextExtentPoint32(hdc,s,s.Length,ref size);
                ReleaseDC(this.Handle,hdc);

                /* показываем ToolTip только в том случае если содержимое элемента выходит за рамки listBox`а */
                if(this.Width < size.cx)                    
                    tp.SetToolTip(this,s);

                LastIndex = index;              
            }                           
        }
    }

}

Автор: Exception 24.1.2006, 22:29
Суньте в FAQ. +1

Автор: arilou 25.1.2006, 18:03
http://vingrad.ru/NET-FAQ-003002

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)