2

私はソフトウェアの経験が豊富ですが、Windowsプログラミングはあまり行っていません。スレッドからWM_USERメッセージを投稿して、メインUIスレッドで取得されるようにしようとしていますが、問題が発生しています。これは、VS2010とMFCを使用するC++です。

このようにしてメッセージマップを作成しました。

#define WM_MYMSG (WM_USER + 77)
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
    ON_MESSAGE(WM_MYMSG, DoSomething)
END_MESSAGE_MAP()

ハンドラー関数を次のように宣言しました。

afx_msg LRESULT DoSomething(WPARAM wParam, LPARAM lParam);

そして、関数本体を次のように記述します。

LRESULT CMyApp::DoSomething( WPARAM wParam, LPARAM lParam ) 
{
    UNREFERENCED_PARAMETER(wParam);
    UNREFERENCED_PARAMETER(lParam);

    CallSomeFunction();
    return 0L;
}

私が見る限り、これはすべて、MSDNがここで述べているように言っていることと一致しています。

http://msdn.microsoft.com/en-gb/library/k35k2bfs(v=vs.100).aspx

しかし、私は

error C2440: 'static_cast' : cannot convert from 'LRESULT (__cdecl CMyApp::*)(WPARAM,LPARAM)' to 'LRESULT (__cdecl CWnd::* )(WPARAM,LPARAM)'

ラインに関連する

ON_MESSAGE(WM_AVATAR_SCALE_MSG, DoSomething)

誰かが私に問題が何であるかを教えてもらえますか?

読んでくれてありがとう。

ポール

4

3 に答える 3

5

CMyAppは、CWinThreadから継承するCWinAppから継承します。CWinThreadユーザー定義メッセージは、メッセージマップで、実行したいことのための特別なマクロを取ります。

これを変える:

ON_MESSAGE(WM_AVATAR_SCALE_MSG, DoSomething)

これに:

ON_THREAD_MESSAGE(WM_AVATAR_SCALE_MSG, DoSomething)

あなたのクラスDoSomething()のメンバーであると仮定します。CMyApp

詳細については、のドキュメントを参照してON_THREAD_MESSAGE()ください。

于 2013-03-18T10:30:31.627 に答える
0

問題は、メッセージ マップが CWnd の関数を期待しているのに対し、実際にそのようなものであるか CWnd から継承されているため、クラスが明らかに CWnd ではないことです。

于 2013-03-18T10:20:48.800 に答える
-1

この関数は、WPARAM と LPARAM を受け取る CWnd のメソッドを渡すことを期待していますが、CMyApp の関数を渡しています。

CMyApp クラスを CWnd クラスから拡張します。

class CMyApp : public CWnd {
    // members here
};

編集

これが不可能な場合は、CWnd の関数、または適切なパラメーターと戻り値の型を使用して CWnd から拡張されたクラスのその他の関数を渡す方法を見つける必要があります。

于 2013-03-18T10:23:52.277 に答える