TN028: Kontextová nápověda a odborná pomoc
Tato poznámka popisuje pravidla pro přiřazení ID kontextu nápovědy a dalších potíží Nápověda v MFC.Kontextová nápověda a odborná pomoc vyžaduje kompilátor nápovědy, který je k dispozici v jazyce C++.
[!POZNÁMKA]
Kromě provádění kontextové nápovědy WinHelp pomocí MFC také podporuje používání nápovědy HTML.Další informace o této podpory a programování s nápovědou HTML naleznete v nápovědy HTML: Context-Sensitive Nápověda pro vaše programy.
Typy podporovaných nápovědy
Existují dva typy kontextovou nápovědu v aplikacích systému Windows.První, uvedené jako "F1 Help" zahrnuje spuštění nápovědy s příslušnou kontextu na základě aktuálně aktivní objekt.Druhý je režim "Shift + F1".V tomto režimu kurzor myši se změní na kurzor nápovědy a klepněte na objekt uživatele pokračuje.V daném okamžiku WinHelp je spuštěno poskytnout nápovědu pro objekt, který uživatel klepnul.
Microsoft Foundation Classes implementovat obou formách pomoci.Kromě toho podporuje dva příkazy nápovědy jednoduchý rejstřík nápovědy a pomoci.
Soubory nápovědy
Microsoft Foundation classes předpokládají jeden soubor nápovědy.Tento soubor nápovědy musí mít stejný název a cestu jako aplikace.Například pokud je spustitelný soubor C:\MyApplication\MyHelp.exe soubor nápovědy musí být C:\MyApplication\MyHelp.hlp.Nastavení cesty až m_pszHelpFilePath členské proměnné Třída CWinApp.
Rozsahy kontextové nápovědy
Výchozí implementace MFC vyžaduje některá pravidla o přiřazení kontextové nápovědy ID programu.Tato pravidla jsou ID přiděleny specifické prvky.Tato pravidla lze přepsat poskytnutím různými implementacemi různé funkce nápovědy týkající se členů.
0x00000000 - 0x0000FFFF : user defined
0x00010000 - 0x0001FFFF : commands (menus/command buttons)
0x00010000 + ID_
(note: 0x18000-> 0x1FFFF is the practical range since command IDs are >=0x8000)
0x00020000 - 0x0002FFFF : windows and dialogs
0x00020000 + IDR_
(note: 0x20000-> 0x27FFF is the practical range since IDRs are <= 0x7FFF)
0x00030000 - 0x0003FFFF : error messages (based on error string ID)
0x00030000 + IDP_
0x00040000 - 0x0004FFFF : special purpose (non-client areas)
0x00040000 + HitTest area
0x00050000 - 0x0005FFFF : controls (those that are not commands)
0x00040000 + IDW_
Jednoduché příkazy "Help"
Existují dvě jednoduché příkazy nápovědy, které implementoval Microsoft Foundation Classes:
ID_HELP_INDEX, který je implementovánCWinApp::OnHelpIndex
ID_HELP_USING, který je implementovánCWinApp::OnHelpUsing
První příkaz zobrazí rejstřík nápovědy pro aplikaci.Druhý zobrazí uživatelské nápovědy pomocí programu WinHelp.
Kontextová nápověda (F1 Nápovědu)
Klávesa F1 obvykle přeložit příkaz s ID ID_HELP pomocí akcelerátoru do hlavního okna Tabulka akcelerátoru.ID_HELP Příkaz může být také generovány tlačítko s ID ID_HELP na poli Hlavní okno nebo dialogové okno.
Bez ohledu na způsob ID_HELP příkaz je generována, je směrována jako normální příkaz dokud nedosáhne popisovač příkazu.Další informace o příkazu směrování architektury MFC naleznete v Technická poznámka 21.Pokud žádost povoleno, nápovědy ID_HELP příkaz bude zpracována CWinApp::OnHelp.Objekt aplikace obdrží zprávu nápovědy a přesměruje příkaz správně.To je nezbytné, protože není dostatečné pro stanovení nejvíce kontextu příkazu výchozí směrování.
CWinApp::OnHelpdošlo k pokusu o spuštění nápovědy v následujícím pořadí:
Kontroluje aktivní AfxMessageBox volání nápovědy kód.Pokud je aktivní okno, WinHelp je spuštěn s kontextem, který je vhodné toto okno se zprávou.
Odešle zprávu WM_COMMANDHELP na aktivní okno.Pokud okno neodpoví spuštěním WinHelp, stejné zprávy jsou potom odeslány na předchůdce tohoto okna, dokud je zpráva zpracována nebo aktuálního okna je okno nejvyšší úrovně.
Odešle příkaz ID_DEFAULT_HELP hlavní okno.Tím se spustí výchozí Nápověda.Tento příkaz obvykle mapována na CWinApp::OnHelpIndex.
Globálně (např přepsat výchozí základní hodnoty IDnahrazení jsou příkazy a 0x20000 pro prostředky, jako například dialogová okna), aplikace by měla mít přednost CWinApp::WinHelp.
Potlačit tuto funkci a způsobem, že je určen kontext nápovědy, by měl zpracovat zprávu WM_COMMANDHELP.Chcete poskytnout podrobnější nápovědu směrování než rámci poskytuje, koleček pouze hluboké aktuální podřízené okno MDI.Můžete také poskytnout další nápovědu pro konkrétní okno nebo dialogové okno, případně na základě aktuální vnitřní stav objektu nebo aktivní ovládací prvek v dialogovém okně.
WM_COMMANDHELP
afx_msg LRESULT CWnd::OnCommandHelp(WPARAM wParam, LPARAM lParam)
WM_COMMANDHELP je soukromá zpráva Windows MFC přijaté aktivní okno nápovědy je požadována.Okno obdrží tuto zprávu, může volat CWinApp::WinHelp s kontextem, který odpovídá vnitřní stav v okně.
lParam
Obsahuje nyní k dispozici kontextové nápovědy.lParamPokud není stanoveno žádné kontextové nápovědy je nula.Implementace OnCommandHelp pomocí ID kontextu v lParam k určit jiný kontext nebo projdou pouze na CWinApp::WinHelp.wParam
Není použit a bude nula.
Pokud OnCommandHelp volání funkce CWinApp::WinHelp, by se měl vrátit TRUE.Vrácení TRUE přestane směrování tento příkaz do jiných tříd a ostatní okna.
Režim nápovědu (Shift + F1 Nápovědu)
Toto je druhý formulář kontextovou nápovědu.Tento režim je obecně zadán stisknutím kláves SHIFT + F1 nebo prostřednictvím nabídky nebo panelu nástrojů.Je implementována jako příkaz (ID_CONTEXT_HELP).Zavěšení filtr zprávy není použita k převodu příkaz při modální dialogové okno nebo je aktivní nabídka, proto tento příkaz je k dispozici pouze pro uživatele při aplikaci je provádění hlavní zpráva čerpadlo (CWinApp::Run).
Po zadání tohoto režimu se zobrazí Nápověda kurzor myši přes všechny oblasti aplikace, i v případě, že aplikace by obvykle zobrazí vlastní kurzor pro tuto oblast (například velikost ohraničení kolem okna).Uživatel, je možné pomocí myši nebo klávesnice vyberte příkaz.Namísto provádění příkazu se zobrazí nápovědu k příkazu.Také mohou uživatelé klepnout viditelný objekt na obrazovce, například tlačítko na panelu nástrojů a Nápověda se zobrazí pro daný objekt.Tento režim nápovědy poskytované CWinApp::OnContextHelp.
Během provádění této smyčky všechny vstupní klávesnice je neaktivní, s výjimkou klíče, které nabídky.Také nadále provádí překlad příkazu prostřednictvím PreTranslateMessage uživateli, stiskněte klávesu a nápovědu k příkazu.
V případě, že existují konkrétní překlady nebo akce, přičemž umístit PreTranslateMessage neměli probíhat během režimu klávesy SHIFT + F1 Nápovědu Zkontrolujte funkci m_bHelpMode člen CWinApp před provedením těchto operací.CDialog Provádění PreTranslateMessage to kontroluje před voláním IsDialogMessage, například.Zakáže nemodální dialogy "dialog navigace" kláves SHIFT + F1 v režimu.Kromě toho CWinApp::OnIdle stále nazývá během této smyčky.
Pokud uživatel zvolí příkaz z nabídky, je zpracována jako nápovědu k příkazu (prostřednictvím WM_COMMANDHELP, viz níže).Pokud uživatel klepne na viditelné oblasti okna aplikace, není rozhodnuto o tom, zda je nonclient nebo klepněte na klienta.OnContextHelpúchyty mapování nonclient klepne automaticky klepnutí klienta.Pokud je klient klepněte, poté odešle WM_HELPHITTEST do okna, kterou jste klepli.Pokud okno vrátí nenulovou hodnotu, tato hodnota slouží jako kontextu nápovědu.Pokud vrátí nulu, OnContextHelp se pokusí nadřazené okno (a který nadřazené selhání a tak dále).Pokud nelze určit kontextové nápovědy, ve výchozím nastavení je odeslat ID_DEFAULT_HELP příkazu hlavním okně (obvykle) poté mapován do CWinApp::OnHelpIndex.
WM_HELPHITTEST
afx_msg LRESULT CWnd::OnHelpHitTest(WPARAM, LPARAM lParam)
WM_HELPHITTEST je zpráva soukromé windows MFC, která obdržela klepli SHIFT + F1 Nápovědu v režimu aktivního okna.Okno obdrží tuto zprávu, vrátí Identifikátor pomoci DWORD pro použití s WinHelp.
LOWORD(lParam)
obsahuje souřadnice osy x zařízení, kde byl vzhledem k oblasti okna klienta klepnutí myši.HIWORD(lParam)
obsahuje souřadnice Y.wParam
není použit a bude nula.Pokud je vrácená hodnota nenulová, se nazývá WinHelp se v této souvislosti.Pokud je vrácená hodnota nulová, je dotazován nadřazené okno nápovědy.
V mnoha případech můžete využít přístupů testování kódu, který může být již.Viz provádění CToolBar::OnHelpHitTest příklad zpracování WM_HELPHITTEST zpráva (kód využívá přístupů testovací kód tlačítka a popisy v CControlBar).
Podpora Průvodce aplikací MFC a MAKEHM
Aplikace MFC vytvoří soubory potřebné k sestavení souboru nápovědy (soubory .cnt a HPJ).Obsahuje také počet souborů RTF předem přijaté kompilátoru nápovědy společnosti Microsoft.Mnoho témat je dokončeno, ale některé nutné upravit pro konkrétní aplikace.
Automatické vytvoření souboru "help mapování" je podporován nástroj MAKEHM.Nástroj MAKEHM lze překládat prostředku aplikace.H soubor mapování souboru nápovědy.Příklad:
#define IDD_MY_DIALOG 2000
#define ID_MY_COMMAND 150
budou přeloženy do:
HIDD_MY_DIALOG 0x207d0
HID_MY_COMMAND 0x10096
Tento formát je kompatibilní se zařízením kompilátor nápovědy, která mapuje názvy témat (symboly na levé straně) ID kontextu (čísla na pravé straně).
Zdrojový kód pro MAKEHM je k dispozici ve vzorku MFC programovací nástroje MAKEHM.
Přidání nápovědy podpory po spuštění Průvodce aplikace MFC
Nejlepší způsob přidání nápovědy k aplikaci je kontrola "Context-sensitive Help" možnost na stránce Rozšířené funkce Průvodce aplikace MFC před vytvořením aplikace.Tak MFC aplikace Průvodce automaticky přidá položky mapy zprávy nezbytné vaše CWinApp-odvozené třídy pro podporu nápovědy.
Nápověda k zprávou
Nápověda zprávou (někdy nazývané výstrahy) je podporováno až AfxMessageBox funkce, obal MessageBox rozhraní API systému Windows.
Existují dvě verze AfxMessageBox, jeden pro Identifikátor řetězce a jiný pro použití s ukazatel na řetězec (LPCSTR):
int AFXAPI AfxMessageBox(LPCSTR lpszText, UINT nType, UINT nIDHelp);
int AFXAPI AfxMessageBox(UINT nIDPrompt, UINT nType, UINT nIDHelp);
V obou případech je ID volitelné Nápověda.
V prvním případě je výchozí pro nIDHelp 0, což znamená pro toto okno se zprávou žádná nápověda.Pokud uživatel stiskne klávesu F1, například zpráva je aktivní pole, uživatel neobdrží nápovědy (i v případě, že aplikace podporuje nápovědy).Pokud není žádoucí, a ID nápovědy je třeba stanovit nIDHelp.
V druhém případě je výchozí hodnota pro nIDHelp -1 označuje, že ID nápovědy je stejné jako nIDPrompt.Nápověda bude funkční pouze v případě, že aplikace je povolena Nápověda kurzu).0 Pro nIDHelp by měla poskytnout, pokud chcete, že žádná nápověda a odborná pomoc zprávou.Se má zpráva nápovědy povolena, ale touží ID nápovědy jiného než nIDPrompt, stačí stanovit kladná hodnota liší od nIDPrompt nIDHelp.