TN028: Il supporto della Guida sensibile al contesto

Questa nota vengono descritte le regole per l'assegnazione di aiuto contesti IDs (cioè, numeri di argomento) e altre questioni di aiuto in MFC 2.0. Il supporto della Guida sensibile al contesto richiede il compilatore della guida disponibile in Visual C++ Professional.

Tipi di guida supportati

Ci sono due tipi di guida sensibile al contesto, implementata in applicazioni Windows. La prima, chiamata anche "F1 Help" coinvolge lanciando WinHelp con il contesto appropriato basato sull'oggetto correntemente attivo. Il secondo è la modalità Maiusc + F1. In questa modalità, il cursore del mouse cambia al cursore aiuto (una combinazione di freccia + punto interrogativo), e l'utente procede a fare clic sull'oggetto che vorrebbero aiuto su. A quel punto, WinHelp viene lanciato a dare aiuto per l'oggetto su cui l'utente fa clic.

Le classi Microsoft Foundation implementano entrambe queste forme di aiuto. Inoltre, il framework supporta due comandi di guida semplice, indice della guida e utilizzo di aiutare.

File di aiuto

Le classi Microsoft Foundation presuppon&gono un singolo file di aiuto. Che il file della guida deve avere lo stesso nome e percorso dell'applicazione (.EXE - gt;.HLP).

Questa è una variabile di membro CWinApp pubblica denominata m_pszHelpFilePath che l'utente può cambiare se desiderato.

Guida di contesto Ranges

0x00000000 - 0x0000FFFF: definite dall'utente

0x00010000 - 0x0001FFFF: comandi (pulsanti menu/comando)

   0X00010000 + ID _

nbsp;  (Nota: 0x18000 - > 0x1FFFF è gamma pratico, poiché gli ID di comando sono > = 0x8000)

0x00020000 - 0x0002FFFF: finestre e finestre di dialogo

   0X00020000 + IDR _

nbsp;  (Nota: 0x20000 - > 0x27FFF è pratico gamma dal momento che sono IDRs < = 0x7FFF)

0x00030000 - 0x0003FFFF: messaggi di errore (basati su ID stringa)

   0X00030000 + IDP

0x00040000 - 0x0004FFFF: uso speciale (aree non client)

   HitTest area + 0x00040000

0x00050000 - 0x0005FFFF: controlli (quelli che non sono comandi)

   0X00040000 + IDW_

Queste regole sono insita nell'implementazione predefinita delle classi Microsoft Foundation. Possibile eseguire l'override fornendo diverse implementazioni delle varie funzioni membro relative alla guida.

Semplici comandi "Aiuto"

Ci sono due semplici comandi di aiuto che vengono implementati dalle classi Microsoft Foundation:

Questi due comandi semplicemente mostrano l'indice della guida per l'applicazione e mostrano l'utente aiuto sull'utilizzo del programma WinHelp, rispettivamente.

Guida sensibile al contesto (F1 Help)

Questa è la prima forma di guida sensibile al contesto (chiamata comunemente come F1 Help). L'utente preme F1 per ottenere aiuto sul compito a portata di mano (attivo voce finestra o menu). Non è implicato alcuna speciale "modalità di aiuto".

Il tasto F1 viene solitamente tradotto a un comando con ID ID_HELP da un acceleratore inserito nella tabella acceleratore della finestra principale. Il comando ID_HELP possa anche essere generato da un pulsante con ID ID_HELP nella finestra principale di finestra o finestra di dialogo. Inoltre, quando un menu o una finestra di dialogo è attivo e l'utente preme F1, la sequenza di tasti è hardcoded per tradurre in un comando ID_HELP.

Tuttavia il comando ID_HELP viene generato, viene instradato come un normale comando fino al raggiungimento di un gestore di comandi (per ulteriori informazioni su Microsoft Foundation classi routing di comandi architettura, riferirsi a tecnica nota 21.) Se l'applicazione è abilitato per aiuto, il comando ID_HELP verrà gestito dalla funzione CWinApp::OnHelp . Dal momento che il routing di comando predefinito non è sufficiente per determinare il contesto più specifico il comando viene invece sempre indirizzato all'oggetto application e poi subisce routing personalizzato per aiuto.

CWinApp::OnHelp tenta di lanciare WinHelp nell'ordine seguente

  1. Controlli per una chiamata attiva AfxMessageBox con un aiuto ID. Se una finestra di messaggio è attualmente attiva, WinHelp viene lanciato con il contesto appropriato a quella finestra di messaggio.

  2. Se nessuna finestra di messaggio è attivo, CWinApp::OnHelp Invia un WM_COMMANDHELP (un messaggio privato alle classi Microsoft Foundation) la finestra attiva. Se la finestra non risponde con il lancio di WinHelp, lo stesso messaggio viene quindi inviato al padre di quella finestra, fino a quando il messaggio viene elaborato o la finestra corrente è di primo livello (e dunque non ha una finestra padre).

  3. Se il messaggio rimane non trasformato, viene richiamato il valore predefinito di aiuto. Ciò avviene mediante l'invio di un comando ID_DEFAULT_HELP alla finestra principale. Questo comando è generalmente associato a CWinApp::OnHelpIndex.

