![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Во время показа hints мелькает фоном стандартная подсказка. [D7, WinXP]
Dr. Andrew © (2007-07-09 19:08:00)Доброго дня, Мастера!
Я использую свой собственный формат всплывающей подсказки hint объявленной в процедуре onFormCreate^
{* установить собственный формат подсказок *}
Application.ShowHint := False;
HintWindowClass := SGGraphicHint.TSGGraphicHintWindow;
FHintWindow := HintWindowClass.Create(self);
Application.ShowHint := True;
Проблема: во время показа hints мелькает фоном стандартная подсказка (желтое поле).
Вопрос: как можно отловить (hook или еще каким образом?) системную стандартную подсказку (вернее фоновое отображение ее Canvasа) и запретить ее появление одновременно с моим hint? Пожалуйста, приведите маленький пример. Всем спасибо!
Rouse_ (2007-07-11 21:43:00) [1]
> просто я хочу разобраться в своем исходном коде.
Самое простое разобраться сначала в чужом, чтобы потом понять что не так в своем :) Хотя конечно проще задать вопрос "что у меня не работает"... ;)
Dr. Andrew (2007-07-11 18:50:00) [2]просто я хочу разобраться в своем исходном коде. Может все же есть мнения у кого-то еще? Всем спасибо!
MetalFan (2007-07-11 18:47:00) [3]Dr. Andrewты
MetalFan © (10.07.07 08:53) [12]
видел? чем тебя не устраивает?
Dr. Andrew (2007-07-11 17:10:00) [4]так Paint у меня уже есть (смотри полный код выше), только несколько свой, что там модет быть не так? А что происходит в процедуре Erase(var Message: TMessage), что она такое вытворяет? Спасибо за ответ.
Rouse_ (2007-07-11 17:00:00) [5]Paint забыл...
Dr. Andrew (2007-07-11 14:42:00) [6]{jХорошою вайте поп порядку:
1. Введение процедуры - procedure CreateParams (var Params: TCreateParams); override; ничего не меняет, кроме тог что удаляется бордюр вокруг канваса подсказки, но это мелочь понятная.
2. Введение процедуры procedure Erase(var Message: TMessage); message WM_ERASEBKGND; с любым ее значением красит белый канвас в черный цвет с проступающим на нем цветным, например, текстом и дополнительно нарисовывает контуры канваса при каждом его перемещении, то есть канвас становится похожим на совокупность множества рамочек и подсказка становится нечитабельной.
Rouse_ (2007-07-11 10:18:00) [7]Я ничего не понимаю... Тебе дали код, ты его смотрел? Зачем задавать вопрос если решение у тебя уже есть? Касвас создается при создании окна, перед созданием окна перед регистрацией класса происходит вызов CreateParams... все перекрывается - все отрисовывается... бликов нет. Нафига тебе для такой простой задачи еще и хуки то понадобились?
Dr. Andrew (2007-07-10 23:30:00) [8]только том, что появляются блики. решения проблемы нет. может Вы знаете как возможно хуком можно перехвать создание стандартного канваса подсказки и сразу выводить мой канвас? Спасибо!
MetalFan (2007-07-10 23:18:00) [9]а в чем необходимость перекрытия ActivateHint???
Rouse_ (2007-07-10 17:45:00) [10]Вот если ты всетаки посмотришь мой пример, то сможешь увидеть как сее действо происходит. См реализацию
TFWHintWindow = class(THintWindow)
private
FHint: TFWHint;
FBlend, FSRC: TBitmap;
protected
procedure CreateParams (var Params: TCreateParams); override;
procedure Paint; override;
procedure Erase(var Message: TMessage); message WM_ERASEBKGND;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ActivateHint (HintRect: TRect; const AHint: string); Override;
end;
Dr. Andrew (2007-07-10 17:00:00) [11]Я не имел ввиду пример fwhint.zip, я все время веду речь о приведенном мною выше коде собственного hint. И хочу понять, что вызывает долисекундные блики. А можно как-то перехватить создание стандартного канваса, например, с помощью hook? Я так понимаю, что вначале создается канвас стандартный желтого традиционного цвета, а затем идет перерисовка на мой канвас. Если можно отловить все это хуком, то можно небольшой пример как это сделать практически? Спасибо за помощь!
Rouse_ (2007-07-10 16:17:00) [12]Так в моем примере размер канваса как раз кастомный, там вообще все кастомное :) Но бликов никогда небыло :)
Dr. Andrew (2007-07-10 15:11:00) [13]представить пример не представляется возможным так как он интегрирован в большую программу, а фоном в виде блика на доли секунды всплывает точно такой же канвас с желтого цвета, вторым планом. пример, приведенный выше работает более стабильно, но у в моем случае я сам расчитываю размер канваса подсказки и практически аналогично повторяю вышеуказанный код.
Rouse_ (2007-07-10 14:40:00) [14]
> но там тоже нет решения пока.
В смысле, тот пример тоже показывает фоном желтый цвет периодически?
А можно я скажу "не верю"? ;)
Инс (2007-07-10 14:32:00) [15]Кинь-ка мне на мыло маленький демонстрационный примерчик данного хинт-виндоу.
Dr. Andrew (2007-07-10 14:05:00) [16]спасибо, не сразу обратил внимание, уже нашел, посмотрел, но там тоже нет решения пока.
Rouse_ (2007-07-10 14:03:00) [17]Плохо искал :)
http://rouse.drkb.ru/files/fwhint.zip
Dr. Andrew (2007-07-10 13:50:00) [18]Инс Спасибо за диалог, но включение процедуры WMEraseBkgnd(var Message: TWMEraseBkgnd) не меняет, а даже ухудшает положение. Канвас подсказки становится черного цвета, а блики все равно есть. Использование CalcHintRect тоже не влияет на фоновую перерисовку. Есть еще мнений по данной проблеме?
Rouse_ Спасибо за совет, но поданной ссылке ничего не нашел, можно дать адрес точнее. Спасибо!
Rouse_ (2007-07-10 11:38:00) [19]Посмотри вот этот компонент: http://rouse.drkb.ru/components.php#fwhint
по его аналогу добавь к себе что у тебя забыто :)
Инс (2007-07-10 10:42:00) [20]чуть подправлю, на коленке писал...
procedure TGraphicHintWindow.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
Message.Result:=1; // Перекрываем старый обработчик пустышкой
end;