第12回 「お気に入りに追加」機能を実装する (タブブラウザーを作る)

tabbrowser52.gif
前回までにInternet Explorerに登録されている「お気に入り」が使えるようになった。今回は現在開いているタブのホームページを「お気に入り」として追加する処理を実装する。

前回までに作成したプロジェクトで「リソース」ウインドウを開き、「お気に入り」メニューに「お気に入りに追加」を作る。IDは「ID_IE_ADDFAVORITE」とした。

さらに今回は実装しないが、今後のために「お気に入りの整理」(ID_IE_ORGANIZEFAVORITE)も作成しておいた。

tabbrowser53.gif
次に「ソリューション」ウインドウで「MainFrm.h」を開き、先ほど作成した「お気に入りに追加」メニューが選択されたときの処理を追加する。

ここではタブがあるときに、そのタブのビューに対してAddFavorite()(まだ実装されていない関数)を呼ぶようにした。
	BEGIN_MSG_MAP(CMainFrame)
		MESSAGE_HANDLER(WM_DNP_CHANGEFOCUS, OnDnpChangeFocus)
		NOTIFY_CODE_HANDLER(CBEN_ENDEDIT, OnAddressbarEnter)
		MESSAGE_HANDLER(WM_CREATE, OnCreate)
		MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
		COMMAND_ID_HANDLER(ID_APP_EXIT, OnFileExit)
		COMMAND_ID_HANDLER(ID_FILE_NEW, OnFileNew)
		COMMAND_ID_HANDLER(ID_VIEW_TOOLBAR, OnViewToolBar)
		COMMAND_ID_HANDLER(ID_VIEW_STATUS_BAR, OnViewStatusBar)
		COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
		COMMAND_ID_HANDLER(ID_WINDOW_CLOSE, OnWindowClose)
		COMMAND_ID_HANDLER(ID_WINDOW_CLOSE_ALL, OnWindowCloseAll)
		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)		//■追加
		NOTIFY_CODE_HANDLER(TBVN_CONTEXTMENU, OnTabContextMenu)
		MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
		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 OnIEAddFavorite(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
	{
		int		nPage;
		CTabBrowser100View* pView = NULL;

		nPage = m_view.GetActivePage();
		if(nPage < 0)
			return	0;
		pView = (CTabBrowser100View*)m_view.GetPageData(nPage);
		if(pView == NULL)
			return	0;

		pView->AddFavorite();

		return	0;
	}

tabbrowser54.gif
次に「TabBrowser100View.h」を開き、先ほど「MainFrm.h」から呼ばれるように設定したAddFavorite()を実装する。

「お気に入りに追加」という処理を独自に実装しても構わない。しかしここではせっかくなのでInternet Explorerに備わっている機能を呼びだす形で処理する。IEコントロールのIWebBrowser2からIServiceProviderを取り出しIServiceProvider::QueryService()でIShellBrowserを取得、そこからIOleCommandTarget::Execを使ってSBCMDID_ADDTOFAVORITESを実行することで標準のUIが開いている。
	//■追加
	//「お気に入りに追加」UIを開く
	bool	AddFavorite(void)
	{
		HRESULT	hr;
		CComPtr<IShellBrowser>		pIShellBrowser;

		#ifndef	SBCMDID_ADDTOFAVORITES
			#define	SBCMDID_ADDTOFAVORITES	8
		#endif

		if(_pIWebBrowser2 == NULL)
			return	false;

		hr = IUnknown_QueryService(_pIWebBrowser2,SID_STopLevelBrowser,IID_IShellBrowser,(void**)&pIShellBrowser);
		if(SUCCEEDED(hr))
			hr = IUnknown_Exec(pIShellBrowser,&CGID_Explorer,SBCMDID_ADDTOFAVORITES,OLECMDEXECOPT_PROMPTUSER,NULL,NULL);

		return	SUCCEEDED(hr) ? true : false;
	}


	//■追加
	//IOleCommandTarget::Execの実行
	HRESULT	IUnknown_Exec(IUnknown* pUnk,const GUID *pguidCmdGroup,DWORD nCmdID,DWORD nCmdExecOpt,VARIANTARG *pvaIn,VARIANTARG *pvaOut)
	{
		CComPtr<IOleCommandTarget>	pIOleCommandTarget;

		if(pUnk == NULL)
			return	E_FAIL;

		pUnk->QueryInterface(IID_IOleCommandTarget,(void**)&pIOleCommandTarget);
		if(pIOleCommandTarget == NULL)
			return	E_FAIL;

		return	pIOleCommandTarget->Exec(pguidCmdGroup,nCmdID,nCmdExecOpt,pvaIn,pvaOut);
	}

tabbrowser55.gif
これでビルド/実行すると「お気に入りに追加」メニューにより追加できるようになった。本当はタブを開いていない時や「about:blank」を開いているときはメニューを無効にするなどの処理が欲しいところだがとりあえず保留しておく。

次回は「お気に入りの整理」機能を実装する。

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


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