はじめまして。いつもお世話になっております。山本といいます。
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・その他の参考になりそうなサイト等の情報
です。
長々と申し訳ないです。
ポストメッセージの基本部分のことだと思いますが、よろしくお願いします。
見たところ、WM_MYMESSAGEメッセージはCTestDlgに向けてポスとしているのに、
CWorkThreadクラスで受け取ろうとしていますね。
CTestDlgクラスのメッセージマップに
ON_MESSAGE ( WM_MYMESSAGE, OnMyMessage )
を記述し、
afx_msg LRESULT OnMyMessage ( UINT wParam, LONG lParam );
もCTestDlgクラスに追加すべきかと。
CWorkThreadでメッセージを受けたいのですよね?
今のままでは、CTestDlgが自分自身にメッセージを送っています。
また、スレッドクラスを、メンバ変数として持つ必要があります。
(今のままでは、OnInitDialog終了時にスレッドクラスが破棄されてしまいます)
CWorkThreadがCWinThreadを継承しているのであれば、
CWinThread::PostThreadMessage と ON_THREAD_MESSAGE をご参考に
sugarさん、REEさん。ありがとうございます。
>WM_MYMESSAGEメッセージはCTestDlgに向けて
PostMessageってそういうもんだったんですね。
m_wThread.PostThreadMessage ( WM_MYMESSAGE, 0, 0 );
と修正しました。で、動いてくれました!
頭の中に描いていたメッセージの動き(流れ?)に大きな勘違いがありました。
メッセージキューのイメージが間違ってました。