第37回 「プロパティ」「保存」「ページ内検索」「ショートカット作成」を実装する (タブブラウザーを作る)

tabbrowser152.gif
今回はいくつかの簡単に実現できるメニュー項目の実装を行う。

「ファイル」メニューの「上書き保存」「名前を付けて保存」「プロパティ」および「編集」メニューの「このページの検索」機能はIWebBrowser2::ExecWBを呼び出すことで実行できる。

「ファイル」メニューの「送信」にある「ショートカットをデスクトップへ」はIWebBrowser2からIShellBrowserを取り出してIOleCommandTarget::Execにより実行できる。

これらの実装をCIEUtilityに追加する。
	//■追加
	bool	Save(void)
	{
		if(_pIWebBrowser2 == NULL)
			return	false;
		return	SUCCEEDED(_pIWebBrowser2->ExecWB(OLECMDID_SAVE,MSOCMDEXECOPT_DODEFAULT,NULL,NULL)) ? true : false;
	}

	//■追加
	//mhtには対応しない
	bool	SaveAs(void)
	{
		CComVariant	vIn(L"");			//これでファイル名指定

		if(_pIWebBrowser2 == NULL)
			return	false;
		return	SUCCEEDED(_pIWebBrowser2->ExecWB(OLECMDID_SAVEAS,MSOCMDEXECOPT_DODEFAULT,&vIn,NULL)) ? true : false;
	}

	//■追加
	bool	ShowProperty(void)
	{
		if(_pIWebBrowser2 == NULL)
			return	false;
		return	SUCCEEDED(_pIWebBrowser2->ExecWB(OLECMDID_PROPERTIES,OLECMDEXECOPT_PROMPTUSER,NULL,NULL)) ? true : false;
	}

	//■追加
	bool	ShowFind(void)
	{
		if(_pIWebBrowser2 == NULL)
			return	false;
		return	SUCCEEDED(_pIWebBrowser2->ExecWB(OLECMDID_FIND,OLECMDEXECOPT_PROMPTUSER,NULL,NULL)) ? true : false;
	}

	//■追加
	HRESULT	ExecExplorer(IWebBrowser2* pIWebBrowser2,DWORD nCmdID,DWORD nCmdExecOpt,VARIANTARG *pvaIn,VARIANTARG *pvaOut)
	{
		HRESULT		hr;
		CComPtr<IShellBrowser>		pIShellBrowser;

		if(pIWebBrowser2 == NULL)
			return	E_FAIL;

		hr = IUnknown_QueryService(pIWebBrowser2,SID_STopLevelBrowser,IID_IShellBrowser,(void**)&pIShellBrowser);
		if(SUCCEEDED(hr))
			hr = IUnknown_Exec(pIShellBrowser,&CGID_Explorer,nCmdID,nCmdExecOpt,pvaIn,pvaOut);

		return	hr;
	}

	//■追加
	bool	CreateShortcut(void)
	{
		//定数はshlobj.hから
		#ifndef	SBCMDID_CREATESHORTCUT
			#define SBCMDID_CREATESHORTCUT		17
		#endif

		return	SUCCEEDED(ExecExplorer(_pIWebBrowser2,SBCMDID_CREATESHORTCUT,OLECMDEXECOPT_PROMPTUSER,NULL,NULL)) ? true : false;
	}

tabbrowser153.gif そして「MainFrm.h」でメニューが選択されたときに上で実装した関数が呼びだされるようにする。
		COMMAND_ID_HANDLER(ID_EDIT_PASTE, OnFileCommand)
		COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL, OnFileCommand)
		COMMAND_ID_HANDLER(ID_FILE_SAVE, OnFileCommand)				//■追加
		COMMAND_ID_HANDLER(ID_FILE_SAVE_AS, OnFileCommand)			//■追加
		COMMAND_ID_HANDLER(ID_FILE_CREATE_SHORTCUT, OnFileCommand)	//■追加
		COMMAND_ID_HANDLER(ID_FILE_PROPERTY, OnFileCommand)			//■追加
		COMMAND_ID_HANDLER(ID_EDIT_FIND, OnFileCommand)				//■追加
		COMMAND_RANGE_HANDLER(ID_WINDOW_TABFIRST, ID_WINDOW_TABLAST, OnWindowActivate)
		COMMAND_ID_HANDLER(ID_IE_BACK, OnIECommand)
		COMMAND_ID_HANDLER(ID_IE_NEXT, OnIECommand)
		COMMAND_ID_HANDLER(ID_IE_STOP, OnIECommand)
		COMMAND_ID_HANDLER(ID_IE_REFRESH, OnIECommand)
		COMMAND_ID_HANDLER(ID_IE_ADDFAVORITE, OnIEAddFavorite)
		COMMAND_ID_HANDLER(ID_IE_ORGANIZE_FAVORITE, OnIEOrganizeFavorite)
		NOTIFY_CODE_HANDLER(TBVN_CONTEXTMENU, OnTabContextMenu)
		NOTIFY_CODE_HANDLER(TBVN_PAGEACTIVATED, OnTabPageActivated)
		NOTIFY_HANDLER(ATL_IDW_STATUS_BAR, NM_DBLCLK, OnStatusBarDblClk)
		MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
		MESSAGE_HANDLER(WM_SIZE, OnSize)
		COMMAND_RANGE_HANDLER(ID_FAVORITE_FIRST,ID_FAVORITE_LAST,OnFavorite)
		CHAIN_MSG_MAP_MEMBER(_cFovMenu)
		CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
		CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)
	END_MSG_MAP()


	LRESULT OnFileCommand(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& bHandled)
	{
		CTabBrowser100View*	pView;

		pView = GetActivePageView();
		if(pView == NULL)
		{
			bHandled = FALSE;
			return	0;
		}

		bHandled = TRUE;
		switch(wID)
		{
			///////////////////////
			//■追加ここから
		case	ID_FILE_SAVE:				//上書き保存
			pView->Save();
			break;

		case	ID_FILE_SAVE_AS:			//名前を付けて保存
			pView->SaveAs();
			break;

		case	ID_FILE_CREATE_SHORTCUT:	//デスクトップにリンク作成
			pView->CreateShortcut();
			break;

		case	ID_FILE_PROPERTY:			//プロパティ
			pView->ShowProperty();
			break;

		case	ID_EDIT_FIND:				//検索
			pView->ShowFind();
			break;
			//■追加ここまで
			///////////////////////

		case	ID_EDIT_COPY:				//コピー
			pView->Copy();
			break;

		case	ID_EDIT_CUT:				//切り取り
			pView->Cut();
			break;

		case	ID_EDIT_PASTE:				//貼り付け
			pView->Paste();
			break;

		case	ID_EDIT_SELECT_ALL:			//全てを選択
			pView->SelectAll();
			break;

		case	ID_FILE_PRINT:				//印刷
			pView->PrintOrPreview(true);
			break;

		case	ID_FILE_PRINT_PREVIEW:		//印刷プレビュー
			pView->PrintOrPreview(false);
			break;

		case	ID_FILE_PRINT_SETUP:		//印刷セットアップ
			pView->PrintSetup();
			break;

		default:
			bHandled = FALSE;
			break;
		}

		return	0;
	}

tabbrowser154.gif メニュー項目が無効化されているので、有効化しておく。本来であればコマンドを利用できるときのみ有効にするべきだが、その作業は今後行うことにして今は保留しておく。
		//未実装メニュー項目を全部無効に設定
		{
			UIEnable(ID_FILE_COPY_TAB, FALSE);
			UIEnable(ID_FILE_NEW_WINDOW, FALSE);
			UIEnable(ID_FILE_NEW_SESSION, FALSE);
			UIEnable(ID_FILE_OPEN, FALSE);
			UIEnable(ID_FILE_EDIT, FALSE);
//			UIEnable(ID_FILE_SAVE, FALSE);				//■コメントアウト 有効/無効設定必要
//			UIEnable(ID_FILE_SAVE_AS, FALSE);			//■コメントアウト 有効/無効設定必要
			UIEnable(ID_FILE_SEND_PAGE, FALSE);
			UIEnable(ID_FILE_SEND_LINK, FALSE);
//			UIEnable(ID_FILE_CREATE_SHORTCUT, FALSE);	//■コメントアウト 有効/無効設定必要
			UIEnable(ID_FILE_INPORT_EXPORT, FALSE);
//			UIEnable(ID_FILE_PROPERTY, FALSE);			//■コメントアウト 有効/無効設定必要
			UIEnable(ID_FILE_OFFLINE, FALSE);
//			UIEnable(ID_EDIT_FIND, FALSE);				//■コメントアウト 有効/無効設定必要
			UIEnable(ID_VIEW_FIXED, FALSE);
			UIEnable(ID_VIEW_QUICKTAB, FALSE);
			UIEnable(ID_VIEW_FAVORITE, FALSE);
			UIEnable(ID_VIEW_HISTORY, FALSE);
			UIEnable(ID_VIEW_FEED, FALSE);

tabbrowser155.gif
これで実行すると今回実装したメニューが利用できるようになった。

試してみると「保存」コマンドはInternet Explorer 8では.mhtファイルへの保存に対応しているが、今回の実装ではうまく動かない。ページが完全に読み込み終わる前にメニューを選択するとmhtファイルの選択欄が現れるが、ページが読み込まれた後にメニューを選択すると選択肢が消えてしまう。IE8だからなのかはわからないがどうも挙動がおかしい。それらの調査は今後行うことにして今は保留しておく。

次回はメニュー関連からは少し離れてステータスバーを少し見直す。

プロジェクトファイルをダウンロード


カテゴリー「タブブラウザーを作る」 のエントリー