第48回 ゾーン設定ウインドウを開く (タブブラウザーを作る)

tabbrowser202.gif
前回までにステータスバーに現在開いているページのゾーン名やゾーンのアイコンを表示した。今回はその部分をダブルクリックしたときにゾーン設定画面が開くようにする。

処理の流れはステータスバーのダブルクリックからプライバシーレポートを表示したときと同じようになる。まず「stdafx.h」内にステータスバーからビューウインドウへダブルクリックされたときに送るための独自メッセージを追加する。
#define	WM_DNP_SHOWZONECONFIGURE	(WM_APP + 10)		//■追加

tabbrowser203.gif そしてステータスバーがダブルクリックされたときにビューウインドウへメッセージを送信する。
	//ステータスバーのダブルクリック処理
	LRESULT OnLButtonDblClk(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		int		i;
		RECT	rect;
		BOOL	ret;
		POINT	pt;

		CStatusBarCtrl	wndStatusBar = m_hWnd;

		if(_hWndNotify == NULL || ::IsWindow(_hWndNotify) == FALSE)
			return	0;		//通知先が死んでいたらこれ以降処理しない

		::GetCursorPos(&pt);
		ScreenToClient(&pt);

		i = 0;
		while(1)
		{
			ret = wndStatusBar.GetRect(i,&rect);
			if(ret == FALSE)
				break;

			if(::PtInRect(&rect,pt))
			{
				//i番目のペインがダブルクリックされた

				switch(i)
				{
				case	PAIN_DEFAULT:
					::SendMessage(_hWndNotify,WM_DNP_SHOWSCRIPTERROR,NULL,NULL);
					break;

				case	PAIN_PRIVACY_REPORT:
					::SendMessage(_hWndNotify,WM_DNP_SHOWPRIVACYREPORT,NULL,NULL);
					break;

				case	PAIN_SECURITY_REPORT:
					::SendMessage(_hWndNotify,WM_DNP_SHOWPSECURITYREPORT,NULL,NULL);
					break;

					//■変更
				case	PAIN_ZONE:
					::SendMessage(_hWndNotify,WM_DNP_SHOWZONECONFIGURE,NULL,NULL);
					break;

				case	PAIN_PROGRESS:
				case	PAIN_RESERVED:
				case	PAIN_POPUP:
				case	PAIN_ADDON:
				case	PAIN_SECURITY:
				case	PAIN_BLOCKED:
				case	PAIN_ZOOM:
					break;
				}

				break;
			}

			i++;
		}

		return	0;
	}

tabbrowser204.gif さらにビューウインドウ側でステータスバーから送られてきたメッセージ用のハンドラを追加する。
	BEGIN_MSG_MAP(CTabBrowser100View)
		MESSAGE_HANDLER(WM_DNP_SCRIPTERROR, OnDnpScriptError)
		MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
		MESSAGE_HANDLER(WM_DNP_SHOWSCRIPTERROR, OnShowScriptError)
		MESSAGE_HANDLER(WM_DNP_SHOWPRIVACYREPORT, OnShowPrivacyReport)
		MESSAGE_HANDLER(WM_DNP_SHOWPSECURITYREPORT, OnShowSecurityReport)
		MESSAGE_HANDLER(WM_DNP_SHOWZONECONFIGURE, OnShowZoneConfigure)		//■追加
	END_MSG_MAP()


private:


	LRESULT OnShowZoneConfigure(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		ShowZoneConfigure(m_hWnd);
		return	0;
	}

tabbrowser205.gif 最後に実際にゾーン設定画面を開く処理を実装する。ゾーン設定画面はshlwapi.dllからnoname@383でエクスポートされているZoneConfigureWという関数により開く。
	//■追加
	//ゾーン設定の表示
	bool	ShowZoneConfigure(HWND hWnd,LPCTSTR pszURL)
	{
		HMODULE	hDLL;
		void (WINAPI* pfnZoneConfigureW)(HWND,LPCWSTR) = NULL;

		hDLL = ::LoadLibrary(_T("shlwapi.dll"));
		if(hDLL == NULL)
			return	false;

		(FARPROC&)pfnZoneConfigureW = ::GetProcAddress(hDLL,(LPCSTR)383);
		if(pfnZoneConfigureW)
			(*pfnZoneConfigureW)(NULL,(CAtlStringW)pszURL);

		::FreeLibrary(hDLL);

		return	pfnZoneConfigureW ? true : false;
	}

	//■追加
	//ゾーン設定の表示
	bool	ShowZoneConfigure(HWND hWnd)
	{
		HRESULT		hr;
		CComBSTR	bstrURL;

		if(_pIWebBrowser2 == NULL)
			return	false;

		//URL取得
		hr = _pIWebBrowser2->get_LocationURL(&bstrURL);
		if(FAILED(hr))
			return	false;

		return	ShowZoneConfigure(hWnd,(CAtlString)bstrURL);
	}

tabbrowser206.gif
これでビルド/実行してステータスバーのゾーン情報の部分をダブルクリックするとゾーン設定画面が開いた。

次回はリンクをクリックしたときに鳴るクリック音を消す設定をする。

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


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