![]()
前回は「編集」メニューの「コピー」などを使えるようにした。しかしメニュー項目が常に有効なままだった。
今回は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;
}
//■内部処理変更
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()
![]()
これでビルド/実行すると「編集」メニューにある「コピー」「切り取り」「貼り付け」の各項目がIEコントロールの状態に合わせて有効になるようになった。
次回は開いているページに含まれるJavascriptなどにエラーがあってもエラーダイアログが開かないようにする。
