![]()
前回はウインドウのツールバー領域にアドレスバー用のコンボボックスを配置した。今回はそのアドレスバーに入力された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;
}
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;
}
//アドレスバーで[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;
}

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