![]()
前回は「お気に入りに追加」機能を実装した。今回は「お気に入りの整理」機能を追加する。
前回までに作成したプロジェクトの「MainFrm.h」を開く、そして前回追加しておいた「お気に入りの整理」メニューが選択されたときの処理を実装する。
「お気に入りの整理」は「お気に入りの追加」と同じようにInternet Explorerが標準で備えている機能を呼びだすことで実現する。ただし前回の「お気に入りの追加」とは異なりCOMインターフェース経由ではなく、shdocvw.dllをLoadLibraryしてDoOrganizeFavDlgWなどを呼びだすことにより開く。
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)
COMMAND_ID_HANDLER(ID_IE_ORGANIZE_FAVORITE, OnIEOrganizeFavorite) //■追加
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 OnIEOrganizeFavorite(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
DoOrganizeFavDlg(m_hWnd);
return 0;
}
//■追加
//「お気に入りの整理」ウインドウを開く
//pszFolder==NULLなら「お気に入り」がルートで開く
bool DoOrganizeFavDlg(HWND hWnd,LPTSTR pszFolder=NULL)
{
BOOL (WINAPI* pfnDoOrganizeFavDlg)(HWND hWnd,LPTSTR pszFolder);
BOOL ret;
HMODULE hDLL;
ret = FALSE;
hDLL = ::LoadLibrary(_T("shdocvw.dll"));
if(hDLL == NULL)
return false;
#ifdef _UNICODE
(FARPROC&)pfnDoOrganizeFavDlg = ::GetProcAddress(hDLL,"DoOrganizeFavDlgW");
#else
(FARPROC&)pfnDoOrganizeFavDlg = ::GetProcAddress(hDLL,"DoOrganizeFavDlg");
#endif
if(pfnDoOrganizeFavDlg)
ret = pfnDoOrganizeFavDlg(hWnd,pszFolder);
::FreeLibrary(hDLL);
return ret ? true : false;
}
![]()
これでビルド/実行すると「お気に入りの整理」機能が使えるようになった。
この「お気に入りの整理」用のDoOrganizeFavDlg()は引数に任意のフォルダを与えるとそこをルートとしたウインドウが開く。そのため自作の各種アプリケーションでも再利用可能だ。
次回は「お気に入り」メニューにアイコンを表示できるようにする。
