С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
nicchar
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 6
#1

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

19.09.2013, 01:02. Просмотров 1447. Ответов 9
Метки нет (Все метки)

Пишу программу в winapi.
В какую часть программы я должен вставить функцию SetTimer?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2013, 01:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос функция SetTimer и обработка события таймера (C++):

Тетрис - Реализация таймера и обработка событий с клавиатуры - C++
Пишу консольный тетрис. Столкнулся с проблемой таймера и перехвата событий с клавиатуры. Раньше с такими вопросами не сталкивался, поэтому...

События и их обработка - C++
Подскажите как можно реализовать обработку событий, чтобы можно было использовать примерно такой код: void test_handler(object*...

Обработка события внешней программы - C++
Привет всем, Пытаюсь написать плагин на C++ для приложения KD. Данное приложение взаимодействует с библиотекой написанной на VB6, или...

Обработка события нажатия клавиши мыши в консоли - C++
Здравствуйте господа програмисты!!!Может кто нибудь написать элементарный исходник в консольном приложении когда нажимается левая кнопка он...

Эмулятор SetTimer - C++
Ребята, подскажите, как написать функцию на подобие SetTimer. Дело в том, что используя std::thread, не дожидаясь завершение потока,...

Обработка файлов. Функция seekg(); - C++
ifstream fileReader("sdf.txt"); int a; while (fileReader >> a) { ...; } А теперь, чтобы повторить данный while нужно написать ...

9
castaway
19.09.2013, 08:36
  #2

Не по теме:

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

1
Игорь с++
437 / 460 / 16
Регистрация: 26.01.2011
Сообщений: 2,033
19.09.2013, 08:49 #3
можно в WM_CREATE
0
SummerRain
327 / 326 / 17
Регистрация: 16.12.2012
Сообщений: 544
19.09.2013, 09:09 #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: //обработчик событий таймера     
            // здесь можно например рисовать, задавая координаты точек с помощью переменной,
            // изменяющейся с каждым событием таймера
1
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
19.09.2013, 09:17 #5
Каждый раз при обработке сообщений окна устанавливать таймер? Оригинально-глупый способ..
1
SummerRain
327 / 326 / 17
Регистрация: 16.12.2012
Сообщений: 544
19.09.2013, 10:22 #6
Можно и в WinMain вставить. Я просто показал простой пример.
ТС не спрашивал куда вставлять SetTimer() "банально-умным" способом.
0
nicchar
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 6
19.09.2013, 11:27  [ТС] #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;
}
0
SummerRain
327 / 326 / 17
Регистрация: 16.12.2012
Сообщений: 544
19.09.2013, 11:43 #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
1
nicchar
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 6
19.09.2013, 11:53  [ТС] #9
Я закрыл внутренний switch для case WM_COMMAND:, а WM_TIMER находится в общем блоке switch (message)
0
SummerRain
327 / 326 / 17
Регистрация: 16.12.2012
Сообщений: 544
19.09.2013, 13:11 #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;
}
1
19.09.2013, 13:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2013, 13:11
Привет! Вот еще темы с ответами:

функция main обработка параметров командной строки - C++
Подскажите, пожалуйста, зачем могут использоваться параметры командной строки, пример какой-нибудь если можно, только не конкретный :) без...

Функция settimer - Assembler
Добавлено через 7 часов 48 минут Хочу вывести точку на экран пишет ошибку invoke requires prototype for procedure .586 .model...

Как работает функция SetTimer? - C++ WinAPI
SetTimer(1, 20, 0); Объясните пожалуйста, что делает эта строка? Если можно подробнее о каждом параметре. Знаю, что 2й параметр -...

SetTimer в конструкторе класса, функция-член которого параметр - C++ Builder
Приветствую. Как передать функцию TimerComplete() как 4-й параметр функции SetTimer? class TTimerEx { private: String msg; ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.