Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > неработает WM_TIMER


Автор: yngwie19 13.5.2009, 11:41
Здравствуйте вот код:
Код

#include "stdafx.h"

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

#define ID_TIMER 1

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR,int)
{
    char *szClassName = "MainWindow";
    char *szTite = "Программа 4";
    MSG msg;
    WNDCLASSEX wc;

    wc.cbClsExtra = 0;
    wc.cbSize = sizeof(wc);
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
    wc.hInstance = hInstance;
    wc.lpfnWndProc = WndProc;
    wc.lpszClassName = szClassName;
    wc.lpszMenuName = NULL;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClassEx(&wc);

    HWND hwnd = CreateWindow(szClassName,szTite,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
    ShowWindow(hwnd,SW_NORMAL);

    UpdateWindow(hwnd);

    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
        
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{    
    static BOOL fFlipFlop = FALSE;
    HBRUSH hBrush;
    RECT rc;
    switch(msg)
    {
        case WM_CREATE:
            SetTimer(hwnd,ID_TIMER,1000,NULL);
            return 0;
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                    
                EndPaint(hwnd,&ps);
            }
        return 0;
        case WM_TIMER:
            MessageBeep(0);
            MessageBox(NULL,"","",MB_OK);
            return 0;
        case WM_DESTROY:
            KillTimer(hwnd,ID_TIMER);
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hwnd,msg,wParam,lParam);
}


Почему-то не получаю сообщения WM_TIMER. Посмотрите в чем дело?

Автор: Andrey44 13.5.2009, 12:31
Код

case WM_CREATE:
            SetTimer(hwnd,ID_TIMER,1000,NULL);
            return 0;

Сюда заходит?

Автор: yngwie19 13.5.2009, 13:17
Andrey44, Она почему-то в цикле висит

Автор: GremlinProg 13.5.2009, 13:21
Цитата(yngwie19 @  13.5.2009,  13:41 Найти цитируемый пост)

        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                EndPaint(hwnd,&ps);
            }

что это?

WM_PAINT приходит когда в очереди только этот WM_PAINT и находится, один одинешенек
если его не обрабатывать, то WM_PAINT будет приходить ВСЕГДА, не давая работать корректно остальным сообщениям

WM_TIMER напрямую зависит от трафика в очереди,
если в ней бесконечно крутится WM_PAINT, он и не придет никогда

EndPaint - это закрывающая скобка для BeginPaint,
они дополняют друг друга, раздельно их использовать бессмысленно

yngwie19, уже в который раз делаешь одну и ту же ошибку
минимум работы, которую требует WM_PAINT:
Код

BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);


Добавлено через 8 минут и 59 секунд
либо, если так не нравится BeginPaint:
Код

hrgn = ::CreateRectRgn(0,0,0,0);
::GetUpdateRgn(hwnd,hrgn,FALSE);
::ValidateRgn(hwnd,hrgn);
::DeleteObject(hrgn);

это отпустит очередь

Добавлено через 10 минут и 45 секунд
или так:
Код

GetUpdateRect(hwnd,&rc,FALSE);
ValidateRect(hwnd,&rc);

Автор: yngwie19 13.5.2009, 14:21
GremlinProg, Спасибо большое, прошу простить за то что ввел Вас в заблуждение. Я когда редактировал код, то случайно удалил строчку BeginPaint(hwnd,&ps);

Автор: GremlinProg 13.5.2009, 15:09
yngwie19, c BeginPaint не получать WM_TIMER просто невозможно
без него, да, а почему, думаю, объяснил

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)