第286章 HTMLヘルプのウィンドウタイプ


今回は、HTMLヘルプのウィンドウタイプについてやります。 これは、自分でヘルプを作ってみないとなかなかピンと来ません。



左の図は、あるHTMLヘルプを起動して、このウィンドウタイプを 調べてクライアント領域に表示したものです。

SizeはHH_WINTYPE構造体の大きさです。

pszTocは、hhc(目次ファイル)の名前、pszIndexは、hhk(索引ファイル)の名前です。

pszFileは、トピックペインに表示するHTMLファイルです。

idNotifyは、これに0以外を指定するとWM_NOTIFYの形で通知メッセージが送られてきます。

hwndHelpは、ヘルプウィンドウが作成され入れていればそのハンドルを示します。

hwndCallerは、HTMLヘルプの通知メッセージを受け取るウィンドウのハンドルです。



HTMLヘルプのウィンドウタイプを取得するにはHH_GET_WIN_TYPEを使います。

HH_GET_WIN_TYPE コマンド pszFileには、chmファイル名とウィンドウタイプを指定します。(xx.chm>mainwin) dwDataには、HH_WINTYPE構造体へのポインタを指定します

HH_WINTPYE構造体は次のように定義されています。

typedef struct tagHH_WINTYPE { int cbStruct; BOOL fUniCodeStrings; LPCTSTR pszType; DWORD fsValidMembers; DWORD fsWinProperties; LPCTSTR pszCaption; DWORD dwStyles; DWORD dwExStyles; RECT rcWindowPos; int nShowState; HWND hwndHelp; HWND hwndCaller; HWND hwndToolBar; HWND hwndNavigation; HWND hwndHTML; int iNavWidth; RECT rcHTML; LPCTSTR pszToc; LPCTSTR pszIndex; LPCTSTR pszFile; LPCTSTR pszHome; DWORD fsToolBarFlags; BOOL fNotExpanded; int curNavType; int idNotify; LPCTSTR pszJump1; LPCTSTR pszJump2; LPCTSTR pszUrlJump1; LPCTSTR pszUrlJump2; } HH_WINTYPE;

それぞれのメンバの説明は次の表を見てください。

cbStructこの構造体のサイズ
fUniCodeStringsユニコードを使うかどうか
pszTypeウィンドウタイプの名前
fsValidMembersこの構造体のメンバで有効なものを指定(*)
fsWinPropertiesウィンドウの性質を指定する(**)
pszCaptionウィンドウのキャプション
dwStylesウィンドウが作られるときのスタイル。
fsValidMembers や fsWinProperties の値によっては無視されることもあります。
dwExStyles拡張スタイル。dwStyle同様無視されることもあります。
rcWindowPosウィンドウの座標
nShowStateウィンドウの初期表示状態。ShowWindow関数と同じ
hwndHelpウィンドウが作成されていればそのハンドル
hwndCallerHTMLヘルプの通知メッセージを受け取るウィンドウのハンドル
idNotify通知メッセージを受け取るには0以外を指定
hwndToolBarツールバーのハンドル
hwndNavigationナビゲーションペインのハンドル
hwndHTMLトピックペインのハンドル
iNavWidth ナビゲーションペインの幅
rcHTML トピックペインの座標
pszToc目次ファイル(*.hhc)の名前
pszIndex索引ファイル(*.hhk)の名前
pszFileトピックペインに表示するHTMLファイルの名前
pszHomeホームとなるファイル
fsToolBarFlagsツールバーに表示するボタン(***)
fNotExpandedナビゲーションペインが閉じていれば開く
curNavTypeナビゲーションペインに表示するタブ(****)
pszJump1[Jump1]ボタンに表示するテキスト
pszJump2 [Jump2]ボタンに表示するテキスト
pszUrlJump1[Jump1]ボタンが押されたときの行き先
pszUrlJump2 [Jump2]ボタンが押されたときの行き先

fsValidMembersの取りうる値は次の1つまたは組み合わせです。

HHWIN_PARAM_CUR_TABcurNavType memberが有効
HHWIN_PARAM_EXPANSIONfNotExpandedが有効
HHWIN_PARAM_EXSTYLESdwExStylesが有効
HHWIN_PARAM_NAV_WIDTHiNavWidthが有効
HHWIN_PARAM_PROPERTIESfsWinPropertiesが有効
HHWIN_PARAM_STYLESdwStylesが有効
HHWIN_PARAM_RECTrcWindowPosが有効
HHWIN_PARAM_SHOWSTATEnShowStateが有効
HHWIN_PARAM_TABPOStabposが有効
HHWIN_PARAM_TB_FLAGSfsToolBarFlagsが有効

fsWinPropertiesメンバは次の組み合わせで指定します。

