![]()
Internet ExplorerやIEコントロールでは、リンクをクリックするときなどNavigateが開始されるときにプチッというクリック音が鳴る。今回はそのクリック音を切る機能を追加する。
設定方法はいくつか考えられるが、今回はツールバーのボタンとして実装する。そのためのボタンをリソースウインドウで追加する。IDは「ID_CLICK_SOUND」とした。
![]()
作成したボタンをUI_MAPに追加する。そして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_TOOL_WINDOWS_UPDATE, FALSE);
UIEnable(ID_TOOL_DEVELOP, FALSE);
UIEnable(ID_TOOL_INTERNET_OPTION, FALSE);
}
//■追加
//ツールバーボタン。クリック音を鳴らす
{
bool bDisable;
bDisable = IsFeatureEnabled(FEATURE_DISABLE_NAVIGATION_SOUNDS);
UISetCheck(ID_CLICK_SOUND,! bDisable);
}
UIUpdateToolBar();
return FALSE;
}
//■追加
bool IsFeatureEnabled(INTERNETFEATURELIST FeatureEntry)
{
HRESULT hr;
hr = ::CoInternetIsFeatureEnabled(FeatureEntry,SET_FEATURE_ON_PROCESS);
if(hr == S_OK)
return true;
return false;
}
BEGIN_UPDATE_UI_MAP(CMainFrame)
UPDATE_ELEMENT(ID_CLICK_SOUND, UPDUI_TOOLBAR) //■追加
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)
![]()
さらにツールバーのボタンがクリックされたときの処理を追加する。
BEGIN_MSG_MAP(CMainFrame)
MESSAGE_HANDLER(WM_DNP_CREATENEWTAB, OnDnpCreateNewTab)
MESSAGE_HANDLER(WM_DNP_CHANGEFOCUS, OnDnpChangeFocus)
MESSAGE_HANDLER(WM_DNP_CHANGEADDRESS, OnDnpChangeAddress)
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_ID_HANDLER(ID_EDIT_COPY, OnFileCommand)
COMMAND_ID_HANDLER(ID_EDIT_CUT, OnFileCommand)
COMMAND_ID_HANDLER(ID_EDIT_PASTE, OnFileCommand)
COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL, OnFileCommand)
COMMAND_ID_HANDLER(ID_FILE_SAVE, OnFileCommand)
COMMAND_ID_HANDLER(ID_FILE_SAVE_AS, OnFileCommand)
COMMAND_ID_HANDLER(ID_FILE_CREATE_SHORTCUT, OnFileCommand)
COMMAND_ID_HANDLER(ID_FILE_PROPERTY, OnFileCommand)
COMMAND_ID_HANDLER(ID_EDIT_FIND, OnFileCommand)
COMMAND_ID_HANDLER(ID_CLICK_SOUND, 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)
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_CLICK_SOUND: //クリック音を再生するかどうかの設定
{
bool bDisable;
bDisable = IsFeatureEnabled(FEATURE_DISABLE_NAVIGATION_SOUNDS);
::CoInternetSetFeatureEnabled(FEATURE_DISABLE_NAVIGATION_SOUNDS,SET_FEATURE_ON_PROCESS,bDisable ? FALSE : TRUE);
}
break;
case ID_FILE_SAVE: //上書き保存
pView->Save();
break;
case ID_FILE_SAVE_AS: //名前を付けて保存
pView->SaveAs();
break;
case ID_FILE_CREATE_SHORTCUT: //デスクトップにリンク作成
pView->CreateShortcut();
break;
case ID_FILE_PROPERTY: //プロパティ
pView->ShowProperty();
break;
case ID_EDIT_FIND: //検索
pView->ShowFind();
break;
case ID_EDIT_COPY: //コピー
pView->Copy();
break;
case ID_EDIT_CUT: //切り取り
pView->Cut();
break;
case ID_EDIT_PASTE: //貼り付け
pView->Paste();
break;
case ID_EDIT_SELECT_ALL: //全てを選択
pView->SelectAll();
break;
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;
}
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
// コマンドバー ウィンドウの作成
HWND hWndCmdBar = m_CmdBar.Create(m_hWnd, rcDefault, NULL, ATL_SIMPLE_CMDBAR_PANE_STYLE);
// メニューのアタッチ
m_CmdBar.AttachMenu(GetMenu());
// コマンドバー画像の読み込み
m_CmdBar.LoadImages(IDR_MAINFRAME);
// 以前のメニューの削除
SetMenu(NULL);
HWND hWndToolBar = CreateSimpleToolBarCtrl(m_hWnd, IDR_MAINFRAME, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE);
CreateSimpleReBar(ATL_SIMPLE_REBAR_NOBORDER_STYLE);
AddSimpleReBarBand(hWndCmdBar);
AddSimpleReBarBand(hWndToolBar, NULL, TRUE);
_wndAddressBar.Create(m_hWnd,CRect(0,0,200,200),0,WS_CHILD | WS_VISIBLE | CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_CLIPCHILDREN,WS_EX_CLIENTEDGE);
AddSimpleReBarBand(_wndAddressBar,0,TRUE); //■変更 アドレスバーを1列で表示
//ダミーウインドウを生成し、リバーに割り当てる。これはIEツールバーに利用
//ここで生成してしまうと何もないリバーができてしまうが気にしない
_wndDummy.Create(m_hWnd,CRect(0,0,500,24),0,WS_CHILD);
AddSimpleReBarBand(_wndDummy,0,TRUE); //1行表示
CreateSimpleStatusBar();
m_hWndClient = m_view.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE);
UIAddToolBar(hWndToolBar);
UISetCheck(ID_VIEW_TOOLBAR, 1);
UISetCheck(ID_VIEW_STATUS_BAR, 1);
// メッセージ フィルターおよび画面更新用のオブジェクト登録
CMessageLoop* pLoop = _Module.GetMessageLoop();
ATLASSERT(pLoop != NULL);
pLoop->AddMessageFilter(this);
pLoop->AddIdleHandler(this);
CMenuHandle menuMain = m_CmdBar.GetMenu();
m_view.SetWindowMenu(menuMain.GetSubMenu(WINDOW_MENU_POSITION));
_cTabImageList.Create(16,16,ILC_COLOR | ILC_MASK,1,10);
m_view.SetImageList(_cTabImageList);
return 0;
}
![]()
これでツールバーにプッシュ式のボタンが追加され、押し込んだ状態のときはクリック音が鳴り、そうでないときはクリック音が鳴らなくなった。
次回からはスクリプトや画像表示のON/OFF用のボタンを用意し、今回のクリック音のように自由に設定できるようにする。
