オンライン ヘルプの処理
オンライン ヘルプは、詳細な概念情報から簡単な定義まで、さまざまな形式で提供されます。 このトピックは、次のセクションで構成されています。
ヘルプについて
使いやすいアプリケーションの重要な要素は、オンライン ヘルプですぐに入手できます。 Windows には、Windows ヘルプ アプリケーションと組み合わせて使用すると、アプリケーションにオンライン ヘルプを簡単に実装できるようにする関数とメッセージが用意されています。 この概要では、オンライン ヘルプをサポートする Windows の要素について説明します。 これらの要素を使用してユーザーにヘルプを要求する手段を提供する方法と、Windows ヘルプ アプリケーションを使用してヘルプを表示する方法について説明します。
ヘルプリクエスト
ほとんどの Windows ベースのアプリケーションは、アプリケーションの機能の目的を説明する概念的なヘルプから、アプリケーションのユーザー インターフェイス内の個々の要素の迅速な定義を提供するポップアップ ヘルプまで、さまざまな形式でオンライン ヘルプ情報を提供します。 関数とメッセージを使用して、ユーザーにこの情報へのアクセスを要求するさまざまな方法を提供します。 次のセクションでは、これらのヘルプ要求について説明します。
[ヘルプ] メニュー
ほとんどのアプリケーションでは、メイン ウィンドウに [ヘルプ] メニューを含めることで、ヘルプ情報へのユーザー アクセスを提供します。 ユーザーが [ヘルプ ] メニューから項目を選択すると、対応するウィンドウ プロシージャは、選択したアイテムを識別する WM_COMMAND メッセージを受け取ります。 アプリケーションは、ヘルプ トピックの一覧、インデックス、アプリケーションの概要など、適切なヘルプ情報を表示することで応答します。
キーボードからのヘルプ
Windows では、ユーザーが F1 キーを押すたびにアプリケーションに通知することで、キーボードからのヘルプ情報へのユーザー アクセスが提供されます。 システム は、ユーザー がキーを押したときにキーボード フォーカスを持つウィンドウにWM_HELPメッセージを送信します。 ウィンドウが子ウィンドウ (ダイアログ ボックス内のコントロールなど) の場合、 DefWindowProc 関数はメッセージを親ウィンドウに渡します。 F1 キーを押したときにメニューがアクティブな場合、メニューに関連付けられているウィンドウにメッセージが送信されます。 アプリケーションは、フォーカスがある、またはアクティブなウィンドウ、コントロール、またはメニューに関連付けられているヘルプ情報を表示することで応答します。 たとえば、ユーザーがダイアログ ボックスでコントロールを選択し、F1 キーを押すと、そのコントロールのヘルプ情報が表示されます。
WM_HELP の lParam パラメーターは、ヘルプが要求される項目に関する詳細情報を含む HELPINFO 構造体へのポインターです。 この情報を使用して、表示するヘルプ トピックを決定します。 HELPINFO 構造体には、ユーザーがキーを押した時点でのマウス カーソルの座標も含まれます。 この情報を使用すると、マウス カーソルの位置に基づいてヘルプを提供できます。
マウスからのヘルプ
Windows では、ユーザーがマウスの右ボタンをクリックするか、質問 (?) ボタンをクリックした後にウィンドウ、コントロール、またはメニューをクリックするたびにアプリケーションに通知することで、マウスからのヘルプ情報へのユーザー アクセスを提供します。 アプリケーションは、指定されたウィンドウ、コントロール、またはメニューに関連付けられているヘルプ情報を表示することによって応答します。
ユーザーがマウスの右ボタンをクリックすると、 WM_CONTEXTMENU メッセージが送信されます。 クリックされたウィンドウにメッセージが表示されます。 ウィンドウがコントロールなどの子ウィンドウの場合、 DefWindowProc 関数はメッセージを親ウィンドウに渡します。 WM_CONTEXTMENU メッセージは、マウス カーソルの座標を指定します。 x 座標は lParam パラメーターの下位ワードにあり、y 座標は高次ワード内にあります。 ユーザーがコントロールをクリックした場合、 wParam パラメーターはクリックを受け取ったコントロールへのハンドルです。
システム は、ウィンドウ のタイトル バーに表示される [質問 (?)] ボタンをクリックした後、ユーザーがウィンドウ内の項目をクリックすると、WM_HELP メッセージを送信します。 [質問] ボタンをタイトル バーに追加するには、ウィンドウの作成時に CreateWindowEx 関数でWS_EX_CONTEXTHELPスタイルを指定します。 WM_HELP の lParam パラメーターは HELPINFO 構造体へのポインターであり、ヘルプが要求された項目に関する詳細情報 (ユーザーがマウス ボタンをクリックした時点でのマウス カーソルの座標など) が含まれます。
[質問] ボタンは、ダイアログ ボックスでのみ使用することをお勧めします。 これまで、アプリケーションでは、ダイアログ ボックスに [ヘルプ] ボタンを指定することで、ダイアログ ボックスに関する ヘルプ 情報へのユーザー アクセスを提供してきました。 この方法は推奨されなくなりました。 代わりに [質問] ボタンを使用してください。
ヘルプ表示と Windows ヘルプ
アプリケーションがヘルプの要求を受け取ると、適切なヘルプ情報が表示されます。 Windows ヘルプ アプリケーションには一貫したユーザー インターフェイスが用意されているため、アプリケーションでは他の方法ではなく Windows ヘルプを使用することをお勧めします。 Windows ヘルプにヘルプ情報を表示するように指示するために、アプリケーションは WinHelp 関数を使用して、表示する情報や表示するウィンドウの形式などの詳細を指定します。 次のセクションでは、 WinHelp を使用してヘルプ情報を表示する方法について説明します。
ヘルプ ファイル
ヘルプ情報を表示するには、 WinHelp 関数を呼び出すときにヘルプ ファイルを指定する必要があります。 ヘルプ ファイルには、Windows ヘルプ (.hlp) ファイル形式と 1 つ以上のトピックが必要です。 各トピックは、概念的な説明、一連の命令、図、用語集の定義など、個別の情報単位です。 トピックを一意に識別して、Windows ヘルプが要求されるたびにトピックを見つけられるようにする必要があります。 内部的には、Windows ヘルプではトピック識別子を使用してトピックを検索しますが、ほとんどの場合、アプリケーションではコンテキスト識別子 (一意の整数値) を使用して表示するトピックを指定します。 ヘルプ ファイルの作成者は、ヘルプ ファイルのビルドに使用するプロジェクト ファイルの [MAP] セクションで、コンテキスト識別子をトピック識別子に明示的にマップする必要があります。
ヘルプ ファイルを指定してもパスを指定しない場合、 WinHelp はヘルプ ディレクトリまたは PATH 環境変数で指定されたディレクトリ内でヘルプ ファイルを検索します。 さらに、 WinHelp は、次のレジストリの場所に名前が一覧表示されているヘルプ ファイルを見つけることができます。
HKEY_LOCAL_MACHINE
Software
Microsoft
Windows
Help
レジストリを利用するには、ヘルプ ファイルと同じ名前の値名を作成する必要があります。 その名前に割り当てられる値は、ヘルプ ファイルが存在するディレクトリである必要があります。
WinHelp で特定のヘルプ ファイルが見つからない場合は、ユーザーがヘルプ ファイルの場所を指定できるダイアログ ボックスが表示されます。 WinHelp は場所情報をレジストリに保存するため、同じヘルプ ファイルの場所を再度要求することはありません。
ヘルプ ファイルを作成およびビルドする方法の詳細については、開発ツールに付属のドキュメントを参照してください。
Windows ヘルプの開始
次の例では、 WinHelp 関数を使用して Windows ヘルプ アプリケーションを起動し、ヘルプ ファイルをその Contents トピックに開きます。
HWND hwnd; // main window handle
BOOL bResult // for checking Boolean function result
bResult = WinHelp(hWnd, "WINNT.HLP", HELP_CONTENTS, 0L);
次の例では、ユーザー ヘルプ ファイルを開き、キーワード (keyword)文字列に関連付けられているトピックのファイルを検索し、トピックを表示します。
HWND hwnd; // main window handle
BOOL bResult // for checking Boolean function result
bResult = WinHelp(hWnd, "WINNT.HLP", HELP_KEY, (DWORD) "finding topics");
[ヘルプ トピック] ダイアログ ボックス
[ヘルプ トピック] ダイアログ ボックスは、HELP_FINDER コマンドを使用して WinHelp 関数を呼び出すことで表示できます。 [ ヘルプ トピック ] ダイアログ ボックスでは、トピックのタイトル、トピックに関連付けられているキーワード、またはトピック内の単語と語句を表示して、表示するトピックを選択できます。 通常、アプリケーションは、ユーザーが [ヘルプ] メニューから [ヘルプ トピック] などのコマンドを選択すると、このダイアログ ボックスを表示します。 また、アプリケーション内の特定のウィンドウ、コントロール、またはメニューにフォーカスがない場合やアクティブな場合に、ユーザーがキーを押すと、このダイアログ ボックスが表示される場合もあります。
これまで、アプリケーションでは、WinHelp 関数を使用して HELP_CONTENTS コマンドと HELP_INDEX コマンドを使用して、Contents トピックとヘルプ ファイルのキーワード (keyword) インデックスを表示してきました。 これらのコマンドは推奨されなくなりました。 代わりに HELP_FINDER コマンドを使用してください。
情報に関するトピック
特定のトピックを表示するには、HELP_CONTEXT コマンドを使用して WinHelp 関数を呼び出し、トピックのコンテキスト識別子を指定します。 通常、アプリケーションは、特定のコントロールやメニューに関する情報ではなく、概念情報や手続き型ヘルプを含むトピックに対するユーザーの要求に応じて、HELP_CONTEXT コマンドを使用します。 このような場合、ユーザーはアプリケーションに戻る前に、ヘルプ ファイルを参照して関連情報を探し続けることができます。
HELP_CONTEXT コマンドは、Windows ヘルプの通常のインスタンスを呼び出し、ユーザーがヘルプ ファイル内の他のトピックを見つけられるようにします。 通常、メイン ヘルプ ウィンドウが表示されます。これには、タイトル バー、システム メニュー、最小化と最大化ボタン、メイン メニュー、オプションのナビゲーション バー、サイズ設定の境界線、クライアント領域が含まれます。 選択したトピックのテキストがクライアント領域に表示され、ユーザーはメイン ウィンドウでホット リンクまたはナビゲーション ボタンを使用してヘルプ ファイル内を移動できます。 Windows ヘルプの通常のインスタンスを使用して、メイン ウィンドウではなく 1 つ以上のセカンダリ ウィンドウにヘルプを表示することもできます。
ポップアップ トピック
HELP_WM_HELP または HELP_CONTEXTMENU コマンドを使用して WinHelp 関数を呼び出すことで、特定のコントロールまたはメニューの情報を含むポップアップ トピックを表示できます。 これらのコマンドは、対応するコントロールまたはメニューの近くのポップアップ ウィンドウにトピックを表示します。 ユーザーがアプリケーションですぐに作業に戻るようにするには、ユーザーがキーを押すか、マウスの左ボタンをクリックするとすぐにポップアップ ウィンドウが破棄されます。
コントロール ウィンドウのメッセージを処理する場合は 、HELP_WM_HELP コマンドWM_HELP 使用します。 ほとんどのコントロールは WM_HELP メッセージを DefWindowProc 関数に渡すので、対応するダイアログ ボックス プロシージャ (または親ウィンドウ プロシージャ) がこのメッセージを処理します。 ダイアログ ボックス プロシージャは、特定のコンテキスト識別子を指定するのではなく、WM_HELP メッセージで渡される HELPINFO 構造体の hItemHandle メンバーで指定されたコントロール ハンドルと共に、コントロールとコンテキスト識別子のペアの配列をWinHelp に渡す必要があります。 関数は、 WM_HELP メッセージが生成されたコントロールの識別子を決定し、一致するコンテキスト識別子を使用して適切なトピックを表示します。
メッセージを処理するときは、HELP_CONTEXTMENU コマンド WM_CONTEXTMENU 使用します。 ほとんどのコントロールは WM_CONTEXTMENU メッセージを DefWindowProc 関数に渡すので、対応するダイアログ ボックス プロシージャ (または親ウィンドウ プロシージャ) がこのメッセージを処理します。 プロシージャは、コントロールとコンテキスト識別子のペアの配列を指定します。また、WinHelp を呼び出すときに wParam パラメーターのハンドルを指定して、関数が配列から適切なコンテキスト識別子を選択し、適切なトピックを表示できるようにします。 HELP_WM_HELP コマンドとは異なり、HELP_CONTEXTMENU最初にメニューに [What's This? ] コマンドが表示されます。 ユーザーがコマンドを選択すると、 WinHelp によってトピックが表示されます。 それ以外の場合、要求は取り消されます。
HELP_CONTEXTPOPUP コマンドを使用し、トピックのコンテキスト識別子を指定することで、ポップアップ トピックを表示することもできます。 このコマンドは、HELP_CONTEXT コマンドに似ていますが、HELP_WM_HELPおよびHELP_CONTEXTMENUで使用される Windows ヘルプのポップアップ インスタンスを呼び出します。 アプリケーションでは、 WM_HELP メッセージに 応答してこのコマンドを使用して、メニューおよびダイアログ ボックス内のコントロールではないウィンドウのヘルプを表示できます。 このコマンドを最も効果的に使用するには、アプリケーションはこれらのメニューとウィンドウにコンテキスト識別子を割り当てる必要があります。
コンテキスト識別子は、アプリケーション内の任意のウィンドウまたはメニューに割り当てることができます。 WM_HELP メッセージが生成されると、システムは、WM_HELP メッセージの親ウィンドウに渡される HELPINFO 構造体にコンテキスト識別子を含めます。 その後、親ウィンドウはコンテキスト識別子を WinHelp に渡して、要求されたヘルプ トピックを表示できます。
SetWindowContextHelpId 関数を使用して、ウィンドウまたはコントロールにコンテキスト識別子を割り当て、SetMenuContextHelpId 関数を使用してコンテキスト識別子をメニューに割り当てます。 ウィンドウまたはメニューのコンテキスト識別子を取得するには、 GetWindowContextHelpId または GetMenuContextHelpId 関数を使用します。
キーワード検索
ヘルプ ファイル内のトピックにキーワードを割り当てることで、ユーザーがトピックを検索して表示できるようにすることができます。 キーワード (keyword)は、単に 1 つ以上のトピックに関連付けられた文字列です。 Windows ヘルプでは、ヘルプ ファイル内のすべてのキーワードが収集され、テーブルに配置され、[ ヘルプ トピック ] ダイアログ ボックスの [インデックス] リストに表示されます。 ユーザーがキーワード (keyword)を選択すると、関連付けられているヘルプ トピックが表示されます。また、キーワード (keyword)に関連付けられているトピックが複数ある場合は、ユーザーが選択できるトピックの一覧が表示されます。
アプリケーションでは、 WinHelp 関数と共に HELP_KEY、HELP_PARTIALKEY、または HELP_MULTIKEY コマンドを使用して、全体または部分的なキーワードに基づいてヘルプ トピックを検索および表示できます。 コマンド、キーワード (keyword)文字列、ヘルプ ファイル、所有者ウィンドウへのハンドルを指定します。 いずれの場合も、1 つの一致が見つかった場合、 WinHelp は対応するトピックを表示します。 複数の一致が見つかった場合、関数は [見つかったトピック] ダイアログ ボックスを表示し、表示するトピックをユーザーが選択できます。 一致するものが見つからない場合、 WinHelp はインデックス リスト (HELP_KEYとHELP_PARTIALKEY) を表示するか、エラー メッセージ (HELP_MULTIKEYの場合) を表示します。
アプリケーションでは、キーワードをセミコロンで区切ることで、 WinHelp の 1 回の呼び出しで複数のキーワードを検索できます。 (Windows バージョン 3 用に作成されたヘルプ ファイルでは、複数のキーワードの検索はサポートされていません。x) 指定されたヘルプ ファイルに :Index または :Link コマンドを含む contents(.cnt) ファイルがある場合は、複数のヘルプ ファイル間でキーワードを検索することもできます。 HELP_KEY コマンドを使用すると、 WinHelp は、これらのコマンドで指定されたすべてのファイル内のキーワードを検索します。 HELP_MULTIKEY コマンドと HELP_PARTIALKEY コマンドを使用すると、:Link コマンドで指定されているものを除くすべてのファイルが検索されます。
既定では、Windows ヘルプは、ヘルプ ソース ファイルの K 脚注文字で識別されるキーワード (keyword)テーブルのみを認識します。 ヘルプ ソース ファイルに K 以外の脚注文字とキーワード (keyword)定義を追加することで、Windows ヘルプに追加のキーワード (keyword) テーブルを作成するように指示できます。 (ただし、脚注文字 A は予約されています)。ヘルプ ファイルの作成時にプロジェクト ファイルの [OPTIONS] セクションで MULTIKEY ステートメントを使用して、追加のキーワード (keyword) テーブルを定義する必要があります。
アプリケーションでは、WinHelp 関数と共に HELP_SETINDEX コマンドを使用して、Windows ヘルプに対して、インデックス リストに K 以外のキーワード (keyword) テーブルを表示するように指示できます。 Windows ヘルプで代替キーワード (keyword) テーブル内のキーワード (keyword)を検索するように指示するには、アプリケーションで HELP_MULTIKEY コマンドを使用できます。 MULTIKEYHELP 構造体にキーワード (keyword)テーブルと キーワード (keyword) テーブルを指定します。このテーブルは WinHelp に渡します。
WinHelp は、トピックを表示するときに、トピックの ">" 脚注で指定されたウィンドウ、コンテンツ ファイルの :Base コマンドで指定されたウィンドウ、またはメイン ウィンドウに表示します。 WinHelp を呼び出すときにメイン ウィンドウが別のヘルプ ファイルに既に開いている場合、関数は検索中にメイン ウィンドウを非表示にします。 この場合、[見つかったトピック] ダイアログ ボックスと [ヘルプ トピック] ダイアログ ボックスの両方をキャンセルすると、メイン ウィンドウが閉じます。
セカンダリ ヘルプ ウィンドウ
Windows ヘルプ アプリケーションのメイン ウィンドウは、プライマリ ウィンドウと呼ばれます。 Windows ヘルプでは、セカンダリ ウィンドウにヘルプ トピックを表示することもできます。 プライマリ ヘルプ ウィンドウとは異なり、セカンダリ ウィンドウにはメニュー バーは含まれません。 セカンダリ ウィンドウにナビゲーション バーを含め、バーにボタンを追加できます。 また、Windows ヘルプで、トピックに合わせてセカンダリ ウィンドウの高さを自動的に調整することもできます。
ヘルプ プロジェクト ファイルの [WINDOWS] セクションでセカンダリ ウィンドウを定義し、各ウィンドウの名前と、必要に応じて初期サイズと位置を指定する必要があります。 トピックをセカンダリ ウィンドウに表示するように Windows ヘルプ アプリケーションに指示するには、山かっこ (>) と、セカンダリ ウィンドウに対して定義した名前をヘルプ ファイルの名前に追加します。 その後、結果の文字列が WinHelp 関数に渡されます。
アプリケーションは、WinHelp の呼び出しで HELPWININFO 構造体のアドレスとHELP_SETWINPOS コマンドを指定することで、プライマリ ウィンドウまたはセカンダリ ウィンドウのサイズと位置を変更できます。 HELPWININFO は、ウィンドウの名前とその新しいサイズと位置を指定します。
トレーニングカードヘルプ
トレーニング カードヘルプを使用して、アプリケーションは一連の手順を表示して、タスクの手順をユーザーに案内できます。 トレーニング カードは、通常、TCard マクロに関連付けられている特定の手順とボタンを説明するテキストで構成されます。これにより、ユーザーは次に何を行うかをアプリケーションに伝えることができます。 トレーニング カードはセカンダリ ウィンドウでのみ表示でき、ヘルプ ファイル内の他のトピックへのホット リンクを含めてはなりません。
アプリケーションは、WinHelp 関数を呼び出し、HELP_TCARD コマンドを別のコマンド (HELP_CONTEXT など) と組み合わせて指定することで、Windows ヘルプのトレーニング カード インスタンスを開始します。 その後、ユーザーがトレーニング カード内のボタンをクリックしたり、TCard マクロに割り当てられたホット スポットをクリックしたり、トレーニング カードを閉じると、Windows ヘルプはアプリケーションにWM_TCARDメッセージを送信して通知します。 wParam パラメーターはボタンまたはユーザー アクションを識別し、lParam パラメーターには追加のデータが含まれており、その意味は wParam の値によって異なります。
ヘルプの取り消し
Windows ヘルプでは、アプリケーションとそのヘルプ ファイルを追跡するために使用されるすべてのリソースを解放できるように、アプリケーションでヘルプを明示的に取り消す必要があります。 アプリケーションでは、 WinHelp 関数を呼び出し、HELP_QUIT コマンドを指定することで、いつでもこれを行うことができます。 これは、Windows ヘルプのポップアップ インスタンスには当てはまらないことに注意してください。 アプリケーションがポップアップ インスタンスを閉じないようにする必要があります。
アプリケーションが WinHelp を呼び出した場合は、メイン ウィンドウを閉じる前にヘルプを取り消す必要があります (たとえば、メイン ウィンドウ プロシージャのWM_DESTROY メッセージに応答)。 アプリケーションは、開いているヘルプ ファイルの数に関係なく、ヘルプを取り消すために WinHelp を 1 回だけ呼び出す必要があります。 Windows ヘルプは、すべてのアプリケーションまたは DLL がヘルプを取り消すまで引き続き実行されます。
Windows ヘルプのトレーニング カード インスタンスを閉じるには、WinHelp を呼び出すときに HELP_TCARD コマンドと HELP_QUIT コマンドの両方を指定する必要があります。 ユーザーが最初に取り消した場合、アプリケーションは Windows ヘルプのトレーニング カード インスタンスを取り消す必要はありません。 Windows ヘルプでは、ユーザーがトレーニング カード インスタンスをキャンセルしたときに、wParam パラメーターが IDCLOSE に設定されたWM_TCARD メッセージを送信して、アプリケーションに通知します。
ヘルプの使用
このセクションでは、ダイアログ ボックスの状況依存のヘルプを提供する方法と、セカンダリ ヘルプ ウィンドウの外観を設定する方法について説明します。
ダイアログ ボックスでのヘルプの提供
ダイアログ ボックスで状況依存のヘルプを提供するには、 DWORD 値のペアで構成される配列を作成する必要があります。 各ペアの最初の値はダイアログ ボックス内のコントロールの識別子で、2 番目の値はコントロールのヘルプ トピックのコンテキスト識別子です。 配列には、ダイアログ ボックス内のコントロールごとに 1 組の識別子が含まれている必要があります。
ダイアログ ボックス プロシージャは、 WM_HELP と WM_CONTEXTMENU メッセージを処理する必要があります。 ダイアログ ボックスプロシージャは、ユーザーがキーを押したときに WM_HELP を受け取り、ユーザーがマウスの右ボタンをクリックしたときに WM_CONTEXTMENU します。
WM_HELP の lParam パラメーターには、HELPINFO 構造体のアドレスが含まれています。 この構造体の hItemHandle メンバーは、ユーザーがヘルプを要求したコントロールを識別します。 このハンドルは、HELP_WM_HELP コマンド、ヘルプ ファイルの名前、識別子の配列へのポインターと共に WinHelp 関数に渡す必要があります。 WinHelp 関数は、指定されたコントロールのコントロール識別子を配列で検索し、対応するヘルプ コンテキスト識別子を取得します。 次に、関数はヘルプ コンテキスト識別子を Windows ヘルプに渡します。これにより、対応するトピックが検索され、ポップアップ ウィンドウに表示されます。 コントロールの識別子が -1 の場合、システムはタブ位置である次のコントロールを検索し、その識別子を使用してヘルプ コンテキスト識別子を検索します。 このため、リソース ファイル内のコントロールの前に静的テキストを配置することが重要です。
WinHelp 関数を呼び出すとき、WM_CONTEXTMENUの処理は、次の 2 つの例外を含む処理WM_HELPに似ています。
- メッセージを送信したコントロールへのハンドルである WM_CONTEXTMENU から wParam パラメーターを渡します。
- HELP_WM_HELPではなく、HELP_CONTEXTMENU コマンドを指定します。
HELP_CONTEXTMENU コマンドを実行すると、Windows ヘルプはヘルプ トピックを表示する前にメニューを表示します。 メニューはシステム定義です。 これにより、ユーザーはコントロールのヘルプを表示したり、[ ヘルプ トピック ] ダイアログ ボックスを表示したりできます。
次の例は、ダイアログ ボックスに状況依存のヘルプを実装する方法を示しています。
LRESULT CALLBACK EditDlgProc(HWND hwndDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
// Create an array of control identifiers and context identifiers.
static DWORD aIds[ ] =
{
ID_SAVE, IDH_SAVE,
ID_DELETE, IDH_DELETE,
ID_COPY, IDH_COPY,
ID_PASTE, IDH_PASTE,
0,0
};
switch (uMsg)
{
case WM_HELP:
WinHelp(((LPHELPINFO)lParam)->hItemHandle, "helpfile.hlp",
HELP_WM_HELP, (DWORD)(LPSTR)aIds);
break;
case WM_CONTEXTMENU:
WinHelp((HWND)wParam, "helpfile.hlp", HELP_CONTEXTMENU,
(DWORD)(LPVOID)aIds);
break;
// Process other messages here.
}
return FALSE;
}
セカンダリ ヘルプ ウィンドウの外観の設定
アプリケーションでは、HELP_SETWINPOS コマンドと HELPWININFO 構造体のアドレスを WinHelp 関数に渡すことで、セカンダリ ヘルプ ウィンドウのサイズ、位置、および表示状態を設定できます。 HELPWININFO のメンバーは、変更するウィンドウの名前と、ウィンドウの新しいサイズ、位置、および表示状態を指定します。
次の例では、"wnd_menu" という名前のセカンダリ ウィンドウの外観を設定します。 名前は、ヘルプ プロジェクト ファイルの [WINDOWS] セクションで定義する必要があります。
BOOL DoWindowSize(VOID)
{
HANDLE hhwi;
LPHELPWININFO lphwi;
WORD wSize;
char *szWndName = "wnd_menu";
size_t NameLength; // Does not include the terminating null character
HRESULT hr
BOOL retval;
hr = StringCbLengthA(szWndName, STRSAFE_MAX_CCH, &NameLength);
if (SUCCEEDED(hr))
{
// Add 1 to account for the name string's terminating null character.
NameLength++;
// The HELPWININFO structure contains a minimal TCHAR array of size [2]
// that is used for the window name. Since sizeof(HELPWININFO)
// includes those two TCHARS, they must be subtracted from the
// total when adding the actual string length to calculate the
// size of the structure.
wSize = sizeof(HELPWININFO) - 2 + NameLength;
}
else
// Something's amiss with the string.
return FALSE;
hhwi = GlobalAlloc(GHND, wSize);
lphwi = (LPHELPWININFO)GlobalLock(hhwi);
lphwi->wStructSize = wSize;
lphwi->x = 256; // horizontal position
lphwi->y = 256; // vertical position
lphwi->dx = 767; // width
lphwi->dy = 512; // height
lphwi->wMax = SW_SHOW; // show the window
// secondary window
hr = StringCbCopyA(lphwi->rgchMember, sizeof(lphwi->rgchMember), szWndName);
if (SUCCEEDED(hr))
{
WinHelp(hwnd, "myhelp.hlp", HELP_SETWINPOS, (DWORD)lphwi);
GlobalUnlock(hhwi);
GlobalFree(hhwi);
return TRUE;
}
else
// There was a problem copying the window name.
return FALSE;
}