HHWIN_PROP_AUTO_SYNCトピックに対して目次または索引が同期
HHWIN_PROP_CHANGE_TITLEHTMLヘルプのタイトルバーに トピックのタイトルを表示する
HHWIN_PROP_NAV_ONLY_WINナビゲーションペイントツールバーのみ表示
HHWIN_PROP_NODEF_EXSTYLES 規定の拡張スタイルを使わない。HHWIN_PROP_ONTOPは無視される。
HHWIN_PROP_NODEF_STYLES規定のスタイルを使わず
WS_THICKFRAME | WS_OVERLAPPED | WS_VISIBLEが使われる。
HHWIN_PROP_NOTB_TEXT ツールバーのボタンの下にテキストを表示しない。
HHWIN_PROP_NOTITLEBAR タイトルバーがないウィンドウを作る。
HHWIN_PROP_NO_TOOLBARツールバーがないウィンドウを作る。
HHWIN_PROP_ONTOP デスクトップ上のすべてのウィンドウの前面に表示される。
HHWIN_PROP_POST_QUIT ウィンドウが閉じられるときに呼び出しが輪にWM_QUITメッセージを ポストする。
HHWIN_PROP_TAB_ADVSEARCH ナビゲーションペインにフルテキスト検索タブを持つ。
HHWIN_PROP_TAB_SEARCHが指定されていないと無効です。
HHWIN_PROP_TAB_FAVORITES ナビゲーションペインに「お気に入り」タブを持つ。
HHWIN_PROP_TAB_SEARCH「検索」タブを持つ。
HHWIN_PROP_TRACKING hwndCallerに通知メッセージを送信できるようにする
HHWIN_PROP_TRI_PANE ナビゲーションペイン、トピックペイン、ツールバーからなる ビューアーを作成する。
HHWIN_PROP_USER_POS 次回も同じサイズ、同じ位置で表示する。

fsToolBarFlagsメンバには次の組み合わせを指定します。

HHWIN_BROWSE_BCK[前へ]ボタン
HHWIN_BROWSE_FWD[次へ]ボタン
HHWIN_BUTTON_BACK[戻る]ボタン
HHWIN_BUTTON_CONTENTS[目次]ボタン
HHWIN_BUTTON_EXPAND[表示/非表示]ボタン
HHWIN_BUTTON_FAVORITES[お気に入り]ボタン
HHWIN_BUTTON_FORWARD[進む]ボタン
HHWIN_BUTTON_HOME[ホーム]ボタン
HHWIN_BUTTON_INDEX[キーワード]ボタン
HHWIN_BUTTON_JUMP1[Jump1]ボタン
HHWIN_BUTTON_JUMP2[Jump2]ボタン
HHWIN_BUTTON_OPTIONS[オプション]ボタン
HHWIN_BUTTON_PRINT[印刷]ボタン
HHWIN_BUTTON_REFRESH[更新]ボタン
HHWIN_BUTTON_SEARCH[検索]ボタン
HHWIN_BUTTON_STOP [中止]ボタン
HHWIN_BUTTON_SYNC[同期]ボタン
HHWIN_BUTTON_ZOOM[拡大]ボタン

curNavTypeメンバには次のうちの1つを指定します。 指定されたタブが前面にでます。

HHWIN_NAVTYPE_FAVORITESお気に入りタブを表示する
HHWIN_NAVTYPE_INDEXキーワードタブを表示する
HHWIN_NAVTYPE_SEARCH検索タブを表示する
HHWIN_NAVTYPE_TOC目次タブを表示する

前置きが大変長くなってしまいましたが、プログラムを見てみましょう。

// help02x.rcの一部 ///////////////////////////////////////////////////////////////////////////// // // Menu // MYMENU MENU DISCARDABLE BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "終了(&X)", IDM_END END POPUP "ヘルプ(&H)" BEGIN MENUITEM "ウィンドウタイプ(&W)", IDM_WIN MENUITEM "ヘルプ起動", IDM_HELP END END

メニューのリソース・スクリプトです。

// help02x.cpp #ifndef STRICT #define STRICT #endif #include <windows.h> #include <htmlhelp.h> #include "resource.h" #define HELP "e:\\MyDocument\\htmlhelp\\novo\\insulin.chm > MyWin01" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); BOOL MyGetWinType(HWND, char *); char szClassName[] = "help02x"; //ウィンドウクラス DWORD dwCookie; //クッキー

