左の図は、あるHTMLヘルプを起動して、このウィンドウタイプを
調べてクライアント領域に表示したものです。
SizeはHH_WINTYPE構造体の大きさです。
pszTocは、hhc(目次ファイル)の名前、pszIndexは、hhk(索引ファイル)の名前です。
pszFileは、トピックペインに表示するHTMLファイルです。
idNotifyは、これに0以外を指定するとWM_NOTIFYの形で通知メッセージが送られてきます。
hwndHelpは、ヘルプウィンドウが作成され入れていればそのハンドルを示します。
hwndCallerは、HTMLヘルプの通知メッセージを受け取るウィンドウのハンドルです。
HTMLヘルプのウィンドウタイプを取得するにはHH_GET_WIN_TYPEを使います。
HH_WINTPYE構造体は次のように定義されています。HH_GET_WIN_TYPE コマンド pszFileには、chmファイル名とウィンドウタイプを指定します。(xx.chm>mainwin) dwDataには、HH_WINTYPE構造体へのポインタを指定します
それぞれのメンバの説明は次の表を見てください。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 | ウィンドウが作成されていればそのハンドル | hwndCaller | HTMLヘルプの通知メッセージを受け取るウィンドウのハンドル | 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_TAB | curNavType memberが有効 |
HHWIN_PARAM_EXPANSION | fNotExpandedが有効 |
HHWIN_PARAM_EXSTYLES | dwExStylesが有効 |
HHWIN_PARAM_NAV_WIDTH | iNavWidthが有効 |
HHWIN_PARAM_PROPERTIES | fsWinPropertiesが有効 |
HHWIN_PARAM_STYLES | dwStylesが有効 |
HHWIN_PARAM_RECT | rcWindowPosが有効 |
HHWIN_PARAM_SHOWSTATE | nShowStateが有効 |
HHWIN_PARAM_TABPOS | tabposが有効 |
HHWIN_PARAM_TB_FLAGS | fsToolBarFlagsが有効 |
fsWinPropertiesメンバは次の組み合わせで指定します。
HHWIN_PROP_AUTO_SYNC | トピックに対して目次または索引が同期 |
HHWIN_PROP_CHANGE_TITLE | HTMLヘルプのタイトルバーに トピックのタイトルを表示する |
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
chmファイルは必ずウィンドウタイプ名も指定します。ここでは自作の insulin.chmを使うことにします。// 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; //クッキー
このへんはいつもとほとんど同じですが、HH_INITIALIZEコマンドとHH_PRETRANSLATEMESSAGEコマンド を忘れないでください。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; }
メインウィンドウのプロシージャです。//ウィンドウプロシージャ 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であることに注意してください。
Update 03/Sep/2000 By Y.Kumei