/*! 外部HTMLヘルプ @param helpfile [in] HTMLヘルプファイル名.NULLのときはタイプ別に設定されたファイル. @param kwd [in] 検索キーワード.NULLのときはカーソル位置or選択されたワード @date 2002.07.05 genta 任意のファイル・キーワードの指定ができるよう引数追加 */ void CViewCommander::Command_EXTHTMLHELP( const WCHAR* _helpfile, const WCHAR* kwd ) { std::tstring helpfile; if( _helpfile != NULL ){ helpfile = to_tchar(_helpfile); } HWND hwndHtmlHelp; int nLen; DEBUG_TRACE( _T("helpfile=%ts\n"), helpfile.c_str() ); // From Here Jul. 5, 2002 genta const TCHAR *filename = NULL; if ( 0 == helpfile.length() ){ while( !CHelpManager().ExtHTMLHelpIsSet( &(GetDocument()->m_cDocType.GetDocumentAttribute())) ){ ErrorBeep(); // From Here Sept. 15, 2000 JEPRO // [Esc]キーと[x]ボタンでも中止できるように変更 if( IDYES != ::MYMESSAGEBOX( NULL, MB_YESNOCANCEL | MB_ICONEXCLAMATION | MB_APPLMODAL | MB_TOPMOST, GSTR_APPNAME, // To Here Sept. 15, 2000 LS(STR_ERR_CEDITVIEW_CMD02) ) ){ return; } /* 共通設定 プロパティシート */ if( !CEditApp::getInstance()->OpenPropertySheet( ID_PROPCOM_PAGENUM_HELPER ) ){ return; } } filename = CHelpManager().GetExtHTMLHelp( &(GetDocument()->m_cDocType.GetDocumentAttribute()) ); } else { filename = helpfile.c_str(); } // To Here Jul. 5, 2002 genta // Jul. 5, 2002 genta // キーワードの外部指定を可能に CNativeW cmemCurText; if( kwd != NULL && kwd[0] != _T('\0') ){ cmemCurText.SetString( kwd ); } else { /* 現在カーソル位置単語または選択範囲より検索等のキーを取得 */ m_pCommanderView->GetCurrentTextForSearch( cmemCurText ); } /* HtmlHelpビューアはひとつ */ if( CHelpManager().HTMLHelpIsSingle( &(GetDocument()->m_cDocType.GetDocumentAttribute())) ){ // タスクトレイのプロセスにHtmlHelpを起動させる // 2003.06.23 Moca 相対パスは実行ファイルからのパス // 2007.05.21 ryoji 相対パスは設定ファイルからのパスを優先 TCHAR* pWork=GetDllShareData().m_sWorkBuffer.GetWorkBuffer<TCHAR>(); if( _IS_REL_PATH( filename ) ){ GetInidirOrExedir( pWork, filename ); }else{ _tcscpy( pWork, filename ); // Jul. 5, 2002 genta } nLen = _tcslen( pWork ); _tcscpy( &pWork[nLen + 1], cmemCurText.GetStringT() ); hwndHtmlHelp = (HWND)::SendMessageAny( GetDllShareData().m_sHandles.m_hwndTray, MYWM_HTMLHELP, (WPARAM)GetMainWindow(), 0 ); } else{ /* 自分でHtmlHelpを起動させる */ HH_AKLINK link; link.cbStruct = sizeof( link ) ; link.fReserved = FALSE ; link.pszKeywords = cmemCurText.GetStringT(); link.pszUrl = NULL; link.pszMsgText = NULL; link.pszMsgTitle = NULL; link.pszWindow = NULL; link.fIndexOnFail = TRUE; // 2003.06.23 Moca 相対パスは実行ファイルからのパス // 2007.05.21 ryoji 相対パスは設定ファイルからのパスを優先 if( _IS_REL_PATH( filename ) ){ TCHAR path[_MAX_PATH]; GetInidirOrExedir( path, filename ); // Jul. 6, 2001 genta HtmlHelpの呼び出し方法変更 hwndHtmlHelp = OpenHtmlHelp( NULL/*GetDllShareData().m_sHandles.m_hwndTray*/, path, // Jul. 5, 2002 genta HH_KEYWORD_LOOKUP, (DWORD_PTR)&link ); }else{ // Jul. 6, 2001 genta HtmlHelpの呼び出し方法変更 hwndHtmlHelp = OpenHtmlHelp( NULL/*GetDllShareData().m_sHandles.m_hwndTray*/, filename, // Jul. 5, 2002 genta HH_KEYWORD_LOOKUP, (DWORD_PTR)&link ); } } // Jul. 6, 2001 genta hwndHtmlHelpのチェックを追加 if( hwndHtmlHelp != NULL ){ ::BringWindowToTop( hwndHtmlHelp ); } return; }
/*! WinHelp のかわりに HtmlHelp を呼び出す @author ryoji @date 2006.07.22 ryoji 新規 */ BOOL MyWinHelp(HWND hwndCaller, UINT uCommand, DWORD_PTR dwData) { UINT uCommandOrg = uCommand; // WinHelp のコマンド bool bDesktop = false; // デスクトップを親にしてヘルプ画面を出すかどうか HH_POPUP hp; // ポップアップヘルプ用の構造体 // Note: HH_TP_HELP_CONTEXTMENU や HELP_WM_HELP ではヘルプコンパイル時の // トピックファイルを Cshelp.txt 以外にしている場合、 // そのファイル名を .chm パス名に追加指定する必要がある。 // 例)sakura.chm::/xxx.txt switch( uCommandOrg ) { case HELP_COMMAND: // [ヘルプ]-[目次] case HELP_CONTENTS: uCommand = HH_DISPLAY_TOC; hwndCaller = ::GetDesktopWindow(); bDesktop = true; break; case HELP_KEY: // [ヘルプ]-[キーワード検索] uCommand = HH_DISPLAY_INDEX; hwndCaller = ::GetDesktopWindow(); bDesktop = true; break; case HELP_CONTEXT: // メニュー上での[F1]キー/ダイアログの[ヘルプ]ボタン uCommand = HH_HELP_CONTEXT; hwndCaller = ::GetDesktopWindow(); bDesktop = true; break; case HELP_CONTEXTMENU: // コントロール上での右クリック case HELP_WM_HELP: // [?]ボタンを押してコントロールをクリック/コントロールにフォーカスを置いて[F1]キー uCommand = HH_DISPLAY_TEXT_POPUP; { // ポップアップヘルプ用の構造体に値をセットする HWND hwndCtrl; // ヘルプ表示対象のコントロール int nCtrlID; // 対象コントロールの ID DWORD* pHelpIDs; // コントロール ID とヘルプ ID の対応表へのポインタ memset(&hp, 0, sizeof(hp)); // 構造体をゼロクリア hp.cbStruct = sizeof(hp); hp.pszFont = _T("MS Pゴシック, 9"); hp.clrForeground = hp.clrBackground = -1; hp.rcMargins.left = hp.rcMargins.top = hp.rcMargins.right = hp.rcMargins.bottom = -1; if( uCommandOrg == HELP_CONTEXTMENU ){ // マウスカーソル位置から対象コントロールと表示位置を求める if( !::GetCursorPos(&hp.pt) ) return FALSE; hwndCtrl = ::WindowFromPoint(hp.pt); } else{ // 対象コントロールは hwndCaller // [F1]キーの場合もあるので対象コントロールの位置から表示位置を決める RECT rc; hwndCtrl = hwndCaller; if( !::GetWindowRect( hwndCtrl, &rc ) ) return FALSE; hp.pt.x = (rc.left + rc.right) / 2; hp.pt.y = rc.top; } // 対象コントロールに対応するヘルプ ID を探す nCtrlID = ::GetDlgCtrlID( hwndCtrl ); if( nCtrlID <= 0 ) return FALSE; pHelpIDs = (DWORD*)dwData; for (;;) { if( *pHelpIDs == 0 ) return FALSE; // 見つからなかった if( *pHelpIDs == (DWORD)nCtrlID ) break; // 見つかった pHelpIDs += 2; } hp.idString = *(pHelpIDs + 1); // 見つけたヘルプ ID を設定する dwData = (DWORD_PTR)&hp; // 引数をポップアップヘルプ用の構造体に差し替える } break; default: return FALSE; } LPCTSTR lpszHelp = GetHelpFilePath(); if( IsFileExists( lpszHelp, true ) ){ // HTML ヘルプを呼び出す HWND hWnd = OpenHtmlHelp( hwndCaller, lpszHelp, uCommand, dwData ); if (bDesktop && hWnd != NULL){ ::SetForegroundWindow( hWnd ); // ヘルプ画面を手前に出す } } else { if( uCommandOrg == HELP_CONTEXTMENU) return FALSE; // 右クリックでは何もしないでおく // オンラインヘルプを呼び出す if( uCommandOrg != HELP_CONTEXT ) dwData = 1; // 目次ページ TCHAR buf[256]; _stprintf( buf, _T("https://sakura-editor.github.io/help/HLP%06Iu.html"), dwData ); ShellExecute( ::GetActiveWindow(), NULL, buf, NULL, NULL, SW_SHOWNORMAL ); } return TRUE; }