Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.02.13;
Скачать: CL | DM;

Вниз

Ещё раз о "подсказках"   Найти похожие ветки 

 
Германн ©   (2010-11-05 02:10) [0]

Всё думаю как наиболее снабдить юзера подсказками. С хинтами на статус баре справился. Но статус бар не безразмерный. Очень длинная подсказка (скорее даже это уже не подсказка, а объяснение что это такое) туда не влезет. Вспомнилась мне при этом стандартная фишка Микрософт "Что это такое". Фишка включает в себя кнопку со значком вопроса, курсор со стрелкой и значком вопроса, плюс особое всплывающее окно, которое показывается когда этим курсором щелкнешь на дочернем окне.
Вот сам вопрос. Эта технология как-то реализована? В виде WinAPI"шных функций. (О реализации в Дельфи я не слышал, но вдруг и она есть?)
Или всё нужно делать ручками?
Д2007


 
Германн ©   (2010-11-05 02:24) [1]

Да ещё поясню суть проблемы.
Данная программа будет бесплатной. (Т.е. конечно "условно-бесплатной", потому что она будет даваться тому, кто купил железо.) Значит хэлпа у этой программы никогда не будет.


 
Anatoly Podgoretsky ©   (2010-11-05 08:36) [2]

> Германн  (05.11.2010 02:10:00)  [0]

Руками с помощью АПИ


 
Anatoly Podgoretsky ©   (2010-11-05 08:43) [3]

Вот реализация на Дельфи.
Из архива писем.

Hi Mavin!
There is simple example, w/o explanation (it need more time).
Put it in your code and use.
You need also create own help file and assign
context number to HelpContext of controls.

======   it put into Form declaration   ======

protected
  HelpControl: TWinControl;
  function HelpEvent (Command:Word;
                      Data:Longint;
                      var CallHelp:Boolean):Boolean;
public
  procedure WMHelp(var Message: TWMHelp); message WM_HELP;
  ...

======   it put into implementation part   ======

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Application.OnHelp := HelpEvent;
  ...
end; // FormCreate

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  Application.HelpCommand(HELP_QUIT,0);
  ...
end;

procedure TMainForm.WMHelp(var Message:TWMHelp);
var
  Control: TWinControl;
begin
  HelpControl := nil;
  with Message.HelpInfo^ do begin
    if Message.HelpInfo.iContextType = HELPINFO_WINDOW then begin
      Control := FindControl(hItemHandle);
      while (Control <> nil) and (Control.HelpContext = 0) do begin
        Control := Control.Parent;
      end;
      if Control <> nil then begin
        HelpControl := Control;
      end;
    end;
  end;
  inherited;
end; // WMHelp

function TMainForm.HelpEvent(Command:Word;
                             Data:Longint;
                             var CallHelp:Boolean):Boolean;
var
  ARect: TRect;
  APoint: TPoint;
begin
  if Command = HELP_CONTEXTPOPUP then begin
    if HelpControl <> nil then begin
      GetCursorPos(APoint);
      ARect := HelpControl.ClientRect;
      ARect.TopLeft := HelpControl.ClientToScreen(ARect.TopLeft);
      ARect.BottomRight :=
HelpControl.ClientToScreen(ARect.BottomRight);
      if (APoint.x >= ARect.Left) and
         (APoint.x <= ARect.Right) and
         (APoint.y >= ARect.Top) and
         (APoint.y <= ARect.Bottom) then Exit;
              // the cursor is already over the control.
      with HelpControl do begin
        APoint := Point(Left + Width div 2,Top + Height div 2);
        APoint := Parent.ClientToScreen(APoint);
      end;
      Application.HelpCommand(HELP_SETPOPUP_POS,
                              LongInt(PointToSmallPoint(APoint)));
    end;
  end;
end; // HelpEvent

================================================
You can find explanation and details under Help.

Sincerely yours
Anatoly Podgoretsky


 
sniknik ©   (2010-11-05 10:19) [4]

Anatoly Podgoretsky ©   (05.11.10 08:43) [3]
еще бы добавить вопрос в системные кнопки, для обычных, не диалоговых окон, и можно пользоваться.

полезная в принципе вещь, гораздо полезнее чем весь стиль "аэро" например (имхо конечно), но почему то неиспользуемая.


 
sniknik ©   (2010-11-05 10:28) [5]

> еще бы добавить вопрос в системные кнопки
в смысле, добавить то можно, но только так
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
 inherited;
 with Params do begin
   Style  := Style and (not WS_MAXIMIZEBOX) and (not WS_MINIMIZEBOX);
   ExStyle:= ExStyle or WS_EX_CONTEXTHELP;
 end;
