ダイアログバーのイベントの取得方法 – プログラミング – Home

ダイアログバーのイベントの取得方法
 
通知
すべてクリア

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


Y.Kondow
 Y.Kondow
(@Y.Kondow)
ゲスト
結合: 18年前
投稿: 2
Topic starter  

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);


引用解決済
トピックタグ
通りすがり
 通りすがり
(@通りすがり)
ゲスト
結合: 24年前
投稿: 92
 

マウスメッセージ意外をどのように拾っているのか分かりませんが、

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


返信引用
Y.Kondow
 Y.Kondow
(@Y.Kondow)
ゲスト
結合: 18年前
投稿: 2
Topic starter  

ダイアログバーに付属しているコントローラについては、下記処理でサブクラス化して
クラスウィザードで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
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

m_wndDlgBarで拾って、MainFramにイベントを飛ばせば良いのでは?
なぜ、ダイアログバー上のマウスイベントまで必要なのかがよくわかりませんけれど。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

ダイアログバーをサブクラス化して、PreTranslateMessage()関数を
オーバーライドすれば拾えると思います。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

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
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

今回ダイアログバ-ですから、
>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
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>void CMainFrame::OnUpdateBnClickedButtonX(CCmdUI *pCmdUI)
              ↓
void CBarDlg::OnUpdateBnClickedButtonX(CCmdUI *pCmdUI)
こうでしたね。
「CBarDlg」は例です。


返信引用
久方ぶり
 久方ぶり
(@久方ぶり)
ゲスト
結合: 18年前
投稿: 7
 

最初の説明が支離滅裂、さらに次に書いたサブクラス化している部分とMainFramにイベ
ントを飛ばして拾ってるという関係の無さにビックリするわけだが・・・

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました