Недавно добавленные исходники

•  TDictionary Custom Sort  535

•  Fast Watermark Sources  900

•  3D Designer  1 830

•  Sik Screen Capture  1 476

•  Patch Maker  1 483

•  Айболит (remote control)  1 407

•  ListBox Drag & Drop  1 175

•  Доска для игры Реверси  21 846

•  Графические эффекты  1 356

•  Рисование по маске  1 295

•  Перетаскивание изображений  1 096

•  Canvas Drawing  969

•  Рисование Луны  814

•  Поворот изображения  770

•  Рисование стержней  815

•  Paint on Shape  493

•  Генератор кроссвордов  762

•  Головоломка Paletto  667

•  Теорема Монжа об окружностях  855

•  Пазл Numbrix  618

•  Заборы и коммивояжеры  848

•  Игра HIP  557

•  Игра Go (Го)  527

•  Симулятор лифта  548

•  Программа укладки плитки  509

•  Генератор лабиринта  565

•  Проверка числового ввода  524

•  HEX View  600

•  Физический маятник  528

•  Задача коммивояжера  560

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Всплывающие подсказки у выключенных кнопок



Автор: Neil J. Rubenking

- А что это y тебя все вpемя ScanDisk запyскается? Сломалось что-нибyдь?
- Да нет, это обычная pеакция Windows на выключение компьютеpа кнопкой питания.
- Разве ты не знаешь, как пpавильно выключать компьютеp?
- Я-то как pаз знаю, а вот Windows - нет!

Проблема заключается в том, что свойство Parent у выключенной (disabled) кнопки равно NIL. Я не уверен что это так, но это становится проблемой в ActivateHint. Если кнопка выключена, то даже при наличии над ней курсора мыши и включенной подсказки, появится.... правильно, подсказка ФОРМЫ....

OK, давайте лечить. Метод FindDragTarget вызывается в коде-обработчике подсказки, и позволяет увидеть компонент, находящийся в данный момент под курсорм мыши. FindDragTarget вызывает функцию Windows API WindowFromPoint. И WindowFromPoint *НЕ* возвращает "выключенные" окна. В электронной справке по API говорится, что если вам необходимы также выключенные окна, используйте ChildWindowFromPoint. ОГО! Это идея. Если элемент управления выключен, то будет найдена или сама форма, или же контейнер выключенного компонента. Если компонент, найденый с помощью ChildWindowFromPoint отличается от найденного с помощью WindowFromPoint, мы должны высветить подсказку. Это работает! Но хочу предостеречь: вы не сможете таким образом получить подсказку для самой формы или контейнеров типа TPanel или TGroupBox. Попытайтесь сами!


procedure TForm1.AppShowHint(var HintStr: string;
  var CanShow: Boolean; var HintInfo: THintInfo);
var
  PT: TPoint;
  H: HWnd;
  TWC: TWinControl;
begin
  if not (HintInfo.HintControl is TWinControl) then
    Exit;
  GetCursorPos(PT);
  PT := HintInfo.HintControl.ScreenToClient(PT);
  H := ChildWindowFromPoint(TWinControl(HintInfo.HintControl).Handle, PT);
  TWC := FindControl(H);
  if TWC = nil then
    Exit;
  if TWC = Self then
    CanShow := False
  else if TWC = HintInfo.HintControl then
    exit(эту строку добавил Tim Frost}
  else if TWC.ControlCount > 0 then
    CanShow := False
  else
    with TWC do
      if ShowHint and (Hint <> '') then
      begin
        HintStr := '(выключен) ' + Hint;
        HintInfo.HintPos := ClientOrigin;
        Inc(HintInfo.HintPos.Y, Height + 6);
      end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnShowHint := AppShowHint;
end;








Copyright © 2004-2022 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте   Facebook   Ссылка на Twitter   Ссылка на Telegram