2010-08-23 2 views
1

D6 Проф.Delphi: Как сделать мое собственное окно подсказки?

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

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

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

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

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

Это событие происходит также, если 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 циклически появляется и dissappears

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

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

ответ

2

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

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

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

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

Затем OnShowHint проверок событий, чтобы узнать, является ли HintStr еще идентификатор подсказки сетки (у меня есть комментарий в коде с «Owned controls by grid».), И если это отменяет подсказку.

Я не уверен, если пытаться описать его, как это может быть какой-либо помощи, но здесь пытается ...

+0

Аааа ... Я забыл сказать, что этот контроль является виртуальной сетки, а не на основе на сетке VCL - он основан на customcontrol. Так что намеки исходят от этого класса. Но: Я хочу использовать не «обычный» подсказку, которая видна, когда вы переходите к любому элементу управления. Я хочу, чтобы это давало информацию из ячеек. Поэтому мне нужно перехватить курсор. – durumdara

+0

@durumdara -> «нужно поймать движение курсора» - «HintInfo», переданный в событие «OnShowHint», уже имеет позицию курсора, описанная мной реализация использует его для определения того, в какой ячейке будет включен «намек». Я также предоставил некоторые ссылки на документацию. Прочтите их немного ... –

Смежные вопросы