第3回 アドレスバーを作る(その2) (タブブラウザーを作る)

tabbrowser10.gif
前回はウインドウのツールバー領域にアドレスバー用のコンボボックスを配置した。今回はそのアドレスバーに入力されたURLを実際にビュー内で開く。

まずはビュー内でURLを簡単に開けるようにユーティリティ的な関数を実装する。前回までに作成したプロジェクトで、ソリューションウインドウにある「TabBrowser100View.h」をダブルクリックしてビュークラスの編集画面を開く。そしてここにURLを開くための関数などを追加する。

ここではQueryControlによりCAxWindowとして生成されたIEコントロールのIWebBrowser2を取得して_pIWebBrowser2に保持しておき、Navigate()ではIWebBrowser2::NavigateによりURLを開く。 これによりNavigate()を呼ぶことで指定されたURLをビュー内で開けるようになる。
	CComPtr<IWebBrowser2>		_pIWebBrowser2;		//■追加 このビューのブラウザーコントロールを保持 GetBrowserCtrl() によりこの変数に代入される

	//■関数追加
	//URLを開く
	bool	Navigate(LPCTSTR pszURL)
	{
		bool	ret;
		HRESULT	hr;

		ret = GetBrowserCtrl();
		if(ret == false)
			return	false;

		hr = _pIWebBrowser2->Navigate(CComBSTR(pszURL),&CComVariant(),&CComVariant(),&CComVariant(),&CComVariant());

		return	SUCCEEDED(hr) ? true : false;
	}

	//■関数追加
	//_pIWebBrowser2にこのビューに関連づいているIEをセットする
	bool	GetBrowserCtrl(void)
	{
		if(_pIWebBrowser2)
			return	true;

		QueryControl(&_pIWebBrowser2);

		return	_pIWebBrowser2 ? true : false;
	}

tabbrowser11.gif 次にソリューションウインドウの「MainFrm.h」をダブルクリックしてメインウインドウの編集画面を開く。 これは今回の作業で一番の肝となる項目だ。WTLのタブウインドウの実装方法はCTabViewImpl::AddPageにHWNDを渡す形となるため、一旦タブを作ってからビュークラスにアクセスするのが非常に煩雑になる。そのためここではタブの独自データ領域にビューへのポインタを格納しておくことで、簡単にビュークラスにアクセスできるようにした。
	LRESULT OnFileNew(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		CTabBrowser100View* pView = new CTabBrowser100View;
		//TODO: 必要に応じてURLを書き換えてください。
		pView->Create(m_view, rcDefault, _T("http://www.usefullcode.net/"), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_HSCROLL | WS_VSCROLL, 0);
		m_view.AddPage(pView->m_hWnd, _T("Document"),-1,pView);		//■「,-1,pView」を追加

		// TODO: ドキュメント初期化コードの追加

		return 0;
	}

tabbrowser12.gif 最後にアドレスバー内で[Enter]キーを押されたときに入力されたURLを開くように実装する。前回は入力されたURLをメッセージボックスに表示した。その部分を先ほど作成したビューのNavigate()関数を呼ぶように変更する。
	//アドレスバーで[ENTER]キーが押されたときなどに呼ばれる
	LRESULT OnAddressbarEnter(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
	{
		bHandled = FALSE;

		NMCBEENDEDIT*	pNmCbEndEdit = (NMCBEENDEDIT*)pnmh;
		CAtlString		strURL;

		if(pNmCbEndEdit == NULL || pNmCbEndEdit->iWhy != CBENF_RETURN)
			return	0;			//[ENTER]キーが押されたとき以外はreturn

		_wndAddressBar.GetWindowText(strURL);
		if(strURL == _T(""))
			return	0;		//URLが入力されてなかった

		//■以下の処理を編集/追加
		int		nPage;
		CTabBrowser100View*	pView;

		nPage = m_view.GetActivePage();	//アクティブなタブのインデックス取得
		if(nPage < 0)
			return	0;		//アクティブなタブがない(=タブが1つもない->本来は自動で新しいタブを作るべき)

		pView = (CTabBrowser100View*)m_view.GetPageData(nPage);	//アクティブなタブの独自データを取得
		if(pView == NULL)
			return	0;		//予測外のエラー(ここに入ることはない)

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

		return	0;
	}

tabbrowser13.gif
以上によりビルド/実行してアドレスバーにGoogleのURLを入れて[Enter]キーを押すと、Googleのホームページが開いた。
このままでは入力されたアドレスの履歴機能、現在開いているホームページのURL表示機能、「移動」ボタンなどなど実際のブラウザーのアドレスバーとしては機能が不十分だ。しかも致命的なことに[BackSpace]キーなどが利用できない。しかし今のところはこのままにしておく。

次回は「Document」となっているタブ表示を、開いているホームページ名が表示されるようにする。

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


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