第36回 キーボードショートカットを設定する (タブブラウザーを作る)

tabbrowser148.gif
前回はタブブラウザーに(機能は実装していないものの)メニュー項目を大量追加した。今回はメニューに割り当てられているショートカットキーの設定、未実装項目のグレーアウトをする。

キーボードショートカットの設定はリソースのアクセラレーターで行う。今回も数が多いのでリソースファイルを直接編集することにした。ソリューションエクスプローラーで「TabBrowser100.rc」を右クリックして現われるメニューから「コードの表示」を選択する。

tabbrowser149.gif リソースファイルが開いたら、「Accelerator」セクションにある定義をメニューに即したものに書き換える。今回は以下のようにした。
/////////////////////////////////////////////////////////////////////////////
//
// Accelerator
//

IDR_MAINFRAME ACCELERATORS 
BEGIN
    "T",            ID_FILE_NEW,                VIRTKEY, CONTROL
    "K",            ID_FILE_COPY_TAB,           VIRTKEY, CONTROL
    "N",            ID_FILE_NEW_WINDOW,         VIRTKEY, CONTROL
    "O",            ID_FILE_OPEN,               VIRTKEY, CONTROL
    "S",            ID_FILE_SAVE,               VIRTKEY, CONTROL
    "W",            ID_WINDOW_CLOSE,            VIRTKEY, CONTROL
    "P",            ID_FILE_PRINT,              VIRTKEY, CONTROL
    "X",            ID_EDIT_CUT,                VIRTKEY, CONTROL
    "C",            ID_EDIT_COPY,               VIRTKEY, CONTROL
    "V",            ID_EDIT_PASTE,              VIRTKEY, CONTROL
    "A",            ID_EDIT_SELECT_ALL,         VIRTKEY, CONTROL
    "F",            ID_EDIT_FIND,               VIRTKEY, CONTROL
    "Q",            ID_VIEW_QUICKTAB,           VIRTKEY, CONTROL
    "I",            ID_VIEW_FAVORITE,           VIRTKEY, CONTROL, SHIFT
    "H",            ID_VIEW_HISTORY,            VIRTKEY, CONTROL, SHIFT
    "J",            ID_VIEW_FEED,               VIRTKEY, CONTROL, SHIFT
    VK_ESCAPE,      ID_IE_STOP,                 VIRTKEY
    VK_F5,          ID_IE_REFRESH,              VIRTKEY
    VK_ADD,         ID_VIEW_ZOOM_PLUS,          VIRTKEY, CONTROL
    VK_SUBTRACT,    ID_VIEW_ZOOM_MINUS,         VIRTKEY, CONTROL
    VK_F7,          ID_VIEW_CURSOR_BROWSE,      VIRTKEY
    VK_F11,         ID_VIEW_FULL_SCREEN,        VIRTKEY
    VK_F4,          ID_WINDOW_CLOSE,            VIRTKEY, CONTROL
    VK_DELETE,      ID_TOOL_CLEAR_HISTORY,      VIRTKEY, CONTROL, SHIFT
    "P",            ID_TOOL_INPRIVATE_BROWSE,   VIRTKEY, CONTROL, SHIFT
    "F",            ID_TOOL_INPRIVATE_FILTER,   VIRTKEY, CONTROL, SHIFT
    VK_F12,         ID_TOOL_DEVELOP,            VIRTKEY
    VK_BACK,        ID_EDIT_UNDO,           VIRTKEY, ALT
    VK_DELETE,      ID_EDIT_CUT,            VIRTKEY, SHIFT
    VK_INSERT,      ID_EDIT_COPY,           VIRTKEY, CONTROL
    VK_INSERT,      ID_EDIT_PASTE,          VIRTKEY, SHIFT
    VK_F6,          ID_NEXT_PANE,           VIRTKEY 
    VK_F6,          ID_PREV_PANE,           VIRTKEY, SHIFT
END

tabbrowser150.gif
さらに追加したメニュー項目を選択できないようにグレー表示にする。

