第45回 セキュリティやプライバシーアイコンを表示する (タブブラウザーを作る)

tabbrowser184.gif
ここ数回の実装でステータスバーをダブルクリックすることでプライバシーレポートとセキュリティレポートを表示できるようになった。

今回はステータスバーにこれらの状態を示すアイコンを表示する。まずは表示するためのアイコンを作る。リソースウインドウの「Icon」で右クリックして現われるメニューから「Iconを挿入」を選択する。


実際にInternet Explorerで利用しているアイコンをプログラム内からロードして使うようにしてもいい。しかしInternet Explorer 6と7/8では格納されている場所も形式も変更されたためちょっと実装が面倒なので今回は自分で作ることにした。

tabbrowser185.gif
今回はステータスバーへ表示するアイコンを作るため、32x32サイズは不要となる。そのため32x32の上で右クリックをして現われるメニューから「イメージタイプの削除」を選択して消してしまう。

tabbrowser186.gif
そしてアイコンを作成する。まずはプライバシーインパクト状態のアイコンを作った。IDは「IDI_PRIVACY」とした。

tabbrowser187.gif
同様の手順で「IDI_SECURITY」というセキュア状態用のアイコンも作っておく。

tabbrowser188.gif そしてCIconManager内で作成した2つのアイコンがロードされるようにする。
	enum	ICON_INDEX
	{
		ICON_WARNING_SM = 0,			//警告アイコン。スクリプトエラー時に利用
		ICON_SECURITY_SM,				//■追加 鍵のアイコン。セキュリティロック時利用
		ICON_PRIVACY_SM,				//■追加 プライバシーのアイコン。クッキー存在時などに利用
	};

	HICON	GetIcon(UINT nIconIndex)
	{
		if(nIconIndex >= _ahIcon.GetCount())
			return	NULL;

		return	_ahIcon[nIconIndex];
	}

protected:

	//固定インデックスのアイコンを追加
	//かならずICON_INDEXと同じ値になるようにする
	bool	SetFixedIndexIcon(void)
	{
		ATLASSERT(_ahIcon.GetCount() == 0);		//すでに設定されてる?
		if(_ahIcon.GetCount())
			return	false;

		size_t	nIndex;
		HICON	hIcon;

		//警告アイコン
		//LoadImageで32x32を読み込み、CopyImageで16x16に縮小。LoadImageのHICONはLR_SHAREDなのでDestroyIcon必要なし
		hIcon = (HICON)::LoadImage(NULL,MAKEINTRESOURCE(OIC_WARNING),IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED);
		hIcon = (HICON)::CopyImage(hIcon,IMAGE_ICON,::GetSystemMetrics(SM_CXSMICON),::GetSystemMetrics(SM_CYSMICON),LR_COPYFROMRESOURCE);
		nIndex = _ahIcon.Add(hIcon);
		ATLASSERT(nIndex == ICON_WARNING_SM);

		//■追加
		{
			//鍵のアイコン
			//LoadIconのは自動でDestroyされる
			hIcon = ::LoadIcon(::_Module.m_hInst,MAKEINTRESOURCE(IDI_SECURITY));
			hIcon = (HICON)::CopyImage(hIcon,IMAGE_ICON,::GetSystemMetrics(SM_CXSMICON),::GetSystemMetrics(SM_CYSMICON),LR_COPYFROMRESOURCE | LR_COPYDELETEORG | LR_COPYRETURNORG);
			nIndex = _ahIcon.Add(hIcon);
			ATLASSERT(nIndex == ICON_SECURITY_SM);
		}

		//■追加
		{
			//プライバシーのアイコン
			//LoadIconのは自動でDestroyされる
			hIcon = ::LoadIcon(::_Module.m_hInst,MAKEINTRESOURCE(IDI_PRIVACY));
			hIcon = (HICON)::CopyImage(hIcon,IMAGE_ICON,::GetSystemMetrics(SM_CXSMICON),::GetSystemMetrics(SM_CYSMICON),LR_COPYFROMRESOURCE | LR_COPYDELETEORG | LR_COPYRETURNORG);
			nIndex = _ahIcon.Add(hIcon);
			ATLASSERT(nIndex == ICON_PRIVACY_SM);
		}

		return	true;
	}

