Delphi: Как создать собственное окно подсказок? - PullRequest
1 голос
/ 23 августа 2010

D6 Проф.

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

Проблема этой темы в том, что HintWindow не работает должным образом или так же, как обычные «подсказки».

Появляются нормальные подсказки, и они исчезают в следующих случаях: - подсказка, показывающая истекшее время - активная форма деактивирована - отображается новая форма - приложение заменено другой задачей (ALT + TAB)

Но наше окно HintWindow не может обнаружить отображение новой формы или изменение приложения - оно остается в верхней части, пока не будет отклонено.time ...: - (

Еще одна проблема, которую мы использовали "MouseMove", чтобы обнаружить изменение мыши - чтобы запустить подсказку.

Это событие также происходит, если HintWindow исчезает. Поэтому янеобходимо защитить от циклического шоу с помощью этого кода:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
    Caption := INtTOStr(X) + ' ' + IntToStr(Y) + ' ' + IntToStr(GetTickCount);
    // If same coordinate I don't show it again
    if (LX <> X) or (LY <> Y) then begin
        miHint.DoActivateHint(Self, 'Anytext', 2000, 2000);
        LX := X; LY := Y;
    end;
end;

Без этого LX, LY циклически появляется и исчезает HintWindow.

Итак: нам нужно знать, как мы создаем HintWindow, которое являетсяработает в том же методе, что и приложение «Подсказка», но ограничен этой сеткой. Он должен закрываться на «изменение задачи», «изменение формы». Как это сделать?

Спасибо за вашу помощь: дд

1 Ответ

2 голосов
/ 23 августа 2010

Вам лучше использовать предоставленный механизм, который показывает подсказки по всему приложению, заменив HintWindowClass параметра HintInfo , переданного в OnShowHint* 1007 приложения. * событие, когда вам нужно показать настроенную подсказку. Может быть, вы найдете некоторые полезные детали реализации ниже.

Старый ответ:
В одном старом приложении у меня был другой класс подсказок для списков и сеток. Поведение немного разбросано, но в основном оно сводилось к;

Всем DBGrids в Приложении присваивается некоторый идентификационный совет, например: «MyDBGridHint». OnShowHint Тестирование событий приложения, если оно пройдено 'HintInfo' HintControl 'является' TCustomDBGrid ', и, если это так, вызывает процедуру, передающую' HintInfo '.

Эта процедура находит ячейку, в которой должна быть подсказка, используя метод MouseCoord Grid с HintInfo.CursorPos, получает отображаемый текст ячейки путем временного изменения DataLink Grid. Затем процедура создает TCanvas и назначает свой дескриптор DC, полученный для Grid, назначает шрифт сетки для Canvas и проверяет, достаточна ли граница ячейки сетки для отображения текста. Если он решит, что подсказка будет отображаться, назначит текст ячейки для HintInfo.HintStr и класс окна производной подсказки для HintInfo.HintWindowClass, вычислит позицию, границу, установит шрифт и т. Д. И вернет.

Затем OnShowHint событие тестирует, чтобы увидеть, является ли HintStr по-прежнему идентификатором подсказки сетки (у меня есть комментарий в коде «Собственные элементы управления сетками производят это»), и если это так, отменяет подсказку.

Я не уверен, что попытка описать это таким образом может помочь, но вот попытка ...

...