Я хочу иметь обработчик сообщений в 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_MSGBEGIN_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);
}
Это возможно?
Подпись функций-членов, которые вызываются через ON_MESSAGE или ON_Rurable_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, как предложено в ответе пользователя 2173190.
Попробуйте использовать сообщения WM_USER в качестве собственного сообщения и обработайте его в методе OnMessage, переопределив его. Чтобы узнать о сообщениях WM_USER, обратитесь Вот
Если вы отправляете сообщение в диапазоне ниже WM_USER для асинхронных функций сообщений (PostMessage, SendNotifyMessage и SendMessageCallback), его параметры сообщения не могут включать указатели. В противном случае операция не удастся. Функции вернутся до того, как получающий поток сможет обработать сообщение, и отправитель освободит память перед использованием.
Параметры сообщения PostMessage могут включать указатели
Вы можете включить указатели в качестве параметров. Приведите их к целому числу и не удаляйте и не освобождайте их в потоке или функции, которая запускает PostMessage, а удаляйте или освобождайте их в принимающем потоке или функции.
Просто убедитесь, что при использовании указателя, что вы используете только один тип указателя для одного сообщения, не смешивайте указатель на разные объекты с одним и тем же сообщением.
http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms644944(v=vs.85).aspx