chmファイルは必ずウィンドウタイプ名も指定します。ここでは自作の insulin.chmを使うことにします。

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&dwCookie); while (GetMessage(&msg, NULL, 0, 0)) { if (!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&dwCookie)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; } //ウィンドウ・クラスの登録 ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; //プロシージャ名 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst;//インスタンス wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = "MYMENU"; //メニュー名 wc.lpszClassName = (LPCSTR)szClassName; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); return (RegisterClassEx(&wc)); } //ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, int nCmdShow) { HWND hWnd; hWnd = CreateWindow(szClassName, "猫でもわかるHTMLHELP", //タイトルバーにこの名前が表示されます WS_OVERLAPPEDWINDOW, //ウィンドウの種類 CW_USEDEFAULT, //X座標 CW_USEDEFAULT, //Y座標 CW_USEDEFAULT, //幅 CW_USEDEFAULT, //高さ NULL, //親ウィンドウのハンドル、親を作るときはNULL NULL, //メニューハンドル、クラスメニューを使うときはNULL hInst, //インスタンスハンドル NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; }

このへんはいつもとほとんど同じですが、HH_INITIALIZEコマンドとHH_PRETRANSLATEMESSAGEコマンド を忘れないでください。

//ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; static char szStr[1024]; HDC hdc; PAINTSTRUCT ps; RECT rc; switch (msg) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); GetClientRect(hWnd, &rc); rc.top += 10; rc.bottom -= 10; rc.left += 10; rc.right -= 10; DrawText(hdc, szStr, -1, &rc, DT_LEFT); EndPaint(hWnd, &ps); break; case WM_COMMAND: switch (LOWORD(wp)) { case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0); break; case IDM_WIN: MyGetWinType(hWnd, szStr); InvalidateRect(hWnd, NULL, TRUE); break; case IDM_HELP: HtmlHelp(hWnd, HELP, HH_DISPLAY_TOPIC, NULL); break; } break; case WM_CLOSE: id = MessageBox(hWnd, "終了してもよいですか", "終了確認", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) { HtmlHelp(NULL, NULL, HH_UNINITIALIZE, (DWORD)&dwCookie); DestroyWindow(hWnd); } break; case WM_DESTROY: HtmlHelp(NULL, NULL, HH_UNINITIALIZE, dwCookie); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }

メインウィンドウのプロシージャです。

WM_PAINTメッセージが来たらDrawText関数でクライアント領域に ウィンドウタイプ情報を書き込みます。DrawTest関数については 第5章を参照してください。

メニューからIDM_WINが選択されたら自作関数MyGetWinTypeを 呼んでszStrにウィンドウタイプの情報を格納します。そして、 無効領域を発生させて、ウィンドウを再描画させます。

IDM_HELPが選択されたらHTMLヘルプを表示します。 ヘルプが表示されているときと、そうでないときにウィンドウタイプ情報を 表示させてその違いを観察してみてください。

アプリケーション終了時にHH_UNINITIALIZEコマンドを忘れないでください。

BOOL MyGetWinType(HWND hWnd, char *lpszStr) { HH_WINTYPE *phType; char szYesNo[16], szThisWin[32], szCurNavType[32]; char *szOrg = "Size = %d\nWindow Type = %s\npszCaption = %s\n" "pszToc = %s\npszIndex = %s\npszFile = %s\nidNotify = %d\n" "UNICODE = %s\npszHome = %s\nhwndHelp = %d\nhwndCaller = %s\n" "デフォルトのペイン = %s\nNavigation Width = %d"; HtmlHelp(hWnd, HELP, HH_GET_WIN_TYPE, (DWORD)&phType); if (phType->fUniCodeStrings) strcpy(szYesNo, "Yes"); else strcpy(szYesNo, "No"); if (phType->hwndCaller == hWnd) strcpy(szThisWin, "This Window"); else strcpy(szThisWin, "?????"); switch (phType->curNavType) { case HHWIN_NAVTYPE_TOC: strcpy(szCurNavType, "目次"); break; case HHWIN_NAVTYPE_SEARCH: strcpy(szCurNavType, "検索"); break; case HHWIN_NAVTYPE_INDEX: strcpy(szCurNavType, "キーワード"); break; case HHWIN_NAVTYPE_FAVORITES: strcpy(szCurNavType, "お気に入り"); break; default: strcpy(szCurNavType, "不明"); break; } wsprintf(lpszStr, szOrg, phType->cbStruct, phType->pszType, phType->pszCaption, phType->pszToc, phType->pszIndex, phType->pszFile, phType->idNotify, szYesNo, phType->pszHome, phType->hwndHelp, szThisWin, szCurNavType, phType->iNavWidth); return TRUE; }

ウィンドウタイプ情報を調べる関数です。ごちゃごちゃしていて見にくいですが 順番に見ていくと、簡単です。

HtmlHelp(hWnd, HELP, HH_GET_WIN_TYPE, (DWORD)&phType);

と最後の引数はphTypeではなく、&phTypeであることに注意してください。


[SDK第3部 Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 03/Sep/2000 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。