mfc — sendmessage / postmessage с пользовательскими параметрами

Я хочу иметь обработчик сообщений в 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);
}

Это возможно?

0

Решение

Подпись функций-членов, которые вызываются через 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.

1

Другие решения

Попробуйте использовать сообщения WM_USER в качестве собственного сообщения и обработайте его в методе OnMessage, переопределив его. Чтобы узнать о сообщениях WM_USER, обратитесь Вот

0

Если вы отправляете сообщение в диапазоне ниже WM_USER для асинхронных функций сообщений (PostMessage, SendNotifyMessage и SendMessageCallback), его параметры сообщения не могут включать указатели. В противном случае операция не удастся. Функции вернутся до того, как получающий поток сможет обработать сообщение, и отправитель освободит память перед использованием.

Параметры сообщения PostMessage могут включать указатели
Вы можете включить указатели в качестве параметров. Приведите их к целому числу и не удаляйте и не освобождайте их в потоке или функции, которая запускает PostMessage, а удаляйте или освобождайте их в принимающем потоке или функции.
Просто убедитесь, что при использовании указателя, что вы используете только один тип указателя для одного сообщения, не смешивайте указатель на разные объекты с одним и тем же сообщением.

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

0
По вопросам рекламы [email protected]