![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ещё раз о "подсказках"
Германн © (2010-11-05 02:10:00)Всё думаю как наиболее снабдить юзера подсказками. С хинтами на статус баре справился. Но статус бар не безразмерный. Очень длинная подсказка (скорее даже это уже не подсказка, а объяснение что это такое) туда не влезет. Вспомнилась мне при этом стандартная фишка Микрософт "Что это такое". Фишка включает в себя кнопку со значком вопроса, курсор со стрелкой и значком вопроса, плюс особое всплывающее окно, которое показывается когда этим курсором щелкнешь на дочернем окне.
Вот сам вопрос. Эта технология как-то реализована? В виде WinAPI'шных функций. (О реализации в Дельфи я не слышал, но вдруг и она есть?)
Или всё нужно делать ручками?
Д2007
sniknik (2010-11-06 01:57:00) [41]> Добавить свою кнопку слева от системных не проблема.
в висте/имн7 под стиль аэро/... ???
Германн (2010-11-06 01:38:00) [42]
> sniknik ©
Да. Без кнопки вопроса сей код малополезен, а без кнопок мин/мах некошерно.
Добавить свою кнопку слева от системных не проблема. А нельзя ли сказать винде, что эта кнопка контекстной справки?
А то ручками слишком сложно имитировать такое поведение.
Германн (2010-11-05 19:30:00) [43]
> Вот реализация на Дельфи.
Спасибо!
Anatoly Podgoretsky (2010-11-05 12:08:00) [44]> sniknik (05.11.2010 11:42:11) [11]
А на чем еще я мог делать в 1995-1997 годах, не на НТ4 же.
sniknik (2010-11-05 11:42:00) [45]на win98? может быть, сейчас? вряд ли ;о(.
а мелкософт вместо добавления действительно нормальных вещей только над интерфейсом "издевается". :(
Anatoly Podgoretsky (2010-11-05 11:20:00) [46]> sniknik (05.11.2010 11:15:09) [9]
Я этим занимался очень давно, 13 и более лет назад и уже ничего не помню, но
мне как то удалось добиться и для обычной формы, но как не помню и проекта
того уже нет.
sniknik (2010-11-05 11:15:00) [47]ну вот, я именно про это. т.к. мне это больше нужно на главной форме... там где по программе/элементам больше всего вопросов.
Anatoly Podgoretsky (2010-11-05 11:03:00) [48]Контекстная справка, предназначена только для окон со стилем DIALOG - ограничение Виндоус
sniknik (2010-11-05 11:01:00) [49]> Я немного тебя не понимаю, ты о чем, если о заголовке окна, то это штатно
через BorderIcons
кнопка хелпа не совместима с минимизацией/развертыванием, т.е. можно только в "сингл" крестиком (как у диалоговых стандартно). у обычных окон (есть кнопки минимизации/...) не работает.
Anatoly Podgoretsky (2010-11-05 10:44:00) [50]> sniknik (05.11.2010 10:19:04) [4]
Я немного тебя не понимаю, ты о чем, если о заголовке окна, то это штатно
через BorderIcons
sniknik (2010-11-05 10:28:00) [51]> еще бы добавить вопрос в системные кнопки
в смысле, добавить то можно, но только так
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;
но это как то "не кошерно"....
sniknik (2010-11-05 10:19:00) [52]Anatoly Podgoretsky © (05.11.10 08:43) [3]
еще бы добавить вопрос в системные кнопки, для обычных, не диалоговых окон, и можно пользоваться.
полезная в принципе вещь, гораздо полезнее чем весь стиль "аэро" например (имхо конечно), но почему то неиспользуемая.
Anatoly Podgoretsky (2010-11-05 08:43:00) [53]Вот реализация на Дельфи.
Из архива писем.
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
Anatoly Podgoretsky (2010-11-05 08:36:00) [54]> Германн (05.11.2010 02:10:00) [0]
Руками с помощью АПИ
Германн (2010-11-05 02:24:00) [55]Да ещё поясню суть проблемы.
Данная программа будет бесплатной. (Т.е. конечно "условно-бесплатной", потому что она будет даваться тому, кто купил железо.) Значит хэлпа у этой программы никогда не будет.