第46回 現在のゾーン情報を表示する (タブブラウザーを作る)

tabbrowser193.gif
今回はステータスバーにアクセスしているURLに応じて「インターネット」や「コンピュータ」「信頼済みサイト」などのインターネットゾーン表示をする。

今回のゾーン情報の取得はInternet Explorer 6 SP2以降のCOMインターフェースを利用する。そのためまずは「stdafx.h」でIE6 SP2以降を示す0x603を_WIN32_IEの値として定義する。
#define WINVER			0x0500
#define _WIN32_WINNT	0x0501
#define _WIN32_IE		0x0603		//■変更 IE6SP2以降
#define _RICHEDIT_VER	0x0200

tabbrowser194.gif そしてビュークラス内に実際のゾーン取得処理を実装する。IInternetSecurityManagerをCoCreateし、URLを渡すことでゾーン値を取得、それをステータスバーへセットする。
	//■追加
	//ゾーンの取得
	bool	GetZone(LPCTSTR pszURL,DWORD& dwZone)
	{
		HRESULT		hr;
		CAtlStringW	ustrURL(pszURL);
		CComPtr<IInternetSecurityManager>	pIInternetSecurityManager;

		dwZone = URLZONE_INVALID;
		pIInternetSecurityManager.CoCreateInstance(CLSID_InternetSecurityManager,NULL,CLSCTX_INPROC_SERVER);
		if(pIInternetSecurityManager == NULL)
			return	false;

		hr = pIInternetSecurityManager->MapUrlToZone(ustrURL,&dwZone,0);

		return	SUCCEEDED(hr) ? true : false;
	}


	//メインウインドウへアドレス変更を通知する
	bool	NotifyChangeURL(LPCTSTR pszURL)
	{
		//■追加
		//インターネットゾーンの取得
		{
			DWORD	dwZone;

			GetZone(pszURL,dwZone);
			_wndStatusbar.SetZone(dwZone);		//ステータスバーへ設定
		}

		if(_pTabView == NULL)
			return	false;
		if(_pTabView->GetActivePage() != _pTabView->PageIndexFromHwnd(m_hWnd))
			return	false;			//このビューがアクティブでなければ処理しない

		GetTopLevelWindow().SendMessage(WM_DNP_CHANGEADDRESS,(WPARAM)pszURL);

		return	true;
	}

tabbrowser195.gif ステータスバー側で受け取った値を保持しておくための変数を用意しておく。
class	CIELikeStatusbar	: public CWindowImpl<CIELikeStatusbar>
{
	CIconManager	_cIconList;

	CProgressBarCtrl	_wndProgressBar;			//ステータスバーに配置するプログレスバーコントロール


	CAtlString	_strText;

	long	_nLastProgress;			//最後に受け取ったプログレス情報
	long	_nLastProgressMax;		//最後に受け取ったプログレス最大値

	bool	_bPageError;	//現在のページでスクリプトエラーなどがあればtrue、通常はfalse
	bool	_bPrivate;		//現在のページがプライバシーインパクト状態ならtrue、通常はfalse
	bool	_bSecure;		//現在のページがセキュアならtrue、通常はfalse
	DWORD	_dwZone;		//■追加 現在のページのゾーン

	HWND	_hWndNotify;	//ダブルクリック通知先。通常ビューウインドウのHWND
public:

	CIELikeStatusbar()
	{
		_hWndNotify			= NULL;
		_nLastProgress		= -1;
		_nLastProgressMax	= -1;
		_bPageError = false;
		_bPrivate = false;
		_bSecure = false;
		_dwZone = URLZONE_INVALID;		//■追加
	}

tabbrowser196.gif そしてビューウインドウ側から受け取ったゾーン値を保存しておくと同時に、DWORD値から表示用の文字列へ変換してステータスバーへ表示する。
	//ステータスバー表示更新
	bool	Refresh(bool bCapture)
	{
		if(bCapture == false)
		{
			if(_wndProgressBar.IsWindow())
			{
				if(_wndProgressBar.IsWindowVisible())
					_wndProgressBar.ShowWindow(SW_HIDE);		//不可視に
			}
			return	true;
		}

		if(IsWindow() == FALSE)
			return	false;

		UpdateLayout();		//レイアウト調整

		//ステータスバーのテキスト変更
		{
			SetText(_strText);
		}

		//ステータスバーのアイコン変更
		{
			SetPageError(_bPageError);
			SetPrivacy(_bPrivate);
			SetSecure(_bSecure);
		}

		//■追加
		//ゾーン設定
		{
			SetZone(_dwZone);
		}

		return	true;
	}


	//■追加
	bool	SetZone(DWORD dwZone)
	{
		_dwZone = dwZone;

		if(IsWindow() == FALSE)
			return	true;			//trueを返す

		//ゾーンのテキストをステータスバーに表示
		{
			ZONEATTRIBUTES	sZoneAttributes;
			CComPtr<IInternetZoneManager>	pIInternetZoneManager;

			::ZeroMemory(&sZoneAttributes,sizeof(ZONEATTRIBUTES));
			sZoneAttributes.cbSize = sizeof(ZONEATTRIBUTES);

			pIInternetZoneManager.CoCreateInstance(CLSID_InternetZoneManager,NULL,CLSCTX_INPROC_SERVER);
			if(pIInternetZoneManager)
				pIInternetZoneManager->GetZoneAttributes(dwZone,&sZoneAttributes);

			CAtlString		strZone = sZoneAttributes.szDisplayName;
			CStatusBarCtrl	wndStatusBar = m_hWnd;

			wndStatusBar.SetText(PAIN_ZONE,strZone);
		}

		return	true;
	}

tabbrowser197.gif
これでビルド/実行するとステータスバーに開いているページのゾーン名が表示されるようになった。

次回はゾーン名に加えてゾーン用のアイコンを表示する。

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


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