子ウィンドウ上のマウスの座標をダイアログに表示するには?

[戻る]
CC 2001/08/14(火) 01:26:49
MDIベースで、アクティブな子ウィンドウ上にあるマウスの座標を
モードレスダイアログのスタティックテキストに表示させたいのですが、
方法がわかりません。

Bun 2001/08/14(火) 13:15:54
開発環境は記述するようにしましょう。
MFCをお使いでしょうか? であれば

クラスウィザードでViewのWM_MOUSEMOVEを実装すると、引数にCPointが入ってきますので
こちらから、x, yを参照できます。(CPoint.x, CPoint.y)
そしてこの関数内(OnMouseMove)でダイアログに対してユーザー定義メッセージをPostしてあげます。
ユーザー定義メッセージをPostする際に引数として、x, yを渡してあげれば良いと思います。
ユーザー定義メッセージはメッセージマップやヘッダーファイルに手動で実装しなければなりません。
また、ユーザー定義メッセージはON_MESSAGE()マクロの知識が必要になります。

ダイアログの親は何でしょう、Viewでしょうか?

CC 2001/08/14(火) 23:46:20
早速のご回答ありがとうございます。

MFCを使っています。
それとダイアログの親の件ですが、
申し訳ありませんが質問の意味が理解できないので
どう回答してよいのかわかりませんが、
何をしたらダイアログが開くかと言うことでしょうか?
だとしたら、メニューをクリックすると開くようにしています。
(的外れでしたらごめんなさい)

Bun 2001/08/15(水) 09:57:26
1. Viewのメンバにダイアログを追加する。

*** ChogeView.h ***

#include "hogeDlg.h"

hogeDlg m_dlg;

2. ClassWizardでViewクラスにOnInitialUpdateを実装する。

*** ChogeView.cpp ***

void ChogeView::OnInitialUpdate() 
{

 CView::OnInitialUpdate();

 m_dlg.Create(IDD_DIALOG1, this); // ダイアログを生成
  // ViewクラスでダイアログをCreateし、引数にthisを渡しているので
 // このダイアログの親はViewとなります

 m_dlg.ShowWindow(SW_SHOW);    // ダイアログを表示

}

3. ClassWizardでViewクラスにOnMouseMoveを実装する。

*** ChogeView.cpp ***

void CMdixyView::OnMouseMove(UINT nFlags, CPoint point) 
{
 m_dlg.PostMessage(WM_APP + 1, point.x, point.y); // ダイアログにメッセージを送信
  // wParam = point.x, lParam = point.y をセットする

 CView::OnMouseMove(nFlags, point);
}

4. hogeDlg.hの宣言部分に関数定義(Displayとした)を追加する。

class hogeDlg : public CDialog
{
// コンストラクション
public:
 hogeDlg(CWnd* pParent = NULL);   // 標準のコンストラクタ

// ダイアログ データ
 //{{AFX_DATA(hogeDlg)
 enum { IDD = IDD_DIALOG1 };
 // メモ: ClassWizard はこの位置にデータ メンバを追加します。
 //}}AFX_DATA

 (省略)

// インプリメンテーション
protected:

 // 生成されたメッセージ マップ関数
 //{{AFX_MSG(hogeDlg)
 // メモ: ClassWizard はこの位置にメンバ関数を追加します。
 //}}AFX_MSG

// ここから
 afx_msg LRESULT Display(WPARAM wParam, LPARAM lParam); // この行を追加する

// ここまで

 DECLARE_MESSAGE_MAP()
};

5. hogeDlg.cppのメッセージマップおよび関数本体を追加する。

BEGIN_MESSAGE_MAP(hogeDlg, CDialog)
 //{{AFX_MSG_MAP(hogeDlg)
 // メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
 //}}AFX_MSG_MAP

// ここから

 ON_MESSAGE(WM_APP+1, Display) // この行を追加

// ここまで 必ずこの位置に追加する

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// hogeDlg メッセージ ハンドラ

// ここから

LRESULT hogeDlg::Display(WPARAM wParam, LPARAM lParam)
{
 CString sX, sY;
 sX.Format("%d", wParam);
 sY.Format("%d", lParam);

 GetDlgItem(IDC_STATIC1)->SetWindowText(sX); // IDC_STATIC1はX座標を表示するスタティック
 GetDlgItem(IDC_STATIC2)->SetWindowText(sY); // IDC_STATIC2はY座標を表示するスタティック
 return 0;
}

// ここまで

「こんな感じで動作します」という例です。参考にしてください。

めんどうだったので、ダイアログは一度closeしたら再起動しないと再表示されないようになっています。
メッセージマップは重要ですから、わからないようであれば、解説書を購入するのも良いと思います。
夏休みなのでコーディング(特別大サービス)しちゃいました。(笑)

CC 2001/08/17(金) 10:43:56
コーディングまでしてもらってありがとうございます。

そこで、質問なんですが、
1.の Viewのメンバにダイアログを追加する。
って言うのはDialog用のクラスを新規に作成するのではなく
Viewクラスに関連付けると言うことなのでしょうか?
Dialog用にクラスを新規に作成する場合だと
このコーディングも変ってくるのでしょうか?

何度も質問して申し訳ありませんがよろしくお願いします。

Bun 2001/08/17(金) 21:58:56
> 1.の Viewのメンバにダイアログを追加する。
> って言うのはDialog用のクラスを新規に作成するのではなく
> Viewクラスに関連付けると言うことなのでしょうか?

いえ、新規に作成します。
リソースエディタでダイアログを新規につくって、そのインスタンスを
Viewクラスのメンバ変数として持つということです。

hogeDlg m_dlg; の部分がそうですね。
このhogeDlgが新規作成したダイアログのクラスです。

> Dialog用にクラスを新規に作成する場合だと
> このコーディングも変ってくるのでしょうか?
変わりません。

このあたりの話が理解できないようであれば、C++の基礎を学ぶことをおすすめします。

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