Главная страница
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]
>
> Должно быть...

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



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

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

Наверх




Память: 0.58 MB
Время: 0.011 c
15-1288773954
12
2010-11-03 11:45
2011.02.13
Песня по радио на не русском мотив Цоя


6-1229355579
Unknown user
2008-12-15 18:39
2011.02.13
TWinSocketStream


2-1290533555
ZV
2010-11-23 20:32
2011.02.13
Сравнение времени функции TDateTime


15-1288635282
boriskb
2010-11-01 21:14
2011.02.13
Microsoft открывает центр разработок в Сколково


15-1288819798
Юрий
2010-11-04 00:29
2011.02.13
С днем рождения ! 4 ноября 2010 четверг