MFC
HTML Help を使用する


HomeProgramming TipsMFC Tips[MFC-024]

Visual C++ .net 2003 には HTML Help を最初から支援する機能が備わっています。

しかしこれが大変使いづらく、本当にこれでヘルプを書く人がいるのかと不思議すら思います。
私は、HTML Help を作成するときは、フリーの HTML Project2 でタグをガシガシと書いてます。
 ※このサイトも HTML Project2 でガリガリ手打ちしています。

HTML Help の各種設定やコンパイルは HTML Help for Visual Studio を使用しています。
シェアウェアですが、その金額分の快適さを提供していると思います。
 ※もちろん私は購入済みです。

さて、このように外部ツールを使用して HTML Help を作成した場合、問題は既存のプロジェクトから如何にして呼び出すかです。
HTML Help for Visual Studio のサイトには詳細な解説がありますが、これは、VC++6.0 用に記載されています。
VC++.net2003 は最初からサポートしているはずです。そこでいろいろと調べてみました。

まず、HTML Help を使用するための宣言 EnableHtmlHelp() をアプリクラスのコンストラクタで記述します。
一行追加するだけですが、これだけでアプリ全体が .chm 形式で動作するようになります。
拡張子も最初から .chm になっていますので変更不要です。
※ 分かってしまえばなんて簡単なんだ!悩んでいたのがバカみたいです…


CFooApp::CFooApp()
{
    EnableHtmlHelp();
}


あと、私的には一応起動時に警告を出すのが宜しいかと思います。
ファイルの存在確認は InitInstance() が良いでしょう。


    // ヘルプファイルの存在を確認する
    CFileStatus fileStatus;
    if (!CFile::GetStatus(m_pszHelpFilePath, fileStatus)) {
        CString strErr(_T("ヘルプファイルが見つかりません。\r\n"));
        AfxMessageBox(strErr + m_pszHelpFilePath);
//      return FALSE;
    }


さて、使用するには WM_HELPINFO をオーバーライドします。
pHelpInfo->iCtrlId には、どのコントロールの上でヘルプ起動が指定されたかが分かるように、 そのコントロールの ID が格納されています。
HTML Help の各ページの該当コンテキスト ID には、コントロールの ID 番号をそのまま使用するのが便利です。
そのための支援機能も HTML Help for Visual Studio にはあります。
なお、コンテキスト ID 指定は省略出来ません。そのため、HTML Help 作成時には必ず番号を割り当ててください。
※ HH_DISPLAY_TOPIC を使用すればコンテキスト ID の省略は可能です。


BOOL CFooDlg::OnHelpInfo(HELPINFO* pHelpInfo)
{
    if (pHelpInfo->iCtrlId > 0) {
        switch (pHelpInfo->iCtrlId) {
            case IDC_EDIT_NAME:                 // 名前入力ボックスは
                HtmlHelp(pHelpInfo->iCtrlId);   // そのページを開く
                return TRUE;
        }
        // 指定がない場合はデフォルトページを開く
        HtmlHelp(10000);
        return TRUE;
    }
    return CDialog::OnHelpInfo(pHelpInfo);
}


HtmlHelp() は第2引数にヘルプの開き方をパラメータ指定する事が出来ます。
※ MFC の HtmlHelp() は、Win32API の同名のものとは違います。注意してください。

ここから先は他のサイトでも詳しく掲載されているのでここでの説明は省きます。
とりあえず、Microsoft の該当ヘルプをご紹介しておきます。
MSDN Library: HTML Help API コマンドについて



 Copyright 2008 VALGUS. All Rights Reserved.