第27回 「コピー」「切り取り」などをIEコントロールの状態に合わせて有効にする (タブブラウザーを作る)

tabbrowser106.gif
前回は「編集」メニューの「コピー」などを使えるようにした。しかしメニュー項目が常に有効なままだった。

今回はIEコントロール内の状況に合わせて、メニュー項目の有効と無効が切り替わるようにする。

IWebBrowser2からIHTMLDocumentを取り出し、選択されているHTMLエレメントがあるときは「コピー」メニューを有効に、、、という方法も考えられるが非常に煩雑だ。今回はIOleCommandtarget::QueryStatusを利用して状態を取得する。

状態を取得するための関数をCIEUtilityに追加する。
	//■追加
	//「コピー」「切り取り」「貼り付け」「全てを選択」メニューが使える状態かどうかの取得
	bool	IsEnable_EditCommand(bool& bCopy,bool& bCut,bool& bPaste,bool& bSelectAll)
	{
		HRESULT	hr;
		OLECMD	pOleCmd[] = 
			{
				{ OLECMDID_COPY, 0 },
				{ OLECMDID_CUT, 0 },
				{ OLECMDID_PASTE, 0 },
				{ OLECMDID_SELECTALL, 0 }
			};

		CComPtr<IOleCommandTarget>	pIOleCommandTarget;

		bCopy		= false;
		bCut		= false;
		bPaste		= false;
		bSelectAll	= false;
		if(_pIWebBrowser2)
			_pIWebBrowser2->QueryInterface(&pIOleCommandTarget);
		if(pIOleCommandTarget == NULL)
			return	true;				//trueで返す

		hr = pIOleCommandTarget->QueryStatus(NULL,sizeof(pOleCmd)/sizeof(OLECMD),pOleCmd,NULL);
		if(FAILED(hr))
			return	true;				//trueで返す

		bCopy		= (pOleCmd[0].cmdf & OLECMDF_ENABLED) ? true : false;
		bCut		= (pOleCmd[1].cmdf & OLECMDF_ENABLED) ? true : false;
		bPaste		= (pOleCmd[2].cmdf & OLECMDF_ENABLED) ? true : false;
		bSelectAll	= (pOleCmd[3].cmdf & OLECMDF_ENABLED) ? true : false;

		return	true;
	}

tabbrowser107.gif そして「MainFrm.h」のBEGIN_UPDATE_UI_MAPの中にメニュー項目用のIDを追加し、ちょっと行儀が悪いがOnIdle処理で状態を更新する。
	//■内部処理変更
	virtual BOOL OnIdle()
	{
		CTabBrowser100View*	pView;

		pView = GetActivePageView();

		//「戻る」「進む」ボタンの状態設定
		{
			bool	bBack = false;
			bool	bNext = false;

			if(pView)
				pView->IsButtonEnable(bBack,bNext);

			UIEnable(ID_IE_BACK,bBack ? TRUE : FALSE);
			UIEnable(ID_IE_NEXT,bNext ? TRUE : FALSE);
		}

		//「編集」メニュー項目更新
		{
			bool	bCopy		= false;
			bool	bCut		= false;
			bool	bPaste		= false;
			bool	bSelectAll	= false;

			if(pView)
				pView->IsEnable_EditCommand(bCopy,bCut,bPaste,bSelectAll);

			UIEnable(ID_EDIT_COPY		,bCopy ? TRUE : FALSE);
			UIEnable(ID_EDIT_CUT		,bCut ? TRUE : FALSE);
			UIEnable(ID_EDIT_PASTE		,bPaste ? TRUE : FALSE);
			UIEnable(ID_EDIT_SELECT_ALL	,bSelectAll ? TRUE : FALSE);
		}

		UIUpdateToolBar();
		return FALSE;
	}

	BEGIN_UPDATE_UI_MAP(CMainFrame)
		UPDATE_ELEMENT(ID_VIEW_TOOLBAR, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_STATUS_BAR, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_IE_BACK, UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_IE_NEXT, UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_EDIT_COPY, UPDUI_TOOLBAR | UPDUI_MENUPOPUP)			//■追加
		UPDATE_ELEMENT(ID_EDIT_CUT, UPDUI_TOOLBAR | UPDUI_MENUPOPUP)			//■追加
		UPDATE_ELEMENT(ID_EDIT_PASTE, UPDUI_TOOLBAR | UPDUI_MENUPOPUP)			//■追加
		UPDATE_ELEMENT(ID_EDIT_SELECT_ALL, UPDUI_TOOLBAR | UPDUI_MENUPOPUP)		//■追加
	END_UPDATE_UI_MAP()

tabbrowser108.gif
これでビルド/実行すると「編集」メニューにある「コピー」「切り取り」「貼り付け」の各項目がIEコントロールの状態に合わせて有効になるようになった。

次回は開いているページに含まれるJavascriptなどにエラーがあってもエラーダイアログが開かないようにする。

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


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