Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.02.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
Германн ©   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.004 c
15-1288472674
Дмитрий Тимохов
2010-10-31 01:04
2011.02.13
Мейнстрим интернет разработки


2-1290266910
izja
2010-11-20 18:28
2011.02.13
DSpack фильтры


2-1290417334
Иван
2010-11-22 12:15
2011.02.13
StringGrid.Rows[].Objects


15-1287405980
Ires
2010-10-18 16:46
2011.02.13
Исходники


2-1290604410
mem
2010-11-24 16:13
2011.02.13
дефрагментация файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский