テクニカル ノート 28: 状況依存のヘルプのサポート

このヘルプ コンテキスト Id (トピック番号) と MFC 2.0 で他のヘルプの問題を割り当てるための規則について説明します。状況依存のヘルプ サポートは Visual の C++ Professional のヘルプ コンパイラが必要です。

サポートされるヘルプの種類

Windows アプリケーションに状況依存のヘルプの 2 種類です。最初に、参照する「F1」、現在アクティブなオブジェクトに基づいて、適切なコンテキストで WinHelp を起動します。2 番目は、SHIFT キーを押しながら F1 モードです。このモードでは、ヘルプ カーソル (組み合わせ矢印 + 疑問符)、マウス カーソルを変更し、彼らに役立つと思いますオブジェクトをクリックして、ユーザーを実行します。この時点で、WinHelp ヘルプを与えることで、ユーザーがクリックしたオブジェクトの起動します。

Microsoft Foundation クラスは両方の形式のヘルプの実装します。さらに、2 つの簡単なヘルプ コマンド、ヘルプおよびヘルプを使用して、フレームワークをサポートします。

ヘルプ ファイル

Microsoft Foundation クラスは 1 つのヘルプ ファイルと仮定します。ヘルプ ファイルに同じ名前とパス、アプリケーションとして必要 (。EXE - gt;。HLP)(&G)。

これは、ユーザーは必要に応じて変更することができますm_pszHelpFilePathというパブリックCWinAppメンバー変数です。

ヘルプ コンテキストの範囲

0x00000000 - 0x0000FFFF: ユーザー定義

0x00010000 - 0x0001FFFF: コマンド (メニュー] ボタン)

特価;0X00010000 + ID _(&N)

特価;(注: 0x18000-> 0x1FFFF は実用的な範囲のコマンド Id ですので > = 0x8000)

0x00020000 - 0x0002FFFF: ウィンドウとダイアログ ボックス

特価;0X00020000 + IDR _(&N)

特価;(注: 0x20000-> 0x27FFF IDRs であるので実用的な範囲である < 0x7FFF =)

0x00030000 - 0x0003FFFF: エラー メッセージ (エラー文字列 ID に基づいて)

特価;0X00030000 + IDP _(&N)

0x00040000 - 0x0004FFFF: 特別な目的 (非クライアント領域)

特価;0x00040000 + HitTest エリア(&N)

0x00050000 - 0x0005FFFF: コントロール (これらのコマンドではない)

特価;0X00040000 + IDW _(&N)

これらのルールは、ハード コーディングされた Microsoft Foundation クラスの既定の実装にです。各種のヘルプに関連するメンバー関数の異なる実装を提供することによって上書きできます。

「ヘルプ」の簡単なコマンド

Microsoft Foundation クラスによって実装される 2 つの簡単なヘルプ コマンドです。:

これら 2 つのコマンドは単に、アプリケーションのヘルプの索引を表示し、windows ヘルプ プログラムは、それぞれを使用して、ユーザーのヘルプを表示。

状況依存のヘルプ (F1 ヘルプ)

これは、状況依存のヘルプ (通常する F1 ヘルプと呼ばれる) の最初のフォームです。ユーザーの手で、タスク (アクティブなウィンドウやメニュー アイテム) のヘルプを表示する F1 キーを押します。特別な「ヘルプ モード」の関係です。

F1 キー通常ID_HELPの ID を持つコマンドのメイン ウィンドウのアクセラレータ テーブルにあるアクセラレータによって変換されます。ID_HELPコマンドは、メイン ウィンドウまたはダイアログ ボックスID_HELPの ID を持つボタンによっても生成があります。また、メニューまたはダイアログ ボックスがアクティブになっているし、F1 キーを押したときに、キーストロークがID_HELPコマンドに変換するハードコードされて。

ID_HELPコマンドが生成されますが、(、Microsoft Foundation クラスのアーキテクチャでは、コマンド ルーティングの詳細について参照してくださいのテクニカル ノート 21。)、コマンド ハンドラーに到達するまでは、通常のコマンドとしてルーティングされます。アプリケーション ヘルプが有効になっている場合は、 ID_HELPコマンドは、 CWinApp::OnHelp関数によって処理されます。既定のコマンド ルーティングは最も特定のコンテキストを決定するために十分ではないため、コマンド代わりに常に、アプリケーション オブジェクトにルーティングされ、カスタム ヘルプのルーティングを受ける。

CWinApp::OnHelp次の順序で WinHelp を起動しようとしています。

  1. アクティブのAfxMessageBox呼び出しにヘルプ ID のチェックメッセージ ボックスが現在アクティブな場合は、WinHelp をメッセージ ボックスに適切なコンテキストで起動します。

  2. メッセージ ボックスがアクティブでない場合は、 CWinApp::OnHelp WM_COMMANDHELP (Microsoft Foundation クラスにプライベート メッセージ) をアクティブ ウィンドウに送信します。WinHelp を起動して、そのウィンドウが応答しない場合は、同じメッセージ、そのウィンドウの親に、現在のウィンドウをトップレベル ウィンドウのメッセージが処理されるかまで送信 (およびそのため、親ウィンドウはありません)。

  3. メッセージが未処理に残っている場合は、既定のヘルプが呼び出されます。これは、メイン ・ ウィンドウには、 ID_DEFAULT_HELPコマンドを送信することによって行われます。このコマンドは一般にCWinApp::OnHelpIndexにマップされます。

ID の基本値 (コマンド、ダイアログ ボックスなどのリソース用の 0x20000 用の 0x10000) をグローバルにオーバーライドするには、アプリケーションでcwinapp::winhelpをオーバーライドします。両方を 1 つのヘルプ ファイルを共有するため実際に ClassWizard および AppWizard アプリケーション自体の実装では、たとえば、これです。

この機能は、ヘルプ コンテキストの判定方法をオーバーライドするには、アプリケーションでWM_COMMANDHELPメッセージ (下記参照) を処理します。フレームワークを提供よりも、それだけ、現在の MDI 子ウィンドウとして深い行く詳細ヘルプ ルーティングを提供したいと思うことがあります。または特定のウィンドウまたはダイアログ - おそらく、そのオブジェクトまたはダイアログ ボックス内でアクティブなコントロールの現在の内部の状態に基づいてより詳細なヘルプを提供するとして可能性があります。

WM_COMMANDHELP

afx_msg LRESULT CWnd::OnCommandHelp (WPARAM, LPARAM lParam

WM_COMMANDHELP は、ヘルプが要求されたときに、アクティブなウィンドウで受信される、MFC プライベート Windows メッセージです。このメッセージは、ウィンドウを受信すると、それウィンドウの内部状態と一致するコンテキストでcwinapp::winhelpを呼び出すことができます。

lParam

現在のヘルプ コンテキストを格納します。ヘルプ コンテキストがまだ特定されていない場合 lParam は 0 です。OnCommandHelpの実装はコンテキスト ID では、lParam でを使用して、「よりよい」のコンテキストを確認できますまたはちょうどcwinapp::winhelpを渡すことができます。

wParam

使用されていないとはゼロになります。

Cwinapp::winhelp OnCommandHelp関数を呼び出す場合は、TRUE を返す必要があります。TRUE が他のクラス (基本クラス) と他のウィンドウに次のコマンドのルーティングを返す。

ヘルプ モード (Shift キーを押しながら F1 ヘルプ)

これは、2 番目のフォームのヘルプです。通常、このモードは、SHIFT キーを押しながら F1 キーを押すか [メニュー] ツールバーで入力されます。これは、コマンド (ID_CONTEXT_HELP) として実装されます。このコマンドが、モーダル ダイアログ ボックスを翻訳するメッセージ フィルター フックは使用されません、メニューがアクティブなときに、アプリケーションのメイン メッセージ ポンプ (CWinApp::Run) を実行しているためこのコマンド ユーザーには。

アプリケーション通常それ自身のカーソル (サイズ変更境界線のウィンドウ) などを表示する場合でもこのモードを入力した後、ヘルプのカーソル、アプリケーションのすべての領域に表示されます。ユーザーは、マウスまたはキーボードを使用して、コマンドを選択することです。コマンドを実行するのではなく、そのコマンドのヘルプが表示されます。また、ユーザー、ツールバーのボタンなど、画面上の表示オブジェクトをクリックして、そのオブジェクトのヘルプが表示されます。このモードのヘルプのCWinApp::OnContextHelpによって提供されます。

このループの実行中に、すべてのキーボード入力、メニューをアクセス キー以外のアクティブでないです。また、コマンドの翻訳が、アクセラレータ キーを押して、そのコマンドのヘルプを受信するユーザーを許可するPreTranslateMessageを介して実行されます。

特定の翻訳または SHIFT キーを押しながら F1 ヘルプ モード中に起こるべきではないPreTranslateMessage関数で操作がある場合は、これらの操作を実行する前に、 CWinAppm_bHelpModeメンバーをチェックしてください。PreTranslateMessageCDialog実装この例えばIsDialogMessageを呼び出す前に確認します。これは、モードレス ダイアログ ボックスの「ダイアログ ナビゲーション」キー SHIFT キーを押しながら F1 モード中は無効になります。また、 CWinApp::OnIdleはまだこのループ中に呼び出されます。

ユーザーがメニューからコマンドを選択した場合は、そのコマンドのヘルプとして処理 ( WM_COMMANDHELPを通じて、下記参照)。アプリケーション ウィンドウの表示領域をクリックすると、それは非クライアントまたはクライアント クリックかどうかを決定です。送ら非クライアント クリック クライアント クリックに自動的にマッピングを処理します。クライアントをクリックの場合は、 WM_HELPHITTESTがクリックしてされたウィンドウに送信します。そのウィンドウは 0 以外の値を返す場合、その値としてコンテキスト ヘルプが使用されます。0 を返す場合は、親ウィンドウ送らを試みる (とそれがない場合は、その親、)。ヘルプ コンテキストを判断できない場合は、既定値は [(通常) CWinApp::OnHelpIndexにマップされているメインのウィンドウは、 ID_DEFAULT_HELPコマンドを送信するです。

WM_HELPHITTEST

afx_msg LRESULT CWnd::OnHelpHitTest (WPARAM, LPARAM lParam

WM_HELPHITTEST中に SHIFT キーを押しながら F1 ヘルプ モードをクリックして、アクティブなウィンドウで受信される、MFC プライベート windows メッセージです。ウィンドウこのメッセージを受信すると、DWORD ヘルプの ID の使用によって WinHelp を返します。

Loword (lparam)

マウスがウィンドウのクライアント領域を基準にした x 軸のデバイス座標が含まれています。

HIWORD(lParam)

y 座標が含まれています。

wParam

使用されていないとはゼロになります。戻り値が 0 以外の場合は、WinHelp そのコンテキストで呼び出されます。戻り値が 0 の場合は、親ウィンドウのヘルプを照会します。

多くの場合、すでにがヒット テスト コードを活用できます。CToolBar::OnHelpHitTestの実装 (コード ボタンおよびCControlBarのツールヒントに使用するヒット テスト コードを活用)、 WM_HELPHITTESTメッセージの処理の例を参照してください。

MFC AppWizard のサポート、MAKEHM

AppWizard は、ヘルプ ファイル (.cnt および .hpj ファイル) を作成するには、必要なファイルを作成します。また、作成済みの数が含まれています。Microsoft ヘルプ コンパイラによって受け入れられる RTF ファイル。多くのトピックは完了しますがいくつかは、特定のアプリケーションを変更する必要があります。

「ヘルプ マップ」のファイルの自動作成は、makehm ユーティリティによってサポートされています。MAKEHM ユーティリティは、アプリケーションのリソースを翻訳できます。H ファイルをヘルプ マッピング ファイル。たとえば:

#define IDD_MY_DIALOGnbsp;2000# define ID_MY_COMMAND 150(&N)

翻訳されます。:

HIDD_MY_DIALOGnbsp;0x207d0HID_MY_COMMAND 0X10096(&N)

このフォーマット互換性コンテキスト Id (右側にある番号) をトピック名 (左側にあるシンボル) マップ ヘルプ コンパイラの機能があります。

MAKEHM のソース コードは、MFC プログラミング Utilties サンプルで利用可能です MAKEHM

AppWizard を実行した後のヘルプ サポートを追加します。

アプリケーションにヘルプを追加する最善の方法は、あなたのアプリケーションを作成する前に、「コンテキスト依存ヘルプ」オプション AppWizard の [オプション] ダイアログを確認するです。その方法 AppWizard は、ヘルプをサポートするために、CWinApp 派生クラスに必要なメッセージ マップ エントリを自動的に追加されます。

ヘルプをサポートしていないアプリケーションを既に作成している今それを追加したい場合は、 Visual の C++ プログラマのガイドを参照してください。

メッセージ ボックスにおけるヘルプします。

AfxMessageBox関数、メッセージ ボックスWindows API 用のラッパーを使用 ("警告"とも呼ばれます) のメッセージ ボックスのヘルプがサポートされています。

AfxMessageBox、文字列 ID を使用して別の文字列 (LPCSTR) へのポインターで使用するための 2 つのバージョンします。:

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

両方のケースでは、あるオプションのヘルプの ID。

最初のケースでは、nIDHelp を既定値 0 は、このメッセージ ボックスのヘルプを示しますなしです。ようなメッセージ ボックスがアクティブな間、F1 キーを押した場合は、(ヘルプ アプリケーションをサポートする場合)、ユーザー ヘルプを受け取りません。これが望ましくない場合は、ヘルプの ID nIDHelp を提供する必要があります。

2 番目のケースでは、nIDHelp の既定値は、ヘルプ ID を同じ nIDPrompt であるを示す-1 です。アプリケーションのヘルプが有効になって場合にのみヘルプ動作します)。場合は、メッセージ ボックスのヘルプ サポートをある nIDHelp の 0 を提供する必要があります。有効に、ヘルプが nIDPrompt が異なるヘルプ ID を望む、単に正の値を提供する nIDHelp nIDPrompt から別のメッセージをする必要があります。

番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)

Index