Für unsere kontextsensitive Hilfe benötigen wir zunächst eine neue Prozedur:
// Copyright www.delphi-jedi.org procedure ShowHelp(Pt: TPoint; ContextId: Integer); const rect : TRect = (Left:-1;Top:-1;Right:-1;Bottom:-1); var Popup : THHPopup; URL : string; begin URL := szHelpFile + '::/popup.txt';
if (ContextId > 0) then begin FillChar(Popup, SizeOf(Popup), 0); Popup.cbStruct := SizeOf(Popup); Popup.hinst := 0; Popup.idString := ContextId; Popup.pszText := nil; Popup.pt := Pt; Popup.clrForeGround := TColorRef(-1); Popup.clrBackground := TColorRef(-1); Popup.rcMargins := rect; Popup.pszFont := '';
HtmlHelp(0,@URL[1],HH_DISPLAY_TEXT_POPUP,dword(@Popup)); end; end;
Hier sehen Sie auch, wie die Datei mit den Popup-Texten benutzt werden muss. Durch die Übergabe der Kontext-ID in
Popup.idString := ContextId;
Popup.pszText := nil;
wird das entsprechende Topic aus der Textdatei geladen und entsprechend angezeigt. Wenn sich die Texte für die kontextsensitive Hilfe innerhalb Ihres Programms befinden, müssen Sie ein wenig anders vorgehen. Nehmen wir als Beispiel an, dies wären die notwendigen Informationen:
const ContextInfo : array[1000..1002]of string = ('Dies ist mal nur ein Popup-Text.', '', // Dummy 'Ein Editfeld, man höre und staune ...');
Dann benutzen Sie stattdessen diesen Code:
Popup.idString := 0;
Popup.pszText := pchar(ContextInfo[ContextId]);
In dem Fall ist die Angabe der Textdatei auch nicht erforderlich, und Sie brauchen lediglich den Namen der CHM-Hilfedatei angeben. Das Beispielprogramm verdeutlicht das Prinzip mit Hilfe eines Compilerschalters. Wenn Sie das Programm normal starten und nutzen, kommen die Popup-Texte aus der Hilfedatei, wenn Sie stattdessen den Schalter CONTEXTINSIDE benutzen, kommen die Texte aus dem o.g. String-Array innerhalb des Programms.
Damit unser Hilfe-Button in der Titelleiste und die F1-Taste ihre Daseinsberechtigung behalten, ändern wir den Code unseres HLP-Beispielprogramms beim Abfangen der Nachricht "WM_HELP" und übergeben Position des Mauszeigers und Kontext-ID an die neue Funktion:
WM_HELP:
if(PHelpInfo(lp)^.iContextType = HELPINFO_WINDOW) then
begin
if(PHelpInfo(lp)^.dwContextId > 0) then
ShowHelp(PHelpInfo(lp)^.MousePos,PHelpInfo(lp)^.dwContextId)
end else
Result := DefWindowProc(wnd,uMsg,wp,lp);
Lediglich unser Popupmenü muss noch ein wenig ergänzt werden. Da wir uns diesmal selbst um die Anzeige der Kontext-Informationen kümmern, müssen wir auch dafür sorgen, dass sie an der richtigen Stelle erscheinen. Dazu erweitern wir lediglich die Klickfunktion unseres Menüeintrages und holen uns die Position des Mauszeigers:
WM_COMMAND:
case HIWORD(wp) of
BN_CLICKED:
case LOWORD(wp) of
IDC_DIRECTHELP:
if(cId > 0) then
begin
GetCursorPos(p); ShowHelp(p,cId);
end;
end;
end;
Den Rest des Programms können wir unverändert lassen.