「MainFrm.h」を開き、追加したメニュー項目をUIアイテムとして登録、無効化する。向こうにするだけなので本来ならOnCreateでUIEnable設定するべきだが、今後修正が楽なように今回はOnIdleに配置した。
	virtual BOOL OnIdle()
	{
		CTabBrowser100View*	pView;

		pView = GetActivePageView();

		//「戻る」「進む」ボタンの状態設定
		{
			bool	bBack = false;
			bool	bNext = false;

			if(pView)
				pView->IsButtonEnable(bBack,bNext);

			UIEnable(ID_IE_BACK,bBack ? TRUE : FALSE);
			UIEnable(ID_IE_NEXT,bNext ? TRUE : FALSE);
		}

		//「編集」メニュー項目更新
		{
			bool	bCopy		= false;
			bool	bCut		= false;
			bool	bPaste		= false;
			bool	bSelectAll	= false;

			if(pView)
				pView->IsEnable_EditCommand(bCopy,bCut,bPaste,bSelectAll);

			UIEnable(ID_EDIT_COPY		,bCopy ? TRUE : FALSE);
			UIEnable(ID_EDIT_CUT		,bCut ? TRUE : FALSE);
			UIEnable(ID_EDIT_PASTE		,bPaste ? TRUE : FALSE);
			UIEnable(ID_EDIT_SELECT_ALL	,bSelectAll ? TRUE : FALSE);
		}


		//■追加 未実装メニュー項目を全部無効に設定
		{
			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);
			UIEnable(ID_VIEW_GO, FALSE);
			UIEnable(ID_VIEW_ZOOM_PLUS, FALSE);
			UIEnable(ID_VIEW_ZOOM_MINUS, FALSE);
			UIEnable(ID_VIEW_ZOOM_400, FALSE);
			UIEnable(ID_VIEW_ZOOM_200, FALSE);
			UIEnable(ID_VIEW_ZOOM_150, FALSE);
			UIEnable(ID_VIEW_ZOOM_125, FALSE);
			UIEnable(ID_VIEW_ZOOM_100, FALSE);
			UIEnable(ID_VIEW_ZOOM_75, FALSE);
			UIEnable(ID_VIEW_ZOOM_50, FALSE);
			UIEnable(ID_VIEW_ZOOM_CUSTOM, FALSE);
			UIEnable(ID_VIEW_CHAR_MAX, FALSE);
			UIEnable(ID_VIEW_CHAR_LARGE, FALSE);
			UIEnable(ID_VIEW_CHAR_MIDDLE, FALSE);
			UIEnable(ID_VIEW_CHAR_SMALL, FALSE);
			UIEnable(ID_VIEW_CHAR_MIN, FALSE);
			UIEnable(ID_VIEW_ENCODE_AUTO, FALSE);
			UIEnable(ID_VIEW_ENCODE_TO_RIGHT, FALSE);
			UIEnable(ID_VIEW_ENCODE_TO_LEFT, FALSE);
			UIEnable(ID_VIEW_STYLE_NONE, FALSE);
			UIEnable(ID_VIEW_STYLE_DEFAULT, FALSE);
			UIEnable(ID_VIEW_CURSOR_BROWSE, FALSE);
			UIEnable(ID_VIEW_SOURCE, FALSE);
			UIEnable(ID_VIEW_SECURITY_REPORT, FALSE);
			UIEnable(ID_VIEW_DOMAIN, FALSE);
			UIEnable(ID_VIEW_PRIVACY_POLICY, FALSE);
			UIEnable(ID_VIEW_FULL_SCREEN, FALSE);
			UIEnable(ID_FAVORITE_ADD_TO_BAR, FALSE);
			UIEnable(ID_FAVORITE_ADD_ALLTAB, FALSE);
			UIEnable(ID_TOOL_CLEAR_HISTORY, FALSE);
			UIEnable(ID_TOOL_INPRIVATE_BROWSE, FALSE);
			UIEnable(ID_TOOL_CHECK_NETSTAT, FALSE);
			UIEnable(ID_TOOL_OPEN_LAST_SESSION, FALSE);
			UIEnable(ID_TOOL_INPRIVATE_FILTER, FALSE);
			UIEnable(ID_TOOL_INPRIVATE_FILTER_OPTION, FALSE);
			UIEnable(ID_TOOL_POPUP_DISABLE, FALSE);
			UIEnable(ID_TOOL_POPUP_OPTION, FALSE);
			UIEnable(ID_TOOL_CHECK_THIS_SITE, FALSE);
			UIEnable(ID_TOOL_SMARTSCREEN_DISABLE, FALSE);
			UIEnable(ID_TOOL_SEND_REPORT, FALSE);
			UIEnable(ID_TOOL_MANAGE_ADDON, FALSE);
			UIEnable(ID_TOOL_FEED_ADD, FALSE);
			UIEnable(ID_TOOL_FEED_FIND, FALSE);
			UIEnable(ID_TOOL_WINDOWS_UPDATE, FALSE);
			UIEnable(ID_TOOL_DEVELOP, FALSE);
			UIEnable(ID_TOOL_INTERNET_OPTION, FALSE);
		}

		UIUpdateToolBar();
		return FALSE;
	}

	BEGIN_UPDATE_UI_MAP(CMainFrame)
		UPDATE_ELEMENT(ID_VIEW_TOOLBAR, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_STATUS_BAR, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_IE_BACK, UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_IE_NEXT, UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_EDIT_COPY, UPDUI_TOOLBAR | UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_EDIT_CUT, UPDUI_TOOLBAR | UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_EDIT_PASTE, UPDUI_TOOLBAR | UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_EDIT_SELECT_ALL, UPDUI_TOOLBAR | UPDUI_MENUPOPUP)
		//■以下追加
		UPDATE_ELEMENT(ID_FILE_COPY_TAB, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FILE_NEW_WINDOW, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FILE_NEW_SESSION, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FILE_OPEN, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FILE_EDIT, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FILE_SAVE, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FILE_SAVE_AS, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FILE_SEND_PAGE, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FILE_SEND_LINK, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FILE_CREATE_SHORTCUT, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FILE_INPORT_EXPORT, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FILE_PROPERTY, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FILE_OFFLINE, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_EDIT_FIND, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_FIXED, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_QUICKTAB, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_FAVORITE, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_HISTORY, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_FEED, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_GO, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_ZOOM_PLUS, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_ZOOM_MINUS, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_ZOOM_400, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_ZOOM_200, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_ZOOM_150, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_ZOOM_125, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_ZOOM_100, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_ZOOM_75, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_ZOOM_50, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_ZOOM_CUSTOM, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_CHAR_MAX, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_CHAR_LARGE, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_CHAR_MIDDLE, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_CHAR_SMALL, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_CHAR_MIN, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_ENCODE_AUTO, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_ENCODE_TO_RIGHT, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_ENCODE_TO_LEFT, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_STYLE_NONE, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_STYLE_DEFAULT, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_CURSOR_BROWSE, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_SOURCE, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_SECURITY_REPORT, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_DOMAIN, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_PRIVACY_POLICY, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_FULL_SCREEN, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FAVORITE_ADD_TO_BAR, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FAVORITE_ADD_ALLTAB, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_CLEAR_HISTORY, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_INPRIVATE_BROWSE, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_CHECK_NETSTAT, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_OPEN_LAST_SESSION, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_INPRIVATE_FILTER, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_INPRIVATE_FILTER_OPTION, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_POPUP_DISABLE, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_POPUP_OPTION, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_CHECK_THIS_SITE, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_SMARTSCREEN_DISABLE, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_SEND_REPORT, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_MANAGE_ADDON, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_FEED_ADD, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_FEED_FIND, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_WINDOWS_UPDATE, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_DEVELOP, UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_TOOL_INTERNET_OPTION, UPDUI_MENUPOPUP)
	END_UPDATE_UI_MAP()

tabbrowser151.gif
これでビルド/実行すると未実装なメニュー項目がグレーアウトし、選択できなくなった。

本当はさらにステータスバーへのメッセージ表示やTIPSが表示されるように、ストリングリソースの編集も行うべきだが、数が多く面倒なので保留しておく。

次回は「ファイル」メニューの「プロパティ」などいくつかのメニュー項目を実装する。

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


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