
前回までにタブブラウザー用のプロジェクトを作成し、手動でURLを入力できるようにアドレスバーを実装した。今回はアクセスしたURLのホームページ名が「タブ」に表示されるようにする。
前回までに作成したプロジェクトを開く。そしてソリューションウインドウにある「TabBrowser100View.h」をダブルクリックしてビュークラスの編集画面を開く。そしてまず4箇所ソースコードを追加する。
#include "atlstr.h" //■追加
#include "Exdispid.h" //■追加
#define SINKID_EVENTS 0 //■追加
class CTabBrowser100View : public CWindowImpl<CTabBrowser100View, CAxWindow>
,public IDispEventImpl<SINKID_EVENTS, CTabBrowser100View, &DIID_DWebBrowserEvents2> //■追加
{
CTabView* _pTabView; //■追加 タブビューを保持
public:
DECLARE_WND_SUPERCLASS(NULL, CAxWindow::GetWndClassName())
//■追加
CTabBrowser100View(CTabView* pTabView)
{
_pTabView = pTabView;
}
BOOL PreTranslateMessage(MSG* pMsg)
{
if((pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST) &&
(pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST))
return FALSE;
// このメッセージを翻訳する機会をHTML ページに与える
return (BOOL)SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg);
}
BEGIN_MSG_MAP(CTabBrowser100View)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy) //■追加
END_MSG_MAP()

さらに開いたURLが読み込まれたときに呼ばれる処理を追加する。
ここではDISPID_DOCUMENTCOMPLETEを受信したときにタブにホームページの名前を表示するようにした。通常のタブブラウザーの場合はほかのイベントが届いたときにも書き換える処理をしている。しかし処理が煩雑になるため今回は省略した。
//■以下3行追加
BEGIN_SINK_MAP(CTabBrowser100View)
SINK_ENTRY_EX(SINKID_EVENTS, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
END_SINK_MAP()
//■関数追加
//HTMLページが読み終わったときに呼ばれる処理
void _stdcall OnDocumentComplete(IDispatch* pDisp, VARIANT* URL)
{
bool ret;
ret = GetBrowserCtrl();
if(ret == false)
return;
//タブに表示されている名前を変更
if(_pTabView)
{
int nPage;
CComBSTR bstr;
CAtlString strName;
_pIWebBrowser2->get_LocationName(&bstr); //現在のホームページ名を取得
strName = bstr;
nPage = _pTabView->PageIndexFromHwnd(m_hWnd); //このウインドウに関連づいているタブのインデックス取得
_pTabView->SetPageTitle(nPage,strName); //タブの名前を変更
}
}

さらにIEコントロールからのイベントを受信できるように接続処理と、終了時のためにその切断処理を実装する。
本来であればIWebBrowser2を取得したとき、、、この場合はGetBrowserCtrl()内でIEへの接続を行った方がいいが、今回はCreateの中のままにしておく。
//■追加
//Create関数のオーバーライド。内部でIEの取得、接続などを行う
HWND Create(HWND hWndParent, _U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
DWORD dwStyle = 0, DWORD dwExStyle = 0,
_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
{
bool ret;
HWND hWnd;
hWnd = __super::Create(hWndParent,rect,szWindowName,dwStyle,dwExStyle,MenuOrID,lpCreateParam);
if(hWnd == NULL)
return NULL; //Create失敗
ret = GetBrowserCtrl();
if(ret == false)
return hWnd; //WebBrowser取得失敗
Advise(_pIWebBrowser2); //IEとの接続
return hWnd;
}
//■追加
//ビューを閉じるときの処理
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
bHandled = FALSE;
if(_pIWebBrowser2)
Unadvise(_pIWebBrowser2); //IEからの切断
_pIWebBrowser2 = NULL;
return 0;
}

次に「MainFrm.h」を開き、OnFileNew()の中にあるビューの生成時にCTabViewへのポインタを渡すようにする。
LRESULT OnFileNew(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
CTabBrowser100View* pView = new CTabBrowser100View(&m_view); //■変更 ビューのポインタを渡しておく
//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);
// TODO: ドキュメント初期化コードの追加
return 0;
}

以上によりビルド/実行すると、開いたホームページの名前がタブに表示されるようになった。
次回は右クリックして現われるメニューから「新しいウインドウで開く」を選択した場合に、Internet Explorerが起動するのではなく、新しいタブでURLが開くようにする。
プロジェクトファイルをダウンロード