Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не приходит сообщение от таймера

321
14 апреля 2003 года
Doomych
124 / / 20.01.2000
Почему не приходит сообщение WM_TIMER (MessageBeep() не пищит)?

LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static PAINTSTRUCT ps = {NULL};
static HDC hDC = NULL;
static UINT nAutoChangeTimer = 0; // таймер для автосмены цветов эффекта B (ф-ция Paint())


switch ( message )
{
case WM_CREATE:
...........
nAutoChangeTimer = SetTimer(hWnd, 1, 1000, NULL);
break;

case WM_DESTROY:
...........
PostQuitMessage(0);
break;

case WM_TIMER:
MessageBeep(-1); // не пищит!
break;

case WM_ERASEBKGND:
break;

case WM_PAINT:
if( fChildPreview ) // для окошка предварительного просмотра
{
if ( bIsPrevScreenRun == false ) // т.е. если данного потока еще нет
{
hPaintThread = CreateThread(NULL, 0, Paint, BeginPaint(hWnd, &ps), 0, &lPaintThreadID);
bIsPrevScreenRun = true; // поток создан
}
}
else // для вывода на весь экран
{
if ( bIsFullScreenRun == false ) // т.е. если данного потока еще нет
{
hPaintThread = CreateThread(NULL, 0, Paint, GetDC(hWnd), 0, &lPaintThreadID);
bIsFullScreenRun = true; // поток создан
}
}
EndPaint(hWnd, &ps);
break;

default:
return DefScreenSaverProc(hWnd, message, wParam, lParam);
}
return true;
}

Спасибо за помощь!
484
14 апреля 2003 года
dimus
26 / / 20.05.2000
nAutoChangeTimer = SetTimer(hWnd, 1, 1000, NULL);


если nAutoChangeTimer равен 0, то таймер не проинициализировался.

Как-то ты коряво SetTimer вызвал. По-моему, прога просто не поняла, что ты от неё хочешь.

Для MFC таймер вызывается так:

nAutoChangeTimer = SetTimer(1, 1000, NULL);,

а для API так:

#define TimerID 1

UINT_PTR SetTimer(hWnd, TimerID, 1000, NULL)

реакция на таймер будет такая:
......
case WM_TIMER:

switch (wParam)
{
case TimerID:
// Process the timer.

return 0;
}
..............
302
15 апреля 2003 года
Sagittarius
648 / / 12.04.2003
Цитата:
Originally posted by Doomych
Почему не приходит сообщение WM_TIMER (MessageBeep() не пищит)?


Попробуй вынести обработку сообщений от таймера в отдельную функцию (прототип, насколько я помню, DWORD CALLBACK TimerFunc(UINT TimerID)). И передай в четвёртом параметре SetTimer адрес этой функции.

321
15 апреля 2003 года
Doomych
124 / / 20.01.2000
Цитата:
To dimus


nAutoChangeTimer не равен 0
Кроме того, проблема не в обработке сообщения от таймера, а в том, что не приходит само сообщение. Кстати, если сразу же после строки

Цитата:
nAutoChangeTimer = SetTimer(hWnd, 1, 1000, NULL);

добавить

Цитата:
MessageBox(-1)

, то все становится OK.

Цитата:
To Sagittarius


Попробую. Но ведь, по идее, должно работать и так.


Спасибо!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог