Форум: "Начинающим";
Текущий архив: 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]
>
> Должно быть...
Понимаю, что должно.
← →
Юрий Зотов © (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;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.007 c