tabbrowser189.gif 次にCIELikeStatusbarに現在のページの状態を保存するための変数を追加する。この付近の流れはスクリプトエラーが発生したときのアイコン表示とまったく同じ処理になる。
	bool	_bPageError;	//現在のページでスクリプトエラーなどがあればtrue、通常はfalse
	bool	_bPrivate;		//■追加 現在のページがプライバシーインパクト状態ならtrue、通常はfalse
	bool	_bSecure;		//■追加 現在のページがセキュアならtrue、通常はfalse

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

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

tabbrowser190.gif CIELikeStatusbarに実際にページ状態に応じてアイコンを表示する処理をおく。
	//ステータスバー表示更新
	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);
		}

		return	true;
	}

	//■追加
	//アイコンをステータスバーに設定/消去
	//nPainは表示するペイン
	//nIconIndexはCIconManager上でのインデックス
	//bSet=trueならアイコン設定。bSet=falseならnIconIndexを無視してアイコンを消去
	bool	SetIcon(int nPain,UINT nIconIndex,bool bSet)
	{
		if(IsWindow() == FALSE)
			return	false;

		BOOL	ret;
		CStatusBarCtrl	wndStatusBar = m_hWnd;

		if(bSet)
			ret = wndStatusBar.SetIcon(nPain,_cIconList.GetIcon(nIconIndex));
		else
			ret = wndStatusBar.SetIcon(nPain,NULL);

		return	ret ? true : false;
	}

	bool	SetPageError(bool bError)
	{
		_bPageError = bError;			//エラーが発生したことを保持

		//■処理変更
		return	SetIcon(PAIN_DEFAULT,CIconManager::ICON_WARNING_SM,_bPageError);
	}

	//■追加
	bool	SetPrivacy(bool bPrivate)
	{
		_bPrivate = bPrivate;			//状態保持

		return	SetIcon(PAIN_PRIVACY_REPORT,CIconManager::ICON_PRIVACY_SM,_bPrivate);
	}

	//■追加
	bool	SetSecure(bool bSecure)
	{
		_bSecure = bSecure;			//状態保持

		return	SetIcon(PAIN_SECURITY_REPORT,CIconManager::ICON_SECURITY_SM,_bSecure);
	}

tabbrowser191.gif
最後にビューウインドウからステータスバー側にページの状態が伝わるようにする。

プライバシー状態やセキュリティ状態はIEコントロールからそれぞれDISPID_PRIVACYIMPACTEDSTATECHANGE、DISPID_SETSECURELOCKICONで届く。しかしどちらもMSDNライブラリの説明は間違えているようなので注意が必要だ。
	//■処理内容実装
	//MSDNにはVT_BOOLとあるが、BOOLとの間違え
	void __stdcall OnPrivacyImpactedStateChange(BOOL bPrivacyImpacted)
	{
		if(bPrivacyImpacted == FALSE)
			_wndStatusbar.SetPrivacy(false);
		else
			_wndStatusbar.SetPrivacy(true);
	}

	//■処理内容実装
	//MSDNにはVARIANTとあるが、longとの間違え
	void __stdcall OnSetSecureLockIcon(long lSecureLockIcon)
	{
		//本当ならlSecureLockIconは種類がいっぱいあるが、とりあえずセキュアかそうでないかのみで処理

		if(lSecureLockIcon == secureLockIconUnsecure)
			_wndStatusbar.SetSecure(false);
		else
			_wndStatusbar.SetSecure(true);
	}

tabbrowser192.gif
これでビルド/実行するとステータスバーにSSL通信時は鍵、クッキーなどを利用したべージでは変な目のアイコンが表示されるようになった。

次回は「信頼済みサイト」や「インターネット」などのゾーン情報を取得してステータスバーに表示する。

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


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