![]()
ここ数回の実装でステータスバーをダブルクリックすることでプライバシーレポートとセキュリティレポートを表示できるようになった。
今回はステータスバーにこれらの状態を示すアイコンを表示する。まずは表示するためのアイコンを作る。リソースウインドウの「Icon」で右クリックして現われるメニューから「Iconを挿入」を選択する。
実際にInternet Explorerで利用しているアイコンをプログラム内からロードして使うようにしてもいい。しかしInternet Explorer 6と7/8では格納されている場所も形式も変更されたためちょっと実装が面倒なので今回は自分で作ることにした。
![]()
今回はステータスバーへ表示するアイコンを作るため、32x32サイズは不要となる。そのため32x32の上で右クリックをして現われるメニューから「イメージタイプの削除」を選択して消してしまう。
![]()
そしてアイコンを作成する。まずはプライバシーインパクト状態のアイコンを作った。IDは「IDI_PRIVACY」とした。
![]()
同様の手順で「IDI_SECURITY」というセキュア状態用のアイコンも作っておく。
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;
}
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; //■追加
}
//ステータスバー表示更新
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);
}
![]()
最後にビューウインドウからステータスバー側にページの状態が伝わるようにする。
//■処理内容実装
//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);
}
![]()
これでビルド/実行するとステータスバーにSSL通信時は鍵、クッキーなどを利用したべージでは変な目のアイコンが表示されるようになった。
次回は「信頼済みサイト」や「インターネット」などのゾーン情報を取得してステータスバーに表示する。
