第25回 印刷関連機能が使えるようにする (タブブラウザーを作る)

tabbrowser100.gif
前回はツールバーとして「Googleツールバー」を利用するというかなりヘビーな実装をした。今回は軽く印刷関連機能の実装を行う。

IEコントロールはIWebBrowser2::ExecWB (IOleCommandTarget::Exec)により各種操作ができるように作られている。ここにOLECMDID_PRINTなどを与えることで印刷機能を利用する。

実際にIWebBrowser2を操作する処理をCIEUtilityに追加する。

ちなみに私はIOleCommandTarget関連は後から機能を拡張できる利点がある反面、外側から何が実装されているのかが分かりにくくCOMインターフェースの嫌な部分だと思う。なんとかならないのかな。。。
	//■追加
	//bPrintOrPreview=trueなら印刷、falseなら印刷プレビュー
	bool	PrintOrPreview(bool bPrintOrPreview)
	{
		HRESULT	hr;

		if(_pIWebBrowser2 == NULL)
			return	false;

		if(bPrintOrPreview)
			hr = _pIWebBrowser2->ExecWB(OLECMDID_PRINT,OLECMDEXECOPT_PROMPTUSER,NULL,NULL);
		else
			hr = _pIWebBrowser2->ExecWB(OLECMDID_PRINTPREVIEW,OLECMDEXECOPT_PROMPTUSER,NULL,NULL);

		return	SUCCEEDED(hr) ? true : false;
	}

	//■追加
	bool	PrintSetup(void)
	{
		HRESULT	hr = E_FAIL;

		if(_pIWebBrowser2)
			hr = _pIWebBrowser2->ExecWB(OLECMDID_PAGESETUP,OLECMDEXECOPT_PROMPTUSER,NULL,NULL);

		return	SUCCEEDED(hr) ? true : false;
	}

tabbrowser101.gif そして「MainFrm.h」側でメニュー操作により飛んで来た印刷関連メッセージを処理するメッセージハンドラを追加する。
	BEGIN_MSG_MAP(CMainFrame)
		MESSAGE_HANDLER(WM_DNP_CREATENEWTAB, OnDnpCreateNewTab)
		MESSAGE_HANDLER(WM_DNP_CHANGEFOCUS, OnDnpChangeFocus)
		MESSAGE_HANDLER(WM_DNP_CHANGEADDRESS, OnDnpChangeAddress)
		MESSAGE_HANDLER(WM_DNP_CHANGESTATUSTEXT, OnDnpChangeStatusText)
		MESSAGE_HANDLER(WM_DNP_CHANGEPROGRESS, OnDnpChangeProgress)
		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_ID_HANDLER(ID_FILE_PRINT, OnFileCommand)					//■追加
		COMMAND_ID_HANDLER(ID_FILE_PRINT_PREVIEW, OnFileCommand)			//■追加
		COMMAND_ID_HANDLER(ID_FILE_PRINT_SETUP, 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)
		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_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;
	}

tabbrowser102.gif
これで「印刷」「印刷プレビュー」「プリンタの設定」の各項目が利用できるようになった。

次回は「切り取り」「コピー」「貼り付け」というクリップボード関連機能を実装する。

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


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