「ファイル」メニューの「上書き保存」「名前を付けて保存」「プロパティ」および「編集」メニューの「このページの検索」機能はIWebBrowser2::ExecWBを呼び出すことで実行できる。
「ファイル」メニューの「送信」にある「ショートカットをデスクトップへ」はIWebBrowser2からIShellBrowserを取り出してIOleCommandTarget::Execにより実行できる。
これらの実装をCIEUtilityに追加する。
//■追加
bool Save(void)
{
if(_pIWebBrowser2 == NULL)
return false;
return SUCCEEDED(_pIWebBrowser2->ExecWB(OLECMDID_SAVE,MSOCMDEXECOPT_DODEFAULT,NULL,NULL)) ? true : false;
}
//■追加
//mhtには対応しない
bool SaveAs(void)
{
CComVariant vIn(L""); //これでファイル名指定
if(_pIWebBrowser2 == NULL)
return false;
return SUCCEEDED(_pIWebBrowser2->ExecWB(OLECMDID_SAVEAS,MSOCMDEXECOPT_DODEFAULT,&vIn,NULL)) ? true : false;
}
//■追加
bool ShowProperty(void)
{
if(_pIWebBrowser2 == NULL)
return false;
return SUCCEEDED(_pIWebBrowser2->ExecWB(OLECMDID_PROPERTIES,OLECMDEXECOPT_PROMPTUSER,NULL,NULL)) ? true : false;
}
//■追加
bool ShowFind(void)
{
if(_pIWebBrowser2 == NULL)
return false;
return SUCCEEDED(_pIWebBrowser2->ExecWB(OLECMDID_FIND,OLECMDEXECOPT_PROMPTUSER,NULL,NULL)) ? true : false;
}
//■追加
HRESULT ExecExplorer(IWebBrowser2* pIWebBrowser2,DWORD nCmdID,DWORD nCmdExecOpt,VARIANTARG *pvaIn,VARIANTARG *pvaOut)
{
HRESULT hr;
CComPtr<IShellBrowser> pIShellBrowser;
if(pIWebBrowser2 == NULL)
return E_FAIL;
hr = IUnknown_QueryService(pIWebBrowser2,SID_STopLevelBrowser,IID_IShellBrowser,(void**)&pIShellBrowser);
if(SUCCEEDED(hr))
hr = IUnknown_Exec(pIShellBrowser,&CGID_Explorer,nCmdID,nCmdExecOpt,pvaIn,pvaOut);
return hr;
}
//■追加
bool CreateShortcut(void)
{
//定数はshlobj.hから
#ifndef SBCMDID_CREATESHORTCUT
#define SBCMDID_CREATESHORTCUT 17
#endif
return SUCCEEDED(ExecExplorer(_pIWebBrowser2,SBCMDID_CREATESHORTCUT,OLECMDEXECOPT_PROMPTUSER,NULL,NULL)) ? true : false;
}
COMMAND_ID_HANDLER(ID_EDIT_PASTE, OnFileCommand)
COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL, OnFileCommand)
COMMAND_ID_HANDLER(ID_FILE_SAVE, OnFileCommand) //■追加
COMMAND_ID_HANDLER(ID_FILE_SAVE_AS, OnFileCommand) //■追加
COMMAND_ID_HANDLER(ID_FILE_CREATE_SHORTCUT, OnFileCommand) //■追加
COMMAND_ID_HANDLER(ID_FILE_PROPERTY, OnFileCommand) //■追加
COMMAND_ID_HANDLER(ID_EDIT_FIND, OnFileCommand) //■追加
COMMAND_RANGE_HANDLER(ID_WINDOW_TABFIRST, ID_WINDOW_TABLAST, OnWindowActivate)
COMMAND_ID_HANDLER(ID_IE_BACK, OnIECommand)
COMMAND_ID_HANDLER(ID_IE_NEXT, OnIECommand)
COMMAND_ID_HANDLER(ID_IE_STOP, OnIECommand)
COMMAND_ID_HANDLER(ID_IE_REFRESH, OnIECommand)
COMMAND_ID_HANDLER(ID_IE_ADDFAVORITE, OnIEAddFavorite)
COMMAND_ID_HANDLER(ID_IE_ORGANIZE_FAVORITE, OnIEOrganizeFavorite)
NOTIFY_CODE_HANDLER(TBVN_CONTEXTMENU, OnTabContextMenu)
NOTIFY_CODE_HANDLER(TBVN_PAGEACTIVATED, OnTabPageActivated)
NOTIFY_HANDLER(ATL_IDW_STATUS_BAR, NM_DBLCLK, OnStatusBarDblClk)
MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
MESSAGE_HANDLER(WM_SIZE, OnSize)
COMMAND_RANGE_HANDLER(ID_FAVORITE_FIRST,ID_FAVORITE_LAST,OnFavorite)
CHAIN_MSG_MAP_MEMBER(_cFovMenu)
CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)
END_MSG_MAP()
LRESULT OnFileCommand(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& bHandled)
{
CTabBrowser100View* pView;
pView = GetActivePageView();
if(pView == NULL)
{
bHandled = FALSE;
return 0;
}
bHandled = TRUE;
switch(wID)
{
///////////////////////
//■追加ここから
case ID_FILE_SAVE: //上書き保存
pView->Save();
break;
case ID_FILE_SAVE_AS: //名前を付けて保存
pView->SaveAs();
break;
case ID_FILE_CREATE_SHORTCUT: //デスクトップにリンク作成
pView->CreateShortcut();
break;
case ID_FILE_PROPERTY: //プロパティ
pView->ShowProperty();
break;
case ID_EDIT_FIND: //検索
pView->ShowFind();
break;
//■追加ここまで
///////////////////////
case ID_EDIT_COPY: //コピー
pView->Copy();
break;
case ID_EDIT_CUT: //切り取り
pView->Cut();
break;
case ID_EDIT_PASTE: //貼り付け
pView->Paste();
break;
case ID_EDIT_SELECT_ALL: //全てを選択
pView->SelectAll();
break;
case ID_FILE_PRINT: //印刷
pView->PrintOrPreview(true);
break;
case ID_FILE_PRINT_PREVIEW: //印刷プレビュー
pView->PrintOrPreview(false);
break;
case ID_FILE_PRINT_SETUP: //印刷セットアップ
pView->PrintSetup();
break;
default:
bHandled = FALSE;
break;
}
return 0;
}
//未実装メニュー項目を全部無効に設定
{
UIEnable(ID_FILE_COPY_TAB, FALSE);
UIEnable(ID_FILE_NEW_WINDOW, FALSE);
UIEnable(ID_FILE_NEW_SESSION, FALSE);
UIEnable(ID_FILE_OPEN, FALSE);
UIEnable(ID_FILE_EDIT, FALSE);
// UIEnable(ID_FILE_SAVE, FALSE); //■コメントアウト 有効/無効設定必要
// UIEnable(ID_FILE_SAVE_AS, FALSE); //■コメントアウト 有効/無効設定必要
UIEnable(ID_FILE_SEND_PAGE, FALSE);
UIEnable(ID_FILE_SEND_LINK, FALSE);
// UIEnable(ID_FILE_CREATE_SHORTCUT, FALSE); //■コメントアウト 有効/無効設定必要
UIEnable(ID_FILE_INPORT_EXPORT, FALSE);
// UIEnable(ID_FILE_PROPERTY, FALSE); //■コメントアウト 有効/無効設定必要
UIEnable(ID_FILE_OFFLINE, FALSE);
// UIEnable(ID_EDIT_FIND, FALSE); //■コメントアウト 有効/無効設定必要
UIEnable(ID_VIEW_FIXED, FALSE);
UIEnable(ID_VIEW_QUICKTAB, FALSE);
UIEnable(ID_VIEW_FAVORITE, FALSE);
UIEnable(ID_VIEW_HISTORY, FALSE);
UIEnable(ID_VIEW_FEED, FALSE);
![]()
これで実行すると今回実装したメニューが利用できるようになった。
試してみると「保存」コマンドはInternet Explorer 8では.mhtファイルへの保存に対応しているが、今回の実装ではうまく動かない。ページが完全に読み込み終わる前にメニューを選択するとmhtファイルの選択欄が現れるが、ページが読み込まれた後にメニューを選択すると選択肢が消えてしまう。IE8だからなのかはわからないがどうも挙動がおかしい。それらの調査は今後行うことにして今は保留しておく。
次回はメニュー関連からは少し離れてステータスバーを少し見直す。
