пользовательское сообщение
От: Dancer Россия  
Дата: 05.04.02 06:22
Оценка:
Как добавить в программу обработчик к-л пользовательского сообщения? Я сделал так:
добавляю к классу диалога метод

LONG CFractalDlg::OnThreadRedraw(UINT wParam, LONG lParam)
{    ...
     return 0;
}


а Сlass Withard сам добавляет ее описание в h-файл диалога, но не туда, где остальные обработчики описаны, а просто как public, например.
Но когда я делаю PostMessage из другого потока, сообщение этой функцией не перехватывается, хотя основной процес сообщение получает, я проверял GetMessage.
В чем тут может быть дело?
Re: пользовательское сообщение
От: Кирпа В.А. Украина  
Дата: 05.04.02 07:34
Оценка: 1 (1)
Здравствуйте Dancer, Вы писали:

D>Как добавить в программу обработчик к-л пользовательского сообщения? Я сделал так:

D>добавляю к классу диалога метод

D>
D>LONG CFractalDlg::OnThreadRedraw(UINT wParam, LONG lParam)
D>{    ...
D>     return 0;
D>}
D>


D>а Сlass Withard сам добавляет ее описание в h-файл диалога, но не туда, где остальные обработчики описаны, а просто как public, например.

D>Но когда я делаю PostMessage из другого потока, сообщение этой функцией не перехватывается, хотя основной процес сообщение получает, я проверял GetMessage.
D>В чем тут может быть дело?

А в карту сообщений добавить все-равно надо

ON_MESSAGE(WM_USER + ..., OnThreadRedraw)


!0xDEAD
Re[2]: пользовательское сообщение
От: Dancer Россия  
Дата: 05.04.02 08:22
Оценка:
Здравствуйте Кирпа В.А., Вы писали:

КВ>Здравствуйте Dancer, Вы писали:


D>>Как добавить в программу обработчик к-л пользовательского сообщения? Я сделал так:

D>>добавляю к классу диалога метод

D>>
D>>LONG CFractalDlg::OnThreadRedraw(UINT wParam, LONG lParam)
D>>{    ...
D>>     return 0;
D>>}
D>>


D>>а Сlass Withard сам добавляет ее описание в h-файл диалога, но не туда, где остальные обработчики описаны, а просто как public, например.

D>>Но когда я делаю PostMessage из другого потока, сообщение этой функцией не перехватывается, хотя основной процес сообщение получает, я проверял GetMessage.
D>>В чем тут может быть дело?

КВ>А в карту сообщений добавить все-равно надо


КВ>ON_MESSAGE(WM_USER + ..., OnThreadRedraw)


А куда это добавлять надо?
Вставил в срр-файл диалога

BEGIN_MESSAGE_MAP(CFractalDlg, CDialog)
    //{{AFX_MSG_MAP(CFractalDlg)
    ON_WM_SYSCOMMAND()
         ...................

    ON_MESSAGE(WM_USER+5, OnThreadRedraw)

    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


в h-файл вставил прототип:

//{{AFX_MSG(CFractalDlg)
    virtual BOOL OnInitDialog();
        ...

        afx_msg LONG OnThreadRedraw(UINT wParam, LONG lParam);

//}}AFX_MSG
DECLARE_MESSAGE_MAP()


Там же

#define WM_THREADREDRAW        WM_USER + 5


Но однако работать не стало. Может, я еще чего забыл?
Re[3]: пользовательское сообщение
От: Кирпа В.А. Украина  
Дата: 05.04.02 09:03
Оценка: 1 (1)
Здравствуйте Dancer, Вы писали:

D>Здравствуйте Кирпа В.А., Вы писали:


КВ>>Здравствуйте Dancer, Вы писали:


D>>>Как добавить в программу обработчик к-л пользовательского сообщения? Я сделал так:

D>>>добавляю к классу диалога метод

D>>>
D>>>LONG CFractalDlg::OnThreadRedraw(UINT wParam, LONG lParam)
D>>>{    ...
D>>>     return 0;
D>>>}
D>>>


D>>>а Сlass Withard сам добавляет ее описание в h-файл диалога, но не туда, где остальные обработчики описаны, а просто как public, например.

D>>>Но когда я делаю PostMessage из другого потока, сообщение этой функцией не перехватывается, хотя основной процес сообщение получает, я проверял GetMessage.
D>>>В чем тут может быть дело?

