Изменение или скрытие всплывающей подсказки формы

2

У нас есть форма MDI, которая содержит некоторое количество дочерних форм, которые имеют разные титры, показывающие текущее загруженное имя файла документа. Когда дочерние формы максимизируются, текст заголовка помещается в строку заголовка родительского окна, что часто приводит к тому, что текст слишком длинный, чтобы поместиться в панели, а Windows достаточно хороша, чтобы добавить эллипсы и усечь текст.

Однако, когда вы наводите курсор на строку заголовка главного окна, она показывает всплывающую подсказку с тем, что должно быть всей строкой, но вместо этого всплывающая подсказка часто содержит небольшую часть строки. Например, если основной текст формы был:

Program1 - Filename:[Really_long_filename_that_doesnt_fit.file]

В подсказке будет отображаться следующее:

Program1 - Filename:[Really_long_filename_t

Edit: он всегда обрезает всплывающую подсказку ровно на 100 символов, что заставляет меня поверить, что это где-то верхний предел.

Есть ли способ изменить это, чтобы отобразить всю строку, или, если нет, полностью отключить всплывающую подсказку?

Любой язык допустим, хотя мы делаем это на С#.

  • 0
    Что именно ты над ним завис? Это запись панели задач или самая верхняя панель родительской формы mdi?
  • 0
    Строка заголовка родительской формы MDI. Вы можете повторить поведение, изменив размер любой формы, чтобы текст заголовка был обрезан. Затем наведите курсор на строку заголовка. Это кажется незначительным, но клиент заметил это, и теперь это проблема: P
Показать ещё 16 комментариев
Теги:
winapi
tooltip
windows-xp

2 ответа

4
Лучший ответ

В этом случае ручная подсказка и таймер отображают/скрывают заголовок, когда мышь перемещается по строке заголовка.

public partial class Form1 : Form
{
    private ToolTip toolTip = new ToolTip();
    private Timer toolTipTimer = new Timer();
    private bool canShowToolTip = true;

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case 0x2A0: // WM_NCMOUSEHOVER
                return;
            case (int)0x00A0: // WM_NCMOUSEMOVE
                if (m.WParam == new IntPtr(0x0002)) // HT_CAPTION
                {
                    if (canShowToolTip)
                    {
                        canShowToolTip = false;
                        toolTip.Show(this.Text, this, this.PointToClient(Cursor.Position), toolTip.AutoPopDelay);
                        toolTipTimer.Start();
                    }
                }
                return;
        }
        base.WndProc(ref m);
    }

    public Form1()
    {
        InitializeComponent();
        Form child = new Form();
        child.Text = "Program1 - Filename:[Really_long_filename_that_doesnt_fit.file] AAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB";
        child.MdiParent = this;
        child.Show();
        toolTip.AutoPopDelay = 5000;
        toolTipTimer.Interval = toolTip.AutoPopDelay;
        toolTipTimer.Tick += delegate(object sender, EventArgs e)
        {
            canShowToolTip = true;
        };
    }
}
  • 0
    Само имя файла содержит более 100 символов, поэтому даже если оно урезано до минимума, оно будет усечено.
  • 0
    Я не получаю событие WM_NCMOUSELEAVE, и впоследствии я вижу подсказку только один раз. Кажется, это может сработать, если я смогу сгладить некоторые изгибы.
0

Хотелось бы, чтобы у меня было что-то более полезное для вас, но, к сожалению, я не думаю, что есть способ обойти это. Вы можете либо сократить свои имена файлов, либо иметь дело с ним: (

  • 0
    К сожалению, имена файлов, с которыми мы работаем, генерируются пользовательской FPGA и имеют длинные сгенерированные компьютером имена файлов.
  • 0
    :( Мне жаль, парень ... иногда лучший ответ - тот, который спасает тебя много времени в поисках несуществующего. Ради тебя, я надеюсь, у какого-нибудь супергения есть способ выяснить это для тебя, но мой опыт говорит, что это просто "особенность" пользовательского интерфейса, включенная в формы:

Ещё вопросы

Сообщество Overcoder
Наверх
Меню