Форум программистов, компьютерный форум CyberForum.ru

функция SetTimer и обработка события таймера - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
nicchar
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 6
19.09.2013, 01:02     функция SetTimer и обработка события таймера #1
Пишу программу в winapi.
В какую часть программы я должен вставить функцию SetTimer?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
19.09.2013, 08:36
  #2

Не по теме:

На такие вопросы так и хочется ответить куда её нужно вставить, но форум, увы, не позволяет..

Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
19.09.2013, 08:49     функция SetTimer и обработка события таймера #3
можно в WM_CREATE
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
19.09.2013, 09:09     функция SetTimer и обработка события таймера #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
LRESULT CALLBACK WindowProc(                       // обработчик окна
                            HWND win_handle,       // "хендлер" окна
                            unsigned msg,          //  код события
                            UINT wparam,           //  параметры события  
                            LONG lparam )  
{
 
    HWND hwnd;
    HDC hdc;
    Timer1=SetTimer(win_handle, //хендлер окна, которому таймер будет посылать сообщения
                            1//идеентификатор таймера        
                            5, //период в мс
                            0); //функция обработчик 0 - нет обработчика или адрес функции
    switch( msg ) {
        case WM_TIMER: //обработчик событий таймера     
            // здесь можно например рисовать, задавая координаты точек с помощью переменной,
            // изменяющейся с каждым событием таймера
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
19.09.2013, 09:17     функция SetTimer и обработка события таймера #5
Каждый раз при обработке сообщений окна устанавливать таймер? Оригинально-глупый способ..
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
19.09.2013, 10:22     функция SetTimer и обработка события таймера #6
Можно и в WinMain вставить. Я просто показал простой пример.
ТС не спрашивал куда вставлять SetTimer() "банально-умным" способом.
nicchar
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 6
19.09.2013, 11:27  [ТС]     функция SetTimer и обработка события таймера #7
Таким образом не хочет работать. Никак не могу его запустить. Что неправильно?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static int cxClient, cyClient;
    int counter = 10;
    bool green = true;
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    HBRUSH hBrush;
    LOGFONT lf;
    HFONT hFont;
    SetTimer(hWnd, 1, 1000, NULL);
    
    switch (message)
    {
        case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        
        switch (wmId)
        {
            case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
 
            case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
 
            default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
            break;
 
            case WM_TIMER:
            counter--;
            SendMessage(hWnd, WM_PAINT, 0, 0);
            break;
 
            case WM_SIZE:
            cxClient = LOWORD(lParam);
            cyClient = HIWORD(lParam);
            break;
 
            case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
                        ...
            hFont = CreateFontIndirect(&lf);
            SelectObject(hdc, hFont);
                        ...
            if(green && counter >= 0)
            {
                SetTextColor(hdc, RGB(0,255,0));
                char time[3];
                itoa(counter, time, 10);
                wchar_t wtext[3];
                mbstowcs(wtext, time, strlen(time)+1);
                TextOut(hdc, 260, 80, wtext, 2);
            }
 
                        ...             
            hBrush = CreateSolidBrush(RGB(255,0,0));
            SelectObject(hdc, hBrush);
            Ellipse(hdc, cyClient/5, cyClient/5, cyClient/5+80, cyClient/5+80); 
            hBrush = CreateSolidBrush(RGB(255,255,255));
            SelectObject(hdc, hBrush);
            Ellipse(hdc, cyClient/5, cyClient/5+90, cyClient/5+80, cyClient/5+170);
            Ellipse(hdc, cyClient/5, cyClient/5+180, cyClient/5+80, cyClient/5+260);
            hBrush = CreateSolidBrush(RGB(80,255,0));
            SelectObject(hdc, hBrush);
            Ellipse(hdc, 3*cyClient/5, cyClient/5+90, 3*cyClient/5+80, cyClient/5+170);
            hBrush = CreateSolidBrush(RGB(255,255,255));
            SelectObject(hdc, hBrush);
            Ellipse(hdc, 3*cyClient/5, cyClient/5+180, 3*cyClient/5+80, cyClient/5+260);
            
 
            hBrush = CreateSolidBrush(RGB(255,0,0));
            SelectObject(hdc, hBrush);
            Ellipse(hdc, cyClient/5, cyClient/5, cyClient/5+80, cyClient/5+80); 
 
 
            EndPaint(hWnd, &ps);
            break;
 
            case WM_DESTROY:
            PostQuitMessage(0);
            break;
 
            default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
19.09.2013, 11:43     функция SetTimer и обработка события таймера #8
перем case WM_TIMER:
ты уже закрыл блок switch
C++
1
2
3
4
5
6
default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }   // switch
            break;
 
            case WM_TIMER:
а этот случай должен быть в блоке switch
nicchar
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 6
19.09.2013, 11:53  [ТС]     функция SetTimer и обработка события таймера #9
Я закрыл внутренний switch для case WM_COMMAND:, а WM_TIMER находится в общем блоке switch (message)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2013, 13:11     функция SetTimer и обработка события таймера
Еще ссылки по теме:

C++ Пакман на Си. Реализация таймера
C++ Эмулятор SetTimer
C++ Обработка события внешней программы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
19.09.2013, 13:11     функция SetTimer и обработка события таймера #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static int cxClient, cyClient;
    static int counter = 10;  // важно объявить эту переменную static или глобальной!!!
    bool green = true;
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    HBRUSH hBrush;
    LOGFONT lf;
    HFONT hFont;
    SetTimer(hWnd, 1, 1000, NULL);
    
    switch (message)
    {
        case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        
        switch (wmId)
        {
            case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
 
            case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
 
            default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
            break;
 
            case WM_TIMER:
            {
            counter--;
            SendMessage(hWnd, WM_PAINT, 0, 0);
            hFont = CreateFontIndirect(&lf);
            hdc=GetDC(hWnd);
            SelectObject(hdc, hFont);
                      //  ...
            if(green && counter >= 0)
            {
                SetTextColor(hdc, RGB(0,255,0));
                char time[3];
                itoa(counter, time, 10);
                wchar_t wtext[3];
                mbstowcs(wtext, time, strlen(time)+1);
                TextOut(hdc, 260, 80, wtext, 2);
            }
 
                      //  ...             
            hBrush = CreateSolidBrush(RGB(255,0,0));
            SelectObject(hdc, hBrush);
            Ellipse(hdc, cyClient/5, cyClient/5, cyClient/5+80, cyClient/5+80); 
            hBrush = CreateSolidBrush(RGB(255,255,255));
            SelectObject(hdc, hBrush);
            Ellipse(hdc, cyClient/5, cyClient/5+90, cyClient/5+80, cyClient/5+170);
            Ellipse(hdc, cyClient/5, cyClient/5+180, cyClient/5+80, cyClient/5+260);
            hBrush = CreateSolidBrush(RGB(80,255,0));
            SelectObject(hdc, hBrush);
            Ellipse(hdc, 3*cyClient/5, cyClient/5+90, 3*cyClient/5+80, cyClient/5+170);
            hBrush = CreateSolidBrush(RGB(255,255,255));
            SelectObject(hdc, hBrush);
            Ellipse(hdc, 3*cyClient/5, cyClient/5+180, 3*cyClient/5+80, cyClient/5+260);
            
 
            hBrush = CreateSolidBrush(RGB(255,0,0));
            SelectObject(hdc, hBrush);
            Ellipse(hdc, cyClient/5, cyClient/5, cyClient/5+80, cyClient/5+80); 
 
            ReleaseDC(hWnd,hdc);
            break;
 
            case WM_SIZE:
            cxClient = LOWORD(lParam);
            cyClient = HIWORD(lParam);
            break;
                }
 
            // 
 
            case WM_DESTROY:
            PostQuitMessage(0);
            KillTimer(hWnd,1);
            break;
 
            default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
Yandex
Объявления
19.09.2013, 13:11     функция SetTimer и обработка события таймера
Ответ Создать тему
Опции темы

Текущее время: 20:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru