TN028: Kontextsensitive Hilfe Support

Diese Applikationsschrift beschreibt die Regeln für die Zuweisung von Hilfe Kontext-IDs (d. h. Thema Zahlen) und andere Hilfe Themen in MFC 2.0. Kontextsensitive Hilfeunterstützung erfordert den Hilfe-Compiler in Visual C++ Professional verfügbar ist.

Arten von Hilfe unterstützt

Es gibt zwei Arten von kontextbezogene Hilfe implementiert in Windows-Anwendungen. Die erste, genannt "F1-Hilfe" umfasst WinHelp mit den entsprechenden Kontext basierend auf dem derzeit aktiven Objekt starten. Die zweite ist UMSCHALT + F1-Modus. In diesem Modus der Mauszeiger ändert sich in den Hilfecursor (eine Kombination Pfeil + Fragezeichen), und der Benutzer wird auf das Objekt klicken möchten sie Hilfe auf. An diesem Punkt wird die Hilfe für das Objekt, auf die der Benutzer geklickt hat, gestartet WinHelp.

Die Microsoft Foundation-Klassen implementieren beide dieser Formen der Hilfe. Das Framework unterstützt außerdem zwei einfache Hilfebefehle, Hilfe und Hilfe.

Hilfe-Dateien

Die Microsoft Foundation Classes übernehmen eine einzelne Hilfedatei. Hilfe-Datei den gleichen Namen und Pfad als der Anwendung haben muss (.EXE - ≫.{(HLP).

Dies ist eine öffentliche CWinApp -Membervariable mit dem Namen M_pszHelpFilePath , die der Benutzer ändern kann, wenn gewünscht.

Hilfe Kontext reicht

0 x 00000000 – wird: Benutzerdefiniert

0 x 00010000 - 0x0001FFFF: Befehle (Menü/Command-Schaltflächen)

&Nbsp;  0 X 00010000 + ID_

Nbsp;  (Hinweis: 0x18000 - > 0x1FFFF ist praktischer Bereich da Befehls-IDs sind > = 0 x 8000)

00020000 - 0x0002FFFF: Fenster und Dialoge

&Nbsp;  00020000 + IDR_

Nbsp;  (Hinweis: 0 x 20000 - > 0x27FFF ist praktischer Bereich da IDRs < = 0x7FFF)

0x00030000 - 0x0003FFFF: Fehlermeldungen (basierend auf Fehler-String-ID)

&Nbsp;  0X00030000 + IDP_

0 x 00040000 - 0x0004FFFF: besonderer Zweckbestimmung (nicht-Clientbereiche)

&Nbsp;  0 x 00040000 + HitTest-Bereich

0x00050000 - 0x0005FFFF: Steuerelemente (die Befehle nicht sind)

&Nbsp;  0 X 00040000 + IDW_

Diese Regeln sind in der Standardimplementierung der Microsoft Foundation Classes hartcodiert. Sie können überschrieben werden, indem Sie verschiedene Implementierungen der verschiedenen hilfebezogene Memberfunktionen.

Einfache Befehle "Hilfe"

Es gibt zwei einfache Hilfe-Befehle, die von der Microsoft Foundation-Klassen implementiert werden:

Diese beiden Befehle einfach anzeigen den Hilfe-Index für die Anwendung und die Benutzerhilfe auf mit dem WinHelp-Programm, bzw. anzeigen.

Kontextbezogene Hilfe (F1-Hilfe)

Dies ist die erste Form der kontextbezogene Hilfe (in der Regel genannt F1-Hilfe). Der Benutzer drückt die F1, um Hilfe zu der Aufgabe bei der hand (das aktive Fenster oder Menüelement) zu erhalten. Keine besonderen "Hilfemodus" beteiligt ist.

Die F1-Taste ist in der Regel auf einen Befehl mit der ID ID_HELP Beschleuniger platziert, das Hauptfenster Zugriffstastentabelle übersetzt. Der ID_HELP -Befehl kann auch durch eine Schaltfläche mit einer ID von ID_HELP auf die wichtigsten Fenster oder Dialogfeld Feld generiert werden. Außerdem ist wenn ein Menü oder ein Dialogfeld aktiv ist und der Benutzer F1 drückt, der Tastenanschlag hartcodiert in einen Befehl ID_HELP übersetzen.

Aber der ID_HELP -Befehl generiert wurde, wird es als normalen Befehl weitergeleitet, bis es erreicht einen Befehlshandler (für weitere Informationen auf der Microsoft Foundation-Klassen Befehlsrouting Architektur, siehe technische Anmerkung 21.) Wenn die Anwendung, dass Hilfe aktiviert ist, werden der ID_HELP Befehl von der CWinApp::OnHelp -Funktion behandelt. Da das Standardrouting Befehl nicht ausreichend für die Bestimmung des meisten spezifischen Kontexts ist der Befehl stattdessen immer auf das Application-Objekt geroutet und dann erfährt benutzerdefinierte routing für Hilfe.

CWinApp::OnHelp versucht, WinHelp in der folgenden Reihenfolge starten

  1. Überprüft, ob ein aktives AfxMessageBox Gespräch mit eine Hilfe. Wenn ein Meldungsfeld derzeit aktiv ist, wird WinHelp mit dem Kontext entsprechend dieses Meldungsfeld gestartet.

  2. Wenn kein Meldungsfeld aktiviert ist, sendet CWinApp::OnHelp eine WM_COMMANDHELP (eine Nachricht privat zu den Microsoft Foundation Classes) an das aktive Fenster. Wenn dieses Fenster nicht durch die Einführung von WinHelp reagiert, die gleiche Nachricht wird gesendet an das übergeordnete Element des Fensters, bis die Nachricht verarbeitet wird oder das aktuelle Fenster ein Fenster das obersten Ebene ist (und muss daher kein übergeordneten Fenster).

  3. Bleibt die Nachricht unverarbeitet, wird dann die Standardhilfe aufgerufen. Dies erfolgt durch einen ID_DEFAULT_HELP -Befehl an das Hauptfenster gesendet. Dieser Befehl wird in der Regel CWinApp::OnHelpIndex zugeordnet.

Um die Basis ID-Werte (0 x 10000 für Befehle, 0 x 20000 für Ressourcen, z. B. Dialogfelder und usw.) weltweit zu überschreiben, sollte die Anwendung CWinApp::WinHelpüberschreiben. In der Tat bei der Umsetzung der Klassen-Assistent und AppWizard Anwendungen selbst, z. B. dazu da beide eine einzige Hilfedatei teilen.

Zum Überschreiben dieser Funktionen und die Möglichkeit, dass ein Zusammenhang mit Hilfe bestimmt wird, sollte eine Anwendung die WM_COMMANDHELP -Nachricht (siehe unten) behandeln. Vielleicht möchten Sie mehr spezifische Hilfe routing bereitstellen als Rahmen bietet, wie es nur so tief wie die aktuelle untergeordnete MDI-Fenster geht. Oder vielleicht möchten Sie mehr spezifische Hilfe für ein bestimmtes Fenster oder Dialogfeld--vielleicht basierend auf den aktuellen internen Zustand des Objekts oder das aktive Steuerelement im Dialogfeld Bereitstellen.

WM_COMMANDHELP

afx_msg LRESULT CWnd::OnCommandHelp (WPARAM, LPARAM lParam)

WM_COMMANDHELP ist ein MFC private Windows-Nachricht, die von der aktive Fenster empfangen wird, wenn Hilfe angefordert wird. Wenn das Fenster diese Nachricht empfängt, kann es CWinApp::WinHelp mit Kontext aufrufen, die das Fenster internen Zustand entspricht.

lParam

den derzeit verfügbaren Hilfekontext enthält. lParam ist NULL, wenn keine Hilfe-Kontext noch bestimmt worden ist. Eine Implementierung der OnCommandHelp kann die Kontext-ID in lParam einen "besseren" Kontext bestimmen oder kann es nur an CWinApp::WinHelp übergeben.

wParam

wird nicht verwendet und wird gleich null sein.

Wenn die OnCommandHelp Funktion CWinApp::WinHelpaufruft, muss er TRUE zurückgeben. Rückgabe TRUE stoppt das routing von diesen Befehl für andere Klassen (die Basis-Klassen) und in anderen Fenstern.

Hilfemodus (Shift + F1-Hilfe)

Dies ist die zweite Form der kontextsensitiven Hilfe. Dieser Modus wird in der Regel durch Drücken von UMSCHALT + F1 oder über die Menüleiste eingegeben. Es ist als ein Befehl (ID_CONTEXT_HELP) implementiert. Der Meldungshook Filter wird nicht verwendet, um diesen Befehl während ein modales Dialogfeld zu übersetzen oder Menü aktiv ist, daher: dieser Befehl ist nur für den Benutzer verfügbar, wenn die Anwendung die Haupt-Meldungsverteilschleife (CWinApp) ausgeführt wird.

Nach der Eingabe dieser Modus, ist Hilfe bewegen Sie der Mauszeiger über alle Bereiche der Anwendung angezeigt, auch wenn die Anwendung normalerweise eigene Cursor für diesen Bereich (z. B. Größenanpassungsrahmens um Fenster) angezeigt wird. Der Benutzer kann die Maus oder die Tastatur verwenden, um einen Befehl auswählen. Statt den Befehl ausführt, wird Hilfe für diesen Befehl angezeigt. Der Benutzer kann auch ein sichtbares Objekt auf dem Bildschirm, wie z. B. eine Schaltfläche auf der Symbolleiste klicken und Hilfe für dieses Objekt angezeigt. Diese Art der Hilfe wird von CWinApp::OnContextHelp bereitgestellt.

Während der Ausführung dieser Schleife, alle Tastatureingaben ist inaktiv, außer für Schlüssel, die auf das Menü zugreifen. Auch Befehl Übersetzung erfolgt weiterhin über PreTranslateMessage , damit der Benutzer eine Zugriffstaste drücken und erhalten Hilfe auf den Befehl.

Wenn bestimmte Übersetzungen oder Aktionen in der PreTranslateMessage -Funktion, die UMSCHALT + F1 Hilfe-Modus stattfinden sollte nicht vorhanden sind, sollten Sie den M_bHelpMode -Member von CWinApp überprüfen, bevor Sie diese Operationen. Die CDialog -Implementierung von PreTranslateMessage überprüft dies vor dem Aufruf von IsDialogMessage, zum Beispiel. Dies deaktiviert nicht modale Dialoge "Dialogfeld Navigation" Tasten während UMSCHALT + F1-Modus. Darüber hinaus wird CWinApp::OnIdle noch während dieser Schleife aufgerufen.

Wenn der Benutzer einen Befehl aus dem Menü auswählt, wird es als Hilfe auf den Befehl behandelt (durch WM_COMMANDHELP, siehe unten). Klickt der Benutzer auf einen sichtbaren Bereich des Fensters Anwendungen, ist eine Feststellung getroffen, ob es eine nicht-Clientbereiche klicken Sie oder ein Client. OnContextHelp behandelt nicht-Clientbereiche Klicks auf Client Klicks automatisch zuordnen. Ist es einem Client klicken, sendet es dann eine WM_HELPHITTEST an das Fenster, auf die geklickt wurde. Wenn das Fenster einen Wert ungleich NULL zurückgibt, wird dieser Wert als Kontext für Hilfe verwendet. Wenn sie 0 (null) zurückgibt, versucht OnContextHelp das übergeordnete Fenster (ersatzweise, die das übergeordnete Element, und so weiter). Wenn ein Hilfekontext nicht bestimmt werden kann, ist der Standardwert einen ID_DEFAULT_HELP -Befehl zum Hauptfenster, senden die CWinApp::OnHelpIndex dann (normalerweise) zugeordnet ist.

WM_HELPHITTEST

Afx_msg LRESULT CWnd::OnHelpHitTest (WPARAM, LPARAM lParam)

WM_HELPHITTEST ist ein MFC private Windows, durch das aktive Fenster geklickt während UMSCHALT + F1 Hilfemodus empfangene Nachricht. Wenn das Fenster diese Nachricht empfängt, gibt es ein DWORD-Hilfe-ID für die Verwendung von WinHelp.

LOWORD(lParam)

die X-Achse Gerät Koordinate wo die Maus relativ zum Clientbereich des Fensters geklickt wurde.

HIWORD(lParam)

die Y-Koordinate enthält.

wParam

wird nicht verwendet und wird gleich NULL sein. Wenn der Rückgabewert ungleich NULL ist, wird mit diesem Zusammenhang WinHelp aufgerufen. Wenn der Rückgabewert 0 (null) ist, wird das übergeordnete Fenster für Hilfe abgefragt.

In vielen Fällen können Sie Treffertests Code nutzen, die Sie bereits haben können. Finden Sie die Implementierung von CToolBar::OnHelpHitTest ein Beispiel für die Behandlung der Meldung des WM_HELPHITTEST (der Code nutzt den Trefferüberprüfung Code auf Schaltflächen und QuickInfos in CControlBarverwendet).

Unterstützung des MFC-Anwendungs-Assistent und MAKEHM

Der Anwendungs-Assistent erstellt die benötigten Dateien auf eine Hilfe-Datei (CNT und HPJ-Dateien) erstellen. Es enthält auch eine Reihe von vorgefertigten.RTF-Dateien, die von der Microsoft Help Compiler akzeptiert werden. Viele der Themen sind, aber einige können für Ihre spezifische Anwendung geändert werden müssen.

Automatische Erstellung einer "Zuordnung" Hilfedatei wird vom Dienstprogramm MAKEHM unterstützt. Das Dienstprogramm MAKEHM übersetzen eine ANWENDUNGSRESSOURCE.H-Datei, die eine Hilfedatei zuordnen. Zum Beispiel:

# define IDD_MY_DIALOGnbsp;  2000
# define ID_MY_COMMA&ND 150

wird übersetzt:

HIDD_MY_DIALOGnbsp;   0x207d0
HID_MY_COMMA&ND 0X10096

Dieses Format ist kompatibel mit der Hilfecompiler Anlage, die Kontext-IDs (die Zahlen auf der rechten Seite) mit Thema Namen (die Symbole auf der linken Seite) Karten.

Der Quellcode für MAKEHM ist verfügbar in der MFC-Programmierung-Dienstprogramme-Probe MAKEHM.

Hinzufügen von Hilfe nach dem Ausführen der Anwendungs-Assistent

Der beste Weg, um Hilfe zu Ihrer Anwendung hinzufügen soll vor dem Erstellen der Anwendungs in der Anwendungs-Assistent-Dialogfeld "Optionen" im "Kontextsensitive Hilfe" die Option aktivieren. So AppWizard fügt automatisch die notwendigen Nachricht-Zuordnungseinträgen CWinApp-abgeleitete Klasse zur Hilfe Unterstützung.

Wenn Sie Ihre Anwendung ohne Hilfeunterstützung bereits erstellt haben und jetzt es hinzufügen möchten, finden Sie unter Visual C++ Programmer's Guide.

Hilfe zu Message-Boxen

Hilfe zu Message-Boxen (auch als Warnungen bezeichnet) wird über die Funktion AfxMessageBox ein Wrapper für die MessageBox -Windows-API unterstützt.

Es gibt zwei Versionen von AfxMessageBox, eine für die Verwendung mit eine String-ID und eine andere für die Verwendung mit einem Zeiger auf die Zeichenfolge (LPCSTR):

int AFXAPI AfxMessageBox(LPCSTR lpszText, UINT nType, UINT nIDHelp);
Int AFXAPI AfxMessageBox(UINT nIDPrompt, UINT nType, UINT nIDHelp)

In beiden Fällen gibt es eine optionale ID-Hilfe.

Im ersten Fall ist der Standardwert für nIDHelp 0, das keine Hilfe für das Meldungsfeld angibt. Wenn der Benutzer F1 drückt, während z. B. Nachricht Feld aktiv ist, erhält der Benutzer keine Hilfe (auch wenn die Anwendung Hilfe unterstützt). Wenn dies nicht erwünscht ist, sollte eine Hilfe-ID für nIDHelp bereitgestellt werden.

Im zweiten Fall ist der Standardwert für nIDHelp-1 und gibt an, dass die Hilfe-ID nIDPrompt identisch ist. Hilfe funktioniert nur, wenn die Anwendung Help-aktiviert, natürlich). Sie sollte 0 für nIDHelp bereitstellen, wenn Sie wünschen, dass das Meldungsfeld keine Hilfeunterstützung haben. Sollten Sie die Nachricht an Hilfe aktiviert, aber eine andere Hilfe-ID als nIDPrompt Wunsch, geben Sie einen positiven Wert für nIDHelp von der nIDPrompt.

Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie

Index