КВ>>А в карту сообщений добавить все-равно надо


КВ>>ON_MESSAGE(WM_USER + ..., OnThreadRedraw)


D>А куда это добавлять надо?

D>Вставил в срр-файл диалога

D>
D>BEGIN_MESSAGE_MAP(CFractalDlg, CDialog)
D>    //{{AFX_MSG_MAP(CFractalDlg)
D>    ON_WM_SYSCOMMAND()
D>         ...................

D>    ON_MESSAGE(WM_USER+5, OnThreadRedraw)

D>    //}}AFX_MSG_MAP
D>END_MESSAGE_MAP()
D>


D>в h-файл вставил прототип:


D>
D>//{{AFX_MSG(CFractalDlg)
D>    virtual BOOL OnInitDialog();
D>        ...

D>        afx_msg LONG OnThreadRedraw(UINT wParam, LONG lParam);

D>//}}AFX_MSG
D>DECLARE_MESSAGE_MAP()
D>


D>Там же

D>
D>
D>#define WM_THREADREDRAW        WM_USER + 5
D>


D>Но однако работать не стало. Может, я еще чего забыл?

D>

А почему ты посылаешь диалогу этот мессаг? У тебя что диалоговое приложение? Что в этот момент активнно окно диалога?
и второе
вообще-то прототип ф-ции такой

afx_msg LRESULT OnThreadRedraw(WPARAM wParam, LPARAM lParam);
!0xDEAD
Re[4]: пользовательское сообщение
От: Dancer Россия  
Дата: 05.04.02 09:21
Оценка:
Здравствуйте Кирпа В.А., Вы писали:

КВ>Здравствуйте Dancer, Вы писали:


D>>Здравствуйте Кирпа В.А., Вы писали:


КВ>>>Здравствуйте Dancer, Вы писали:


D>>>>Как добавить в программу обработчик к-л пользовательского сообщения? Я сделал так:

D>>>>добавляю к классу диалога метод

D>>>>
D>>>>LONG CFractalDlg::OnThreadRedraw(UINT wParam, LONG lParam)
D>>>>{    ...
D>>>>     return 0;
D>>>>}
D>>>>


D>>>>а Сlass Withard сам добавляет ее описание в h-файл диалога, но не туда, где остальные обработчики описаны, а просто как public, например.

D>>>>Но когда я делаю PostMessage из другого потока, сообщение этой функцией не перехватывается, хотя основной процес сообщение получает, я проверял GetMessage.
D>>>>В чем тут может быть дело?

КВ>>>А в карту сообщений добавить все-равно надо


КВ>>>ON_MESSAGE(WM_USER + ..., OnThreadRedraw)


D>>А куда это добавлять надо?

D>>Вставил в срр-файл диалога

D>>
D>>BEGIN_MESSAGE_MAP(CFractalDlg, CDialog)
D>>    //{{AFX_MSG_MAP(CFractalDlg)
D>>    ON_WM_SYSCOMMAND()
D>>         ...................

D>>    ON_MESSAGE(WM_USER+5, OnThreadRedraw)

D>>    //}}AFX_MSG_MAP
D>>END_MESSAGE_MAP()
D>>


D>>в h-файл вставил прототип:


D>>
D>>//{{AFX_MSG(CFractalDlg)
D>>    virtual BOOL OnInitDialog();
D>>        ...

D>>        afx_msg LONG OnThreadRedraw(UINT wParam, LONG lParam);

D>>//}}AFX_MSG
D>>DECLARE_MESSAGE_MAP()
D>>


D>>Там же

D>>
D>>
D>>#define WM_THREADREDRAW        WM_USER + 5
D>>


D>>Но однако работать не стало. Может, я еще чего забыл?

D>>

КВ>А почему ты посылаешь диалогу этот мессаг? У тебя что диалоговое приложение? Что в этот момент активнно окно диалога?

КВ>и второе
КВ>вообще-то прототип ф-ции такой

КВ>afx_msg LRESULT OnThreadRedraw(WPARAM wParam, LPARAM lParam);



