メッセージの受け取り方が分かりません。

[戻る]
山本 2005/02/22(火) 17:17:06
はじめまして。いつもお世話になっております。山本といいます。
VC6.0 MFC ダイアログベース にて開発を行っています。

さっそく質問なんですが、メッセージの受け渡しに対してギブアップです。

こちら様のサイトの下記を参考に作成を試みたのですが、残念な結果になりました。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200004/00040004.txt

まず、
> // メソッドの内容を記述
> LRESULT CxxxView::OnMyMessage(WPARAM wParam, LPARAM lParam )
> {
>     // ここにメッセージを受け取ったときの処理を記述
> }
とあったのですが、戻り値を求められました。戻り値が分かりません。
# 分からなかったのでとりあえず数値の0を返しました。

以下は自分で書いた部分です。

CTestDlg.cpp内
 // WM_APPのほうが安全とどこかで見ました。
#define WM_MYMESSAGE ( WM_APP + 1 )

 // イニットダイアログ内でセカンダリスレッド作成
BOOL CTestDlg::OnInitDialog()
{
    CWorkThread wThread;
    wThread.CreateThread ( 0, 0 );
    return TRUE;
}

 // ボタンを追加し、押下でポストメッセージ
void CTestDlg::OnButton()
{
    PostMessage ( WM_MYMESSAGE, 0, 0 );
}

WorkThread.h内
 // 追加
//{{AFX_MSG(CWorkThread)
    afx_msg LRESULT OnMyMessage ( UINT wParam, LONG lParam );
//}}AFX_MSG

WorkThread.cpp内
 // メッセージマップに追加
//{{AFX_MSG_MAP(CWorkThread)
    ON_MESSAGE ( WM_MYMESSAGE, OnMyMessage )
//}}AFX_MSG_MAP

LRESULT CWorkThread::OnMyMessage ( WPARAM wParam, LPARAM lParam )
{
    TRACE ("MessageGet\n");    // 来たらトレースで文字を表示
    return 0;                  // 戻り値が分かりません。
}

コードは以上。
エラーなどは出ません。でもボタンを押下しても無反応です。
他の部分では特に問題は起こっていません。と、思います。

質問としては、
1・LRESULT C〜::OnMyMessage ( WPARAM wParam, LPARAM lParam )の戻り値
2・上記のコードの悪い部分と、その修正方法
3・MSDNのどのあたりを調べるのがよいか → 英語が理解できませんでした。
4・その他の参考になりそうなサイト等の情報
です。

長々と申し訳ないです。
ポストメッセージの基本部分のことだと思いますが、よろしくお願いします。

sugar 2005/02/22(火) 18:11:34
見たところ、WM_MYMESSAGEメッセージはCTestDlgに向けてポスとしているのに、
CWorkThreadクラスで受け取ろうとしていますね。
CTestDlgクラスのメッセージマップに

    ON_MESSAGE ( WM_MYMESSAGE, OnMyMessage )

を記述し、

    afx_msg LRESULT OnMyMessage ( UINT wParam, LONG lParam );

もCTestDlgクラスに追加すべきかと。

REE 2005/02/22(火) 18:34:15
CWorkThreadでメッセージを受けたいのですよね?
今のままでは、CTestDlgが自分自身にメッセージを送っています。

また、スレッドクラスを、メンバ変数として持つ必要があります。
(今のままでは、OnInitDialog終了時にスレッドクラスが破棄されてしまいます)

CWorkThreadがCWinThreadを継承しているのであれば、

CWinThread::PostThreadMessage と ON_THREAD_MESSAGE をご参考に

山本 2005/02/22(火) 19:07:39
sugarさん、REEさん。ありがとうございます。

>WM_MYMESSAGEメッセージはCTestDlgに向けて
PostMessageってそういうもんだったんですね。

m_wThread.PostThreadMessage ( WM_MYMESSAGE, 0, 0 );
と修正しました。で、動いてくれました!

頭の中に描いていたメッセージの動き(流れ?)に大きな勘違いがありました。
メッセージキューのイメージが間違ってました。

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