Не приходит сообщение от таймера
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;
}
Спасибо за помощь!
если 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;
}
..............
Цитата:
Originally posted by Doomych
Почему не приходит сообщение WM_TIMER (MessageBeep() не пищит)?
Почему не приходит сообщение WM_TIMER (MessageBeep() не пищит)?
Попробуй вынести обработку сообщений от таймера в отдельную функцию (прототип, насколько я помню, DWORD CALLBACK TimerFunc(UINT TimerID)). И передай в четвёртом параметре SetTimer адрес этой функции.
Цитата:
To dimus
nAutoChangeTimer не равен 0
Кроме того, проблема не в обработке сообщения от таймера, а в том, что не приходит само сообщение. Кстати, если сразу же после строки
Цитата:
nAutoChangeTimer = SetTimer(hWnd, 1, 1000, NULL);
добавить
Цитата:
MessageBox(-1)
, то все становится OK.
Цитата:
To Sagittarius
Попробую. Но ведь, по идее, должно работать и так.
Спасибо!