第13回 「お気に入りの整理」機能を実装する (タブブラウザーを作る)

tabbrowser56.gif
前回は「お気に入りに追加」機能を実装した。今回は「お気に入りの整理」機能を追加する。

前回までに作成したプロジェクトの「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;
	}

tabbrowser57.gif
これでビルド/実行すると「お気に入りの整理」機能が使えるようになった。
この「お気に入りの整理」用のDoOrganizeFavDlg()は引数に任意のフォルダを与えるとそこをルートとしたウインドウが開く。そのため自作の各種アプリケーションでも再利用可能だ。

次回は「お気に入り」メニューにアイコンを表示できるようにする。

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


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