第11回 選択された「お気に入り」のURLをタブで開く (タブブラウザーを作る)

tabbrowser49.gif
前回はInternet Explore用に登録されている「お気に入り」をメニューとして表示する処理を実装した。今回は選択された「お気に入り」のインターネットショートカットからURLを取り出して実際に「タブ」として開く処理を追加する。

前回までに作成したプロジェクトでソリューションウインドウにある「MainFrm.h」をダブルクリックして開く。そしてここにインターネットショートカットを扱うためのヘッダーファイルを追加する。
#include "intshcut.h"			//■追加

tabbrowser50.gif
次に同じ「MainFrm.h」内の前回作成した「お気に入り」が選択されたときの処理内容を書き換える。また、インターネットショートカットファイルからURLを取り出すための関数も追加する。

今回の処理ではアクティブなタブがある場合はそのタブで、なければ新しくタブを作成してURLを開くようにした。
	//■処理内容変更
	//「お気に入り」が選択されたときの処理
	LRESULT OnFavorite(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
	{
		bool		ret;
		CAtlString	strFolder;
		CAtlString	strFile;
		CAtlString	strURL;

		//選択されたお気に入りのファイル名を取得
		ret = _cFovMenu.GetPathFromID(wID,strFolder,strFile);
		if(ret == false)
		{
			bHandled = FALSE;
			return	0;
		}

		ret = GetInternetShortcut(strFolder + strFile,strURL);
		if(ret == false)
			return	0;

		//タブとしてURLを開く
		{
			int		nPage;
			CTabBrowser100View* pView = NULL;

			nPage = m_view.GetActivePage();
			if(nPage >= 0)
			{
				//現在のタブからビューを取得
				pView = (CTabBrowser100View*)m_view.GetPageData(nPage);
			}

			if(pView == NULL)
			{
				//新しいタブを作成
				pView = new CTabBrowser100View(&m_view);	//タブビューのポインタを渡しておく
				pView->Create(m_view, rcDefault, _T("about:blank"), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_HSCROLL | WS_VSCROLL, 0);
				m_view.AddPage(pView->m_hWnd, _T("Document"),-1,pView);
			}

			//URLを開く
			pView->Navigate(strURL);
		}

		return	0;
	}



	//■追加
	//インターネットショートカットからそれが示すURLを取得する
	bool	GetInternetShortcut(LPCTSTR pszFile,CAtlString& strURL)
	{
		HRESULT	hr;
		LPWSTR	pwszURL;

		CComPtr<IMalloc>					pIMalloc;
		CComPtr<IPersistFile>				pIPersistFile;
		CComPtr<IUniformResourceLocator>	pIUniformResourceLocator;

		strURL = _T("");
		::CoCreateInstance(CLSID_InternetShortcut,NULL,CLSCTX_INPROC_SERVER,IID_IUniformResourceLocator,(void**)&pIUniformResourceLocator);
		if(pIUniformResourceLocator == NULL)
			return	false;

		pIUniformResourceLocator->QueryInterface(IID_IPersistFile,(void**)&pIPersistFile);
		if(pIPersistFile == NULL)
			return	false;

		hr = pIPersistFile->Load(CComBSTR(pszFile),STGM_READ | STGM_SHARE_DENY_NONE);
		if(FAILED(hr))
			return	false;

		hr = pIUniformResourceLocator->GetURL(&pwszURL);
		if(FAILED(hr))
			return	false;

		strURL = pwszURL;

		hr = ::SHGetMalloc(&pIMalloc); 
		if(SUCCEEDED(hr))
			pIMalloc->Free(pwszURL);

		return	true;
	}

tabbrowser51.gif
これでビルド/実行すると、選択した「お気に入り」がタブとして開くようになった。

4月1日から作り始めたWTLのタブブラウザー。まだ思いついて2日だがだんだんブラウザーっぽい機能が増えてきてそれらしくなってきた。それに比例してソースコードの方はスパゲティ状でタ重複コードがどんどん増えてきた。そろそろさすがに整理しないとまずい気もするが、、、まだ放置して次回は「お気に入りに追加」機能を実装する。

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


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