Per ignorare globalmente i valori di base ID (0x10000 per i comandi, 0x20000 per le risorse, come le finestre di dialogo e così via), l'applicazione deve eseguire l'override CWinApp::WinHelp. Questo è infatti fatto nell'implementazione delle applicazioni ClassWizard e creazione guidata applicazione se stessi, ad esempio, poiché entrambi condividono un unico file di aiuto.

Per ignorare questa funzionalità e il modo che un contesto di aiuto è determinato, un'applicazione deve gestire il messaggio WM_COMMANDHELP (vedi sotto). Si desidera fornire più specifico guida di instradamento che fornisce il quadro, come va solo come profondo la corrente finestra figlia MDI. O potete desiderare fornire aiuto più specifici per una determinata finestra o finestra di dialogo - forse basato sullo stato attuale di quell'oggetto o il controllo attivo all'interno della finestra di dialogo interno.

WM_COMMANDHELP

afx_msgLRESULTCWnd::OnCommandHelp (,WPARAM, LPARAMlParam)

WM_COMMANDHELP è un messaggio di Windows del privato MFC che viene ricevuto da finestra attiva quando viene richiesto l'aiuto. Quando la finestra riceve questo messaggio, può chiamare CWinApp::WinHelp con contesto corrispondente stato interno della finestra.

lParam

contiene il contesto attualmente disponibile. lParam è zero se alcun contesto di aiuto non è stata ancora determinata. Un'implementazione di OnCommandHelp possibile utilizzare l'ID del contesto in lParam per determinare un contesto "migliore" o semplicemente può passare a CWinApp::WinHelp.

wParam

non viene utilizzato e sarà pari a zero.

Se la funzione OnCommandHelp chiama CWinApp::WinHelp, esso deve restituire TRUE. Restituendo TRUE fermate il routing di questo comando di altre classi (classi di base) e di altre finestre.

Modalità di aiuto (Help Maiusc + F1)

Questa è la seconda forma dell'aiuto sensibile al contesto. In generale, questa modalità viene immesso premendo Maiusc + F1 o tramite il menù/toolbar. Esso viene implementato come un comando (ID_CONTEXT_HELP). Il gancio di filtro del messaggio non viene utilizzato per tradurre questo comando mentre una finestra di dialogo modale o menu è attivo, pertanto questo comando è disponibile solo per l'utente quando l'applicazione è in esecuzione il message pump principale (CWinApp::Run).

Dopo aver inserito questa modalità, il cursore del mouse aiuto viene visualizzato su tutte le aree dell'applicazione, anche se l'applicazione avrebbe normalmente visualizzato il cursore è proprio per quella zona (ad esempio il bordo di ridimensionamento intorno alla finestra). L'utente è in grado di utilizzare il mouse o la tastiera per selezionare un comando. Anziché l'esecuzione del comando, informazioni su quel comando viene visualizzato. Anche l'utente può fare clic su un oggetto visibile sullo schermo, ad esempio un pulsante sulla barra degli strumenti e guida verrà visualizzata per quell'oggetto. Questa modalità di aiuto è fornita da CWinApp::OnContextHelp.

Durante l'esecuzione di questo ciclo, tutti tastiera ingresso è inattivo, fatta eccezione per i tasti che accedere al menu. Inoltre, traduzione di comando viene ancora eseguita tramite PreTranslateMessage per consentire all'utente di premere un tasto di scelta rapida e ricevere informazioni su quel comando.

Se ci sono traduzioni particolare o le azioni che si svolgono nella funzione PreTranslateMessage che non dovrebbe aver luogo durante la modalità di aiuto Maiusc + F1, si dovrebbe verificare il membro m_bHelpMode di CWinApp prima di eseguire tali operazioni. L'implementazione di CDialog di PreTranslateMessage questa verifica prima di chiamare IsDialogMessage, per esempio. Ciò Disattiva tasti "navigazione della finestra di dialogo" sulle finestre di dialogo non modali durante la modalità di MAIUSC + F1. Inoltre, CWinApp::OnIdle è ancora chiamata durante questo ciclo.

Se l'utente sceglie un comando dal menu, viene gestita come aiuto su quel comando (attraverso WM_COMMANDHELP, vedi sotto). Se l'utente sceglie una zona visibile della finestra delle applicazioni, una determinazione è fatta se esso è un non client o un cliente e fate clic. OnContextHelp gestisce la mappatura degli scatti non client al cliente clic automaticamente. Se è un cliente di clic, quindi invia un WM_HELPHITTEST per la finestra che è stato fatto clic. Se la finestra che restituisce un valore diverso da zero, quel valore viene utilizzato come il contesto per un aiuto. Se restituisce zero, OnContextHelp cerca la finestra padre (e la mancanza di questo, padre e così via). Se non è possibile determinare un contesto di aiuto, il valore predefinito è di inviare un comando ID_DEFAULT_HELP alla finestra principale, quindi (di solito) mappato al CWinApp::OnHelpIndex.

WM_HELPHITTEST

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

WM_HELPHITTEST è un messaggio di windows privato MFC, è pervenuto la finestra attiva cliccata durante la modalità di aiuto Maiusc + F1. Quando la finestra riceve questo messaggio, esso restituisce un ID di aiutare DWORD per l'uso di WinHelp.

LOWORD(lParam)

contiene i dispositivo asse x dove il mouse è stato cliccato rispetto all'area client della finestra.

HIWORD(lParam)

contiene gli asse y.

wParam

non viene utilizzato e sarà pari a zero. Se il valore restituito è diverso da zero, WinHelp viene chiamato con quel contesto. Se il valore restituito è zero, la finestra padre viene eseguita una query per aiuto.

In molti casi, è possibile sfruttare il codice di hit testing che può già avere. Per un esempio di gestire il messaggio WM_HELPHITTEST (il codice sfrutta il codice di hit test utilizzato sui pulsanti e le descrizioni comandi in CControlBar), vedere l'implementazione di CToolBar::OnHelpHitTest.

Supporto di creazione guidata applicazione MFC e MAKEHM

Creazione guidata applicazione crea i file necessari per costruire un file della guida (file CNT e hpj). Esso include anche un certo numero di precompilati.File RTF accettati dal compilatore Microsoft Help. Molti degli argomenti sono completi, ma alcune possono devono essere modificate per la vostra applicazione specifica.

Creazione automatica di un file di "aiuto mappatura" è supportata da un'utilità denominata MAKEHM. L'utilità MAKEHM può tradurre delle risorse di un'applicazione.File h per un file di mapping di aiuto. Ad esempio:

# define IDD_MY_DIALOGnbsp;  2000
# define ID_MY_COMMA&ND 150

sarà tradotto in:

HIDD_MY_DIALOGnbsp;   0x207d0
HID_MY_COMMA&ND 0X10096

Questo formato è compatibile con l'aiuto del compilatore, che associa il contesto IDs (i numeri sul lato destro) con nomi di argomento (i simboli sul lato sinistro).

Il codice sorgente per MAKEHM è disponibile nel campione MFC programmazione Utilties MAKEHM.

Aggiungendo il supporto della guida dopo l'esecuzione di AppWizard

Il modo migliore per aggiungere aiuto all'applicazione è quello di verificare l'opzione "Help sensibile al contesto" nella finestra di dialogo Opzioni di creazione guidata applicazione prima di creare l'applicazione. In questo modo AppWizard aggiunge automaticamente le voci della mappa messaggi necessari alla classe derivata da CWinApp per supportare l'aiuto.

Se hai già creato l'applicazione senza il supporto della guida e ora desideri aggiungerlo, vedere il manuale del programmatore di Visual C++.

Guida sulle finestre di messaggio

Aiuto su finestre di messaggio (talvolta chiamato avvisi) è supportato attraverso la funzione di AfxMessageBox , un wrapper per l'API di Windows MessageBox.

Ci sono due versioni di AfxMessageBox, uno per l'utilizzo con un ID di stringa e un altro per l'uso con un puntatore alla stringa (LPCSTR):

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

In entrambi i casi c'è un ID di aiutare opzionale.

Nel primo caso, il valore predefinito di nIDHelp è 0, che non indica nessun aiuto per questa finestra di messaggio. Se l'utente preme F1 e come messaggio box è attivo, l'utente non riceverà aiuto (anche se l'applicazione supporta aiuto). Se questo non è auspicabile, un ID di aiutare occorre prevedere misure per nIDHelp.

Nel secondo caso, il valore predefinito di nIDHelp è -1, che indica che l'ID aiutare è lo stesso di nIDPrompt. Aiuto funziona solo se l'applicazione è abilitato per aiuto, naturalmente). Si dovrebbe fornire 0 per nIDHelp se lo si desidera che la casella di messaggio non hanno alcun supporto della guida. Dovrebbe si desidera che il messaggio per essere abilitato, aiuto, ma desiderio un ID Guida diverso rispetto a nIDPrompt, semplicemente fornire un valore positivo per nIDHelp diverso da quello delle nIDPrompt.

&Note tecniche per numero |nbsp; Note tecniche per la categoria

Index