end;

но это как то "не кошерно"....


 
Anatoly Podgoretsky ©   (2010-11-05 10:44) [6]

> sniknik  (05.11.2010 10:19:04)  [4]

Я немного тебя не понимаю, ты о чем, если о заголовке окна, то это штатно
через BorderIcons


 
sniknik ©   (2010-11-05 11:01) [7]

> Я немного тебя не понимаю, ты о чем, если о заголовке окна, то это штатно
через BorderIcons
кнопка хелпа не совместима с минимизацией/развертыванием, т.е. можно только в "сингл" крестиком (как у диалоговых стандартно). у обычных окон (есть кнопки минимизации/...) не работает.


 
Anatoly Podgoretsky ©   (2010-11-05 11:03) [8]

Контекстная справка, предназначена только для окон со стилем DIALOG - ограничение Виндоус


 
sniknik ©   (2010-11-05 11:15) [9]

ну вот, я именно про это. т.к. мне это больше нужно на главной форме... там где по программе/элементам больше всего вопросов.


 
Anatoly Podgoretsky ©   (2010-11-05 11:20) [10]

> sniknik  (05.11.2010 11:15:09)  [9]

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


 
sniknik ©   (2010-11-05 11:42) [11]

на win98? может быть, сейчас? вряд ли ;о(.
а мелкософт вместо добавления действительно нормальных вещей только над интерфейсом "издевается". :(


 
Anatoly Podgoretsky ©   (2010-11-05 12:08) [12]

> sniknik  (05.11.2010 11:42:11)  [11]

А на чем еще я мог делать в 1995-1997 годах, не на НТ4 же.


 
Германн ©   (2010-11-05 19:30) [13]


> Вот реализация на Дельфи.

Спасибо!


 
Германн ©   (2010-11-06 01:38) [14]


> sniknik ©

Да. Без кнопки вопроса сей код малополезен, а без кнопок мин/мах некошерно.

Добавить свою кнопку слева от системных не проблема. А нельзя ли сказать винде, что эта кнопка контекстной справки?
А то ручками слишком сложно имитировать такое поведение.


 
sniknik ©   (2010-11-06 01:57) [15]

> Добавить свою кнопку слева от системных не проблема.
в висте/имн7 под стиль аэро/... ???


 
Германн ©   (2010-11-06 02:05) [16]


> sniknik ©   (06.11.10 01:57) [15]
>
> > Добавить свою кнопку слева от системных не проблема.
> в висте/имн7 под стиль аэро/... ???
>

Не знаю. Не пробовал. Пока.
Висты у меня нет. Семерка триальная есть (правда 90 дней прошли, но обещанного часа для проверки должно бы хватить). Сщас попробую.
Стиль аэро как включить?


 
sniknik ©   (2010-11-06 02:12) [17]

где то в панели управления должна быть настройка экрана (как темы в свойствах экрана в XP, а может там тоже есть)...
я как то тоже без этих "супер операционок" обхожусь.


 
Германн ©   (2010-11-06 02:14) [18]


> sniknik ©   (06.11.10 02:12) [17]

Сщас попробую.


 
Германн ©   (2010-11-06 02:30) [19]

В семёрке вызвал попап на десктопе. Выбрал "personalize". Затем выбрал одну из Aero themes. Кнопка жива.
Хотя да. Я понял тебя.
Ты хочешь делать стандартные окна. Т.е. вид этих окон определяется Виндой. У меня не стандартное окно, благодаря моему заказчику.


 
Юрий Зотов ©   (2010-11-06 11:39) [20]

Делал когда-то форму с любым сочетанием системных кнопок, включая и кнопку вопроса. Оформлена в виде пакета, который инсталлируется в IDE обычным образом, после чего в репозитории IDE (меню File-New-Form) появляется искомая форма. При нажатии на кнопку вопроса возникает событие, для которого надо только написать обычный обработчик. Кроме того, форма позволяет вставить в свой заголовок и любой контрол с окном системного класса BUTTON (это обычные кнопки, чекбоксы и пр.), причем никакого кода для этого писать не нужно, все делается через Инспектор Объектов.

Делал в D7, тестировал под W2K и XP. Работает нормально, могу выложить в исходниках. Но вряд ли будет корректно работать при использовании тем XP и тем более под W7 и Vista (да под ними даже и не тестировалось ни разу).

Если кому интересно и есть смысл выкладывать - отпишитесь здесь.


 
DiamondShark ©   (2010-11-06 18:05) [21]


> sniknik ©   (05.11.10 10:28) [5]
> Anatoly Podgoretsky ©   (05.11.10 10:44) [6]
> sniknik ©   (05.11.10 11:01) [7]

А вам обязательно в заголовок?
Добавьте кнопку на тулбар, по нажатию кнопки посылайте
WM_SYSCOMMAND с параметром SC_CONTEXTHELP

Будет совсем как "Что это такое?"


 
sniknik ©   (2010-11-06 19:13) [22]

> А вам обязательно в заголовок?
"нам" обязательно стандартно. вот когда в обычном интерфейсе от ms войдут в моду кнопки на тулбаре аля "Что это такое?", тогда подумаем.

> посылайте WM_SYSCOMMAND с параметром SC_CONTEXTHELP
проще уж F1 нажать, да и объяснять по телефону короче. а то для такой кнопки как бы своя кнопка "Что это такое?" не понадобилась.


 
DiamondShark ©   (2010-11-06 19:36) [23]


> sniknik ©   (06.11.10 19:13) [22]
> "нам" обязательно стандартно.

А-а... Ну, ждите подарка от микрософта.


> Германн ©   (06.11.10 01:38) [14]
> А то ручками слишком сложно имитировать такое поведение.

WM_SYSCOMMAND с параметром SC_CONTEXTHELP


 
DiamondShark ©   (2010-11-06 19:40) [24]


> Юрий Зотов ©   (06.11.10 11:39) [20]
> Если кому интересно и есть смысл выкладывать - отпишитесь
> здесь.

Только пакет не нужен (за отсутствием дельфей).
Достаточно в двух словах о способе, которым удалось показать кнопку контекстной справки вместе с кнопками минимизации/максимизации.
Если это не стандартная заголовочная кнопка, а нарисованная штучка или ещё какой трюк, то не надо.


 
Германн ©   (2010-11-07 00:23) [25]


> DiamondShark ©   (06.11.10 19:36) [23]
>

Спасибо, работает.


 
Юрий Зотов ©   (2010-11-07 00:32) [26]

> DiamondShark ©   (06.11.10 19:40) [24]

Кнопка, конечно, рисованная (а нерисованных кнопок и не бывает), но не самопально, а системными средствами (DrawFrameControl). Поскольку все заголовочные кнопки система рисует точно так же, то можно сказать, что это все же стандартная кнопка. Тем более, что и реакция на нее тоже стандартная (собственно, никакой реакции и вовсе нет, просто обрабатывается WM_NCHITTEST и тогда система сама и хинт свой показывает, и посылает WM_SYSCOMMAND с SC_CONTEXTHELP, и все остальное тоже делает сама). Поэтому контекстная справка и делается обычным образом (создается файл справки и контролам назначаются индексы топиков), и работает стандартным образом (клик по кнопке вопроса, затем клик по контролу).

Заголовок формы получается немного укороченным (за счет дополнительной кнопки), поэтому он тоже рисуется, и тоже самой системой (DrawCaption) - то есть, системным шрифтом, системными цветами, включая иконку (если она назначена), текст, градиент (если включен), многоточие при обрезке текста и все остальное.


 
Германн ©   (2010-11-07 01:01) [27]


> Юрий Зотов ©   (06.11.10 11:39) [20]

Могу попробовать. Может и пригодится. Поскольку сейчас я кнопку сделал благодаря возможностям шкур. Если бы шкур не было...


 
Германн ©   (2010-11-07 02:06) [28]


> Германн ©   (07.11.10 00:23) [25]
>
>
> > DiamondShark ©   (06.11.10 19:36) [23]
> >
>
> Спасибо, работает.

Хм. курсор меняет свой вид.  А WM_HELP окну значит нужно всё равно ручками посылать.


 
Юрий Зотов ©   (2010-11-07 02:21) [29]

> Германн ©   (07.11.10 02:06) [28]

http://webfile.ru/4878709

YzDCL70.zip, 26 кБ.

Исходники. В архиве есть файл ReadMe.1st - в нем все инструкции по компиляции, установке и использованию.

Пожелания, замечания, критика, восторги и любые прочие отзывы приветствуются. Особенно интересно, как эта штука поведет себя под W7 и Vista. Глюки будут практически наверняка, но насколько серьезные? That is a question.


 
Германн ©   (2010-11-07 02:30) [30]


> Юрий Зотов ©   (07.11.10 02:21) [29]

Скачал. Попробую.
"добавить в переменную окружения Path" - это обязательно? Или просто "устар."


 
Юрий Зотов ©   (2010-11-07 02:39) [31]


> Германн ©   (07.11.10 02:30) [30]

Можно в пути поиска самой Delphi. Куда угодно, лишь бы она видела.


 
Германн ©   (2010-11-07 02:44) [32]


> Юрий Зотов ©   (07.11.10 02:39) [31]

Я так и понял.


 
Германн ©   (2010-11-07 03:21) [33]


> Юрий Зотов ©   (06.11.10 11:39) [20]

Установил в Д2007. Пришлось правда потрудиться, что бы RunTime"мовскую bpl она увидела.
Но вот в репозитарии я её (ту самую форму с кнопками) так и не увидел.
Почему не увидел, не знаю. Моей квалификции недостаточно для понимания.


 
DiamondShark ©   (2010-11-07 09:09) [34]


> Юрий Зотов ©   (07.11.10 00:32) [26]

Ясно, спасибо.


 
sniknik ©   (2010-11-07 10:41) [35]

> Но вот в репозитарии я её (ту самую форму с кнопками) так и не увидел.
> Почему не увидел, не знаю. Моей квалификции недостаточно для понимания.
6. Пользоваться так: в меню File - New - Other,
  затем в списке выбрать Frame Control Form.


 
Германн ©   (2010-11-07 14:59) [36]


> sniknik ©   (07.11.10 10:41) [35]

Нет там её.


 
Юрий Зотов ©   (2010-11-07 15:40) [37]


> Германн ©   (07.11.10 14:59) [36]

Надо инсталлировать в IDE design-time пакет.


 
Германн ©   (2010-11-07 15:50) [38]


> Юрий Зотов ©   (07.11.10 15:40) [37]
>
>

Инсталлировал ещё ночью. :(
http://pikucha.ru/777215


 
Юрий Зотов ©   (2010-11-07 16:23) [39]

Должно быть...
:-(

http://webfile.ru/4879514


 
Германн ©   (2010-11-07 16:57) [40]


> Юрий Зотов ©   (07.11.10 16:23) [39]
>
> Должно быть...

Понимаю, что должно.


 
Юрий Зотов ©   (2010-11-07 17:07) [41]

Может, в D2007 есть какие-то особенности инсталляции?


 
Германн ©   (2010-11-07 17:20) [42]

Не то чтобы ее там не было совсем
http://pikucha.ru/777461
Но воспользоваться ею никак не получается.


> Может, в D2007 есть какие-то особенности инсталляции?

ХЗ. До сих пор ни о чем подобном не слышал. :(


 
Юрий Зотов ©   (2010-11-07 18:30) [43]

Так. Если она там все же появляется, значит регистрация формы и эксперта IDE сработали нормально. Но почему она появляется в левом поле, а не в правом? Может быть, ее надо просто туда перетащить и тогда она станет доступна? Диалог же не зря называется "Customize New Menu".


 
Германн ©   (2010-11-07 19:17) [44]


> Может быть, ее надо просто туда перетащить и тогда она станет
> доступна? Диалог же не зря называется "Customize New Menu".
>

Перетаскивал. Но кроме этого диалога ее нигде не видно.


 
Юрий Зотов ©   (2010-11-07 19:35) [45]

Вообще-то странно. Похоже, что это не сам репозиторий IDE, а диалог настройки пункта меню. Но должен быть и репозиторий.


 
Германн ©   (2010-11-09 03:36) [46]


> Anatoly Podgoretsky ©   (05.11.10 08:43) [3]
>
> Вот реализация на Дельфи.
>

Увы не работает ни на Д6, ни на Д2007.

Краткое резюме:
В Д6 и в Д2007 показать контекстную подсказку в popup-окне помогает вызов в Application.OnHelp конструкции:
 WinHelp(Handle, PChar(Application.HelpFile), Command, Data);
 CallHelp := False;

но только в диалоговом окне с кнопкой biHelp. В обычном окне эта конструкция показывает подсказку в дефолтном окне.
Кстати начиная с Д6 контекстная подсказка показывается в дефолтном окне даже при вызове ее из диалога кнопкой biHELP.


 
Германн ©   (2010-11-09 03:56) [47]

Решил вопрос путем перетаскивания процедуры TCustomForm.WMHelp с небольшими изменениями. Это конечно дилетантское решение, но для конкретного проекта сойдет.


 
Ответ   (2010-11-09 06:21) [48]

Сколько пользуюсь  компом наверно раза два или три всего нажимал на кнопку вопросо (системную), чтобы просмотреть справку, по моему обычный хелп более привычен пользователю (*.hlp, pdf, doc и т.д.), зачем так заморачиваться?


 
Германн ©   (2010-11-09 15:12) [49]


> Ответ   (09.11.10 06:21) [48]
>
> Сколько пользуюсь  компом наверно раза два или три всего
> нажимал на кнопку вопросо (системную), чтобы просмотреть
> справку, по моему обычный хелп более привычен пользователю
> (*.hlp, pdf, doc и т.д.), зачем так заморачиваться?

А ты взгляни на это с другой стороны. Возьми панель управления. Запусти почти любой апплет. Есть в нем "обычный" хелп? Нет. Зачем он там нужен? Тот кто настраивает систему и так знает для чего нужна, к примеру, видеокарта. А вот некоторые ее настройки могут потребовать пояснений. Что-то вроде этого и у меня.


 
Dennis I. Komarov ©   (2010-11-09 15:39) [50]

Юрий Сергеевич, выложите exe-шничик (мы Вам доверяем :) ) "где есть просто форма". А народ с суперосями провел бы, так сказать, как ей живется в аэро. Можно еще бутончиков на нее покидать а-ля Caption:= и т.п.


 
Германн ©   (2010-11-19 04:05) [51]


> Anatoly Podgoretsky ©   (05.11.10 10:44) [6]
>
> > sniknik  (05.11.2010 10:19:04)  [4]
>
> Я немного тебя не понимаю, ты о чем, если о заголовке окна,
>  то это штатно
> через BorderIcons
>
> sniknik ©   (05.11.10 11:01) [7]
>
> > Я немного тебя не понимаю, ты о чем, если о заголовке
> окна, то это штатно
> через BorderIcons
> кнопка хелпа не совместима с минимизацией/развертыванием,
>  т.е. можно только в "сингл" крестиком (как у диалоговых
> стандартно). у обычных окон (есть кнопки минимизации/...
> ) не работает.
>

Ещё одно открытие.
Кнопка хелпа не совместима только с главным окном приложения. У "обычных" дочерних окон приложения она вполне нормально сосуществует с кнопками минимизации/развертывания.
MS тому виной или Борланд не знаю.


 
Германн ©   (2010-11-19 04:46) [52]


> Германн ©   (19.11.10 04:05) [51]

В "запарке" допустил путаницу в терминах.
Под "главным окном приложения" я имел в виду Дельфийскую MainForm.


 
sniknik ©   (2010-11-19 08:01) [53]

> У "обычных" дочерних окон приложения она вполне нормально сосуществует с кнопками минимизации/развертывания.
чето не выходит каменный цветок...
запрет на любой, не зависимо от того главная или нет. (D7)
и это поведение в общем описано у мелкософта, однозначное. может у тебя все таки, и так заработал компонент от ЮЗ?


 
Anatoly Podgoretsky ©   (2010-11-19 10:50) [54]

> Германн  (19.11.2010 04:05:51)  [51]

На не диалоговых окнах достаточно свойства Hint у компонентов и может
увеличить время до появления, это удобне чем biHelp и несоизмеримо проще.


 
Германн ©   (2010-11-19 19:52) [55]


> sniknik ©   (19.11.10 08:01) [53]
>
> > У "обычных" дочерних окон приложения она вполне нормально
> сосуществует с кнопками минимизации/развертывания.
> чето не выходит каменный цветок...
> запрет на любой, не зависимо от того главная или нет. (D7)
> и это поведение в общем описано у мелкософта, однозначное.
>  может у тебя все таки, и так заработал компонент от ЮЗ?
>
>

Да был полностью не прав.
Кнопка хелпа совместима с кнопками минимизации/развертывания для любого окна. При использовании AlphaSkins.



Страницы: 1 2 вся ветка

Текущий архив: 2011.02.13;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.015 c
2-1290612582
Денис2
2010-11-24 18:29
2011.02.13
Серийный номер монитора


2-1290462726
Sarg77
2010-11-23 00:52
2011.02.13
Создание битовых массивов произвольной длинны


15-1288299060
Иксик
2010-10-29 00:51
2011.02.13
Как правильно пишется "фердебобель"?


15-1288564199
Юрий
2010-11-01 01:29
2011.02.13
С днем рождения ! 1 ноября 2010 понедельник


2-1285314207
Aleks
2010-09-24 11:43
2011.02.13
Как узнать о завершении работы Windows XP?