0

メッセージマップで定義したパラメータを受け入れるMFCのメッセージハンドラが必要です。

例えば、

static UINT UWM_STATUS_MSG = RegisterWindowMessage("Status message");
static UINT UWM_GOT_RESULT= RegisterWindowMessage("Result has been obtained");

//{{AFX_MSG(MyClass)
    afx_msg void OnCustomStringMessage(LPCTSTR);
    afx_msg void OnStatusMessage();
//}}AFX_MSG


BEGIN_MESSAGE_MAP(MyClass, CDialog)
    //{{AFX_MSG_MAP(MyClass)
        ON_REGISTERED_MESSAGE(UWM_STATUS_MSG, OnStatusMessage)
        ON_REGISTERED_MESSAGE(UWM_GOT_RESULT, OnCustomStringMessage)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void MyClass::OnCustomStringMessage(LPCTSTR result)
{
    m_result.SetWindowText(result);
}

void MyClass::OnStatusMessage()
{
    // Do something
}

DWORD WINAPI MyClass::thread(LPVOID lParam)
{
    char result[256] = { 0 };
    SendMessage(UWM_STATUS_MSG);

    // Do some stuff and store the result

    PostMessage(UWM_GOT_RESULT, result);
}

そのようなことは可能ですか?

4

3 に答える 3

1

ON_MESSAGEまたはON_REGISTERED_MESSAGEを介して呼び出されるメンバー関数のシグニチャーは、次のとおりである必要があります。

afx_msg LRESULT OnMyFunction(WPARAM p1、LPARAM p2);

キャスト演算子を使用してこれに対処する必要があります。

したがって、これを書く必要があります:

...
afx_msg LRESULT OnCustomStringMessage(WPARAM p1, LPARAM p2);
...

LRESULT MyClass::OnCustomStringMessage(WPARAM p1, LPARAM p2)
{
  LPCTSTR result = (LPCTSTR)p1 ;
   m_result.SetWindowText(result);
}

DWORD WINAPI MyClass::thread(LPVOID lParam)
{
    static char result[256] = { 0 };   // we need a static here
                                       // (see explanations from previous answers)
    SendMessage(UWM_STATUS_MSG);

    // Do some stuff and store the result

    PostMessage(UWM_GOT_RESULT, (WPARAM)result);
}

MyClass :: threadが複数の異なるスレッドから呼び出されることを意図している場合は、結果配列を静的と宣言するだけのより複雑な方法で処理する必要があります。たとえば、MyClass :: threadで配列を割り当て、提案されているようにOnCustomStringMessageで配列を削除します。 user2173190の答えによる。

于 2013-03-25T10:03:45.420 に答える
0

WM_USERメッセージをカスタムメッセージとして使用し、それをオーバーライドしてOnMessageメソッドで処理してみてください。WM_USERメッセージについて知るには、ここを参照してください

于 2013-03-25T08:33:44.290 に答える
0

WM_USER未満の範囲のメッセージを非同期メッセージ関数(PostMessage、SendNotifyMessage、およびSendMessageCallback)に送信する場合、そのメッセージパラメーターにポインターを含めることはできません。そうしないと、操作は失敗します。関数は、受信スレッドがメッセージを処理する機会を得る前に戻り、送信者はメッセージが使用される前にメモリを解放します。

PostMessageのメッセージパラメータにはポインタを含めることができますパラメータとしてポインタを含めることができます。それらを整数としてキャストし、PostMessageを起動するスレッドまたは関数でそれらを破棄または解放しないでください。ただし、受信スレッドまたは関数でそれらを破棄または解放してください。ポインタを使用するときは、1つのメッセージに対して1つのポインタタイプのみを使用するようにし、同じメッセージで異なるオブジェクトへのポインタを混在させないようにしてください。

http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms644944(v=vs.85).aspx

于 2013-03-25T09:01:51.220 に答える