Да прототип-то я из книжки взял,на этот поменял — не помогает.
У меня диалоговое приложение, в момент посылки сообщения окно, конечно же, активно. Месагу посылает рабочий поток, в котором производятся вычисления, когда нужно инициировать обновление экрана. Раньше у меня все было в одном месте — запускается поток, дальше в цикле while(::GetMessage(&message, NULL, 0, 0)) инициировалось обновление нужной области экрана и все было нормально. Потом я решил сделать специальный обработчик для своего сообщения, но не тут-то было!
Я просто фигею, дорогая редакция! Это же должно быть очень просто, и в книжке написано, но не работает!
Re[5]: пользовательское сообщение
От: Кирпа В.А. Украина  
Дата: 05.04.02 09:25
Оценка: 3 (1)
Здравствуйте Dancer, Вы писали:

D>Да прототип-то я из книжки взял,на этот поменял — не помогает.

D>У меня диалоговое приложение, в момент посылки сообщения окно, конечно же, активно. Месагу посылает рабочий поток, в котором производятся вычисления, когда нужно инициировать обновление экрана. Раньше у меня все было в одном месте — запускается поток, дальше в цикле while(::GetMessage(&message, NULL, 0, 0)) инициировалось обновление нужной области экрана и все было нормально. Потом я решил сделать специальный обработчик для своего сообщения, но не тут-то было!
D>Я просто фигею, дорогая редакция! Это же должно быть очень просто, и в книжке написано, но не работает!

Код в студию!


!0xDEAD
Re[6]: пользовательское сообщение
От: Dancer Россия  
Дата: 05.04.02 09:45
Оценка:
Здравствуйте Кирпа В.А., Вы писали:

КВ>Здравствуйте Dancer, Вы писали:


D>>Да прототип-то я из книжки взял,на этот поменял — не помогает.

D>>У меня диалоговое приложение, в момент посылки сообщения окно, конечно же, активно. Месагу посылает рабочий поток, в котором производятся вычисления, когда нужно инициировать обновление экрана. Раньше у меня все было в одном месте — запускается поток, дальше в цикле while(::GetMessage(&message, NULL, 0, 0)) инициировалось обновление нужной области экрана и все было нормально. Потом я решил сделать специальный обработчик для своего сообщения, но не тут-то было!
D>>Я просто фигею, дорогая редакция! Это же должно быть очень просто, и в книжке написано, но не работает!

КВ>Код в студию!


Код выслан на мыло. В принципе, в сообщение мне его тоже будет вставить нетрудно, но так понятнее, мне кажется.


КВ>
Re[6]: пользовательское сообщение
От: Dancer Россия  
Дата: 05.04.02 10:40
Оценка:
Здравствуйте Кирпа В.А., Вы писали:

КВ>Здравствуйте Dancer, Вы писали:


D>>Да прототип-то я из книжки взял,на этот поменял — не помогает.

D>>У меня диалоговое приложение, в момент посылки сообщения окно, конечно же, активно. Месагу посылает рабочий поток, в котором производятся вычисления, когда нужно инициировать обновление экрана. Раньше у меня все было в одном месте — запускается поток, дальше в цикле while(::GetMessage(&message, NULL, 0, 0)) инициировалось обновление нужной области экрана и все было нормально. Потом я решил сделать специальный обработчик для своего сообщения, но не тут-то было!
D>>Я просто фигею, дорогая редакция! Это же должно быть очень просто, и в книжке написано, но не работает!

КВ>Код в студию!



КВ>


Аааа!!! Колдун, шаман ! Заработало!
Спасибо!
Но как же я энтого не увидел сам ?!
Re[5]: пользовательское сообщение
От: Hux  
Дата: 10.09.03 15:39
Оценка:
А нельзя и мне объяснить, у меня такая же проблема?

Здравствуйте, Dancer, Вы писали:

D>Здравствуйте Кирпа В.А., Вы писали:


КВ>>Здравствуйте Dancer, Вы писали:


D>>>Здравствуйте Кирпа В.А., Вы писали:


КВ>>>>Здравствуйте Dancer, Вы писали:


D>>>>>Как добавить в программу обработчик к-л пользовательского сообщения? Я сделал так:

D>>>>>добавляю к классу диалога метод

D>>>>>
D>>>>>LONG CFractalDlg::OnThreadRedraw(UINT wParam, LONG lParam)
D>>>>>{    ...
D>>>>>     return 0;
D>>>>>}
D>>>>>


D>>>>>а Сlass Withard сам добавляет ее описание в h-файл диалога, но не туда, где остальные обработчики описаны, а просто как public, например.

D>>>>>Но когда я делаю PostMessage из другого потока, сообщение этой функцией не перехватывается, хотя основной процес сообщение получает, я проверял GetMessage.
D>>>>>В чем тут может быть дело?

КВ>>>>А в карту сообщений добавить все-равно надо


КВ>>>>ON_MESSAGE(WM_USER + ..., OnThreadRedraw)


D>>>А куда это добавлять надо?

D>>>Вставил в срр-файл диалога

D>>>
D>>>BEGIN_MESSAGE_MAP(CFractalDlg, CDialog)
D>>>    //{{AFX_MSG_MAP(CFractalDlg)
D>>>    ON_WM_SYSCOMMAND()
D>>>         ...................

D>>>    ON_MESSAGE(WM_USER+5, OnThreadRedraw)

D>>>    //}}AFX_MSG_MAP
D>>>END_MESSAGE_MAP()
D>>>


D>>>в h-файл вставил прототип:


D>>>
D>>>//{{AFX_MSG(CFractalDlg)
D>>>    virtual BOOL OnInitDialog();
D>>>        ...

D>>>        afx_msg LONG OnThreadRedraw(UINT wParam, LONG lParam);

D>>>//}}AFX_MSG
D>>>DECLARE_MESSAGE_MAP()
D>>>


D>>>Там же

D>>>
D>>>
D>>>#define WM_THREADREDRAW        WM_USER + 5
D>>>


D>>>Но однако работать не стало. Может, я еще чего забыл?

D>>>

КВ>>А почему ты посылаешь диалогу этот мессаг? У тебя что диалоговое приложение? Что в этот момент активнно окно диалога?

КВ>>и второе
КВ>>вообще-то прототип ф-ции такой

КВ>>afx_msg LRESULT OnThreadRedraw(WPARAM wParam, LPARAM lParam);



D>Да прототип-то я из книжки взял,на этот поменял — не помогает.

D>У меня диалоговое приложение, в момент посылки сообщения окно, конечно же, активно. Месагу посылает рабочий поток, в котором производятся вычисления, когда нужно инициировать обновление экрана. Раньше у меня все было в одном месте — запускается поток, дальше в цикле while(::GetMessage(&message, NULL, 0, 0)) инициировалось обновление нужной области экрана и все было нормально. Потом я решил сделать специальный обработчик для своего сообщения, но не тут-то было!
D>Я просто фигею, дорогая редакция! Это же должно быть очень просто, и в книжке написано, но не работает!
Re[5]: пользовательское сообщение
От: dandy  
Дата: 11.09.03 04:08
Оценка: 3 (1)
Здравствуйте, Dancer, Вы писали:

D>>>>>Как добавить в программу обработчик к-л пользовательского сообщения? Я сделал так:

d>
1.
В *.h — файл НУЖНО добавить МЕЖДУ
//}}AFX_MSG
И
DECLARE_MESSAGE_MAP()
обьявление функции, которая будет вызываться при получении сообщения
прототип:
afx_msg void OnSomethingMessage(...);
можно и без параметров.

2.
Написать ее определение в *.cpp

3.

В *.cpp вставить макрос ON_THREAD_MESSAGE(...) между
//}}AFX_MSG_MAP

и
END_MESSAGE_MAP()

4.

Вместо WM_USER нужно использовать WM_APP

5.
Кажется, ничего не забыл.

С уважением, Андрей.
Re[6]: пользовательское сообщение
От: Hux  
Дата: 11.09.03 06:28
Оценка:
БОЛЬШОЕ ПРОГРАМИСТСКОЕ СПАСИБО!

Здравствуйте, dandy, Вы писали:

D>Здравствуйте, Dancer, Вы писали:


D>>>>>>Как добавить в программу обработчик к-л пользовательского сообщения? Я сделал так:

d>>
D>1.
D>В *.h — файл НУЖНО добавить МЕЖДУ
D> //}}AFX_MSG
D>И
D>DECLARE_MESSAGE_MAP()
D>обьявление функции, которая будет вызываться при получении сообщения
D>прототип:
D> afx_msg void OnSomethingMessage(...);
D>можно и без параметров.

D>2.

D>Написать ее определение в *.cpp

D>3.


D>В *.cpp вставить макрос ON_THREAD_MESSAGE(...) между

D>//}}AFX_MSG_MAP

D>и

D>END_MESSAGE_MAP()

D>4.


D>Вместо WM_USER нужно использовать WM_APP


D>5.

D>Кажется, ничего не забыл.

D>С уважением, Андрей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.