ダイアログバーのイベントの取得方法

[戻る]
Y.Kondow 2007/02/08(木) 11:30:53
VC++2005 mfcのsdiにて

CMainFrame::OnCreate内でダイアログバーを生成しているのですが、
ダイアログバー内のすべてのイベントを取得することでができません。
釦などのオブジェクトは、CMainFrameへイベントを飛ばすことで取得できるのですが、
マウス関係のイベント拾うことができません。
どのような処理をすれば動作できるようになりますでしょうか?
お手数ですが宜しくお願い致します。


    if(!m_wndDlgBar.Create(this, 
                                IDD_DIALOGBAR1, 
                                WS_VISIBLE | 
                                CBRS_TOP,
                                AFX_IDW_TOOLBAR))
    {
        TRACE0("Failed to create toolbar\n");
        return -1;      // 作成に失敗
    }
    m_wndDlgBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndDlgBar);

通りすがり 2007/02/09(金) 03:23:56
マウスメッセージ意外をどのように拾っているのか分かりませんが、

サブクラス化するのが無難?だと思います。フックでも拾えます。

Y.Kondow 2007/02/09(金) 09:58:10
ダイアログバーに付属しているコントローラについては、下記処理でサブクラス化して
クラスウィザードでMainFramにイベントを飛ばして拾ってます。

m_btn1.SubclassDlgItem(IDC_BUTTON1,&m_wndDlgBar);//
m_btn2.SubclassDlgItem(IDC_BUTTON2,&m_wndDlgBar);//
m_btn3.SubclassDlgItem(IDC_BUTTON3,&m_wndDlgBar);//
m_btn4.SubclassDlgItem(IDC_BUTTON4,&m_wndDlgBar);//
m_btn5.SubclassDlgItem(IDC_BUTTON5,&m_wndDlgBar);//
m_btn6.SubclassDlgItem(IDC_BUTTON6,&m_wndDlgBar);//
m_btn7.SubclassDlgItem(IDC_BUTTON7,&m_wndDlgBar);//

ダイアログバー自体をクラス化する場合下記処理で問題ないのでしょうか?
m_wndDlgBar.SubclassDlgItem(IDD_DIALOGBAR1,this);

その場合、どのようにしてマウス動作のイベントを拾えばよいのか
わかりません。申し訳ありませんが、もう少しご教授いただけないでしょうか。
宜しくお願い致します。

PATIO 2007/02/09(金) 11:36:18
m_wndDlgBarで拾って、MainFramにイベントを飛ばせば良いのでは?
なぜ、ダイアログバー上のマウスイベントまで必要なのかがよくわかりませんけれど。

Kerry 2007/02/09(金) 11:46:19
ダイアログバーをサブクラス化して、PreTranslateMessage()関数を
オーバーライドすれば拾えると思います。

ITO 2007/02/09(金) 19:57:27
VC2005は分りませんが、各ボタンに対して「OnBnClickedButtonX」(Xは数字)の
ルーチンを作って以下のようにポストしてあげればいいのではないでしょうか。

void CSIDContView::OnBnClickedButtonX()
{

   CFrameWnd *main = (CFrameWnd *)AfxGetMainWnd();
    main->PostMessage(WM_XXXX, X, Y);
}

ダイアログバーの場合、デフォルトがディスイネーブル(使用不可)状態に
なっていたはず、(VC2005はわかりません)なので次の文も追加してください。
void CMainFrame::OnUpdateBnClickedButtonX(CCmdUI *pCmdUI)
{
   pCmdUI->Enable(TRUE);
    // TODO : ここにコマンド更新 UI ハンドラ コードを追加します。
}
自動で作ることが出来なかったはずです。
(VS2005はできるかもしれない)
「OnUpdateBnClickedButtonX」は適当な名前

ITO 2007/02/09(金) 21:36:05
今回ダイアログバ−ですから、
>void CSIDContView::OnBnClickedButtonX()
>{
>
>   CFrameWnd *main = (CFrameWnd *)AfxGetMainWnd();
>    main->PostMessage(WM_XXXX, X, Y);
>}

でなく
void CBarDlg::OnBnClickedButtonX()
{

   CFrameWnd *main = (CFrameWnd *)AfxGetMainWnd();
    main->PostMessage(WM_XXXX, X, Y);
}
ですかね。
「CBarDlg」は例です。

ITO 2007/02/10(土) 13:40:23
>void CMainFrame::OnUpdateBnClickedButtonX(CCmdUI *pCmdUI)
              ↓
void CBarDlg::OnUpdateBnClickedButtonX(CCmdUI *pCmdUI)
こうでしたね。
「CBarDlg」は例です。

久方ぶり 2007/03/03(土) 09:51:58
最初の説明が支離滅裂、さらに次に書いたサブクラス化している部分とMainFramにイベ
ントを飛ばして拾ってるという関係の無さにビックリするわけだが・・・

ダイアログバーのマウスイベントを拾いたいという所に着目すると
CDialogBarから派生させたクラスを作成し、そこで拾え!と言う回答をしておく。

もう少し何がしたいのか詳しく書かなければ、正しい答えは得られないでしょう。

古いスレッドには追加発言できません。