![]()
前回までにInternet Explorerに登録されている「お気に入り」が使えるようになった。今回は現在開いているタブのホームページを「お気に入り」として追加する処理を実装する。
前回までに作成したプロジェクトで「リソース」ウインドウを開き、「お気に入り」メニューに「お気に入りに追加」を作る。IDは「ID_IE_ADDFAVORITE」とした。
さらに今回は実装しないが、今後のために「お気に入りの整理」(ID_IE_ORGANIZEFAVORITE)も作成しておいた。
![]()
次に「ソリューション」ウインドウで「MainFrm.h」を開き、先ほど作成した「お気に入りに追加」メニューが選択されたときの処理を追加する。
BEGIN_MSG_MAP(CMainFrame)
MESSAGE_HANDLER(WM_DNP_CHANGEFOCUS, OnDnpChangeFocus)
NOTIFY_CODE_HANDLER(CBEN_ENDEDIT, OnAddressbarEnter)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
COMMAND_ID_HANDLER(ID_APP_EXIT, OnFileExit)
COMMAND_ID_HANDLER(ID_FILE_NEW, OnFileNew)
COMMAND_ID_HANDLER(ID_VIEW_TOOLBAR, OnViewToolBar)
COMMAND_ID_HANDLER(ID_VIEW_STATUS_BAR, OnViewStatusBar)
COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
COMMAND_ID_HANDLER(ID_WINDOW_CLOSE, OnWindowClose)
COMMAND_ID_HANDLER(ID_WINDOW_CLOSE_ALL, OnWindowCloseAll)
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) //■追加
NOTIFY_CODE_HANDLER(TBVN_CONTEXTMENU, OnTabContextMenu)
MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
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 OnIEAddFavorite(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
int nPage;
CTabBrowser100View* pView = NULL;
nPage = m_view.GetActivePage();
if(nPage < 0)
return 0;
pView = (CTabBrowser100View*)m_view.GetPageData(nPage);
if(pView == NULL)
return 0;
pView->AddFavorite();
return 0;
}
![]()
次に「TabBrowser100View.h」を開き、先ほど「MainFrm.h」から呼ばれるように設定したAddFavorite()を実装する。
//■追加
//「お気に入りに追加」UIを開く
bool AddFavorite(void)
{
HRESULT hr;
CComPtr<IShellBrowser> pIShellBrowser;
#ifndef SBCMDID_ADDTOFAVORITES
#define SBCMDID_ADDTOFAVORITES 8
#endif
if(_pIWebBrowser2 == NULL)
return false;
hr = IUnknown_QueryService(_pIWebBrowser2,SID_STopLevelBrowser,IID_IShellBrowser,(void**)&pIShellBrowser);
if(SUCCEEDED(hr))
hr = IUnknown_Exec(pIShellBrowser,&CGID_Explorer,SBCMDID_ADDTOFAVORITES,OLECMDEXECOPT_PROMPTUSER,NULL,NULL);
return SUCCEEDED(hr) ? true : false;
}
//■追加
//IOleCommandTarget::Execの実行
HRESULT IUnknown_Exec(IUnknown* pUnk,const GUID *pguidCmdGroup,DWORD nCmdID,DWORD nCmdExecOpt,VARIANTARG *pvaIn,VARIANTARG *pvaOut)
{
CComPtr<IOleCommandTarget> pIOleCommandTarget;
if(pUnk == NULL)
return E_FAIL;
pUnk->QueryInterface(IID_IOleCommandTarget,(void**)&pIOleCommandTarget);
if(pIOleCommandTarget == NULL)
return E_FAIL;
return pIOleCommandTarget->Exec(pguidCmdGroup,nCmdID,nCmdExecOpt,pvaIn,pvaOut);
}
![]()
これでビルド/実行すると「お気に入りに追加」メニューにより追加できるようになった。本当はタブを開いていない時や「about:blank」を開いているときはメニューを無効にするなどの処理が欲しいところだがとりあえず保留しておく。
次回は「お気に入りの整理」機能を実装する。
