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

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

Войти
Регистрация
Восстановить пароль
 
Arderun
1 / 1 / 0
Регистрация: 12.09.2011
Сообщений: 17
#1

PW_PAINT: переполнение счетчика - C++

30.04.2012, 13:22. Просмотров 430. Ответов 1
Метки нет (Все метки)

Здраствуйте Я совсем новичек в WINAPI,буквально второй день как разбираюсь. Нужно срочно написать програмку где щелчком мыши можно вызвать таблицу на окне и задать координаты и масу для спутника который будет вращатся на орбите. пока пытался прописать просто вращение шара по кругу и вызов диалогового окна.
появилось две проблемы:

1. По прошествию небольшего времени WM_PAINT перестает обновлятся(толи изза таймера толи еще что)
2. диалог вызываемый DialogBox каждый раз обновляется по тикам таймера как все основное окно.

если кто сталкивался с первой и видит что я напортачил во второй буду очень признателен за помощь
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
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 
switch (message)
{
    case WM_LBUTTONDOWN:
            {           
            // окно  с низу почемуто постоянно обновляется =(
            DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOGBAR), hWnd,DialogBarDlgProc);  
            break;
            }
        
    case WM_CREATE:
        {
             SetTimer(hWnd, 1, 10, NULL);
        }
         
    case    WM_TIMER:
        {
           InvalidateRect(hWnd, NULL, FALSE);
        break;
        }
    case WM_PAINT:  
        {   
             HDC hdc;
                         hdc = GetDC(hWnd);
            
           SelectObject(hdc, hPen1);  
            SelectObject(hdc,EarthBrush);
            Ellipse( hdc, EarthХ-EarthR,EarthY-EarthR,EarthХ+EarthR,EarthY+EarthR); // EarthХ=500,EarthY =400, EarthR=35 земля с центром в EarthХ=235 EarthY =225 радиус EarthR=35  
        
            SelectObject(hdc,SatelliteBrush);
            Ellipse( hdc,  
            (int)SatX-SatR,  
            (int)SatY-SatR,  
            (int)SatX+SatR,  
            (int)SatY+SatR);
 
            Sleep(50);
            
            SelectObject(hdc,ClearBrush);
            Ellipse( hdc,  
            (int)SatX-SatR,  
            (int)SatY-SatR,  
            (int)SatX+SatR,  
            (int)SatY+SatR);
 
             OrbitAngle=( OrbitAngle+STEP*PI/180); 
             if(AngleCut>359/STEP){   //условие для сбрасывания угла по прохождению полного круга.
                 OrbitAngle=0;
                 AngleCut=0;}
             else AngleCut++;
            SatX=EarthХ + SatOrbit*cos(OrbitAngle);
            SatY=EarthY+ SatOrbit*sin(OrbitAngle);
 
 
            ReleaseDC(hWnd, hdc);
            return DefWindowProc(hWnd,message,wParam,lParam);
        
            break; 
            }
    case WM_DESTROY:   
            PostQuitMessage(0);
            break;
    //default:
            //return DefWindowProc(hWnd, message, wParam, lParam);
            //break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
 
}
весь код во вложении
Вложения
Тип файла: rar Orbits.rar (22.9 Кб, 13 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2012, 13:22     PW_PAINT: переполнение счетчика
Посмотрите здесь:

Подсчет счетчика - C++
Не подскажите почему счетчик не работает. Не выдает не каких результатов. int razdelTime(int t){ int n = t,a = 0; ...

Организация счетчика - C++
Доброго вечера, форумчане) вопрос начинающего программиста, как организовать счетчик при помощи побитовых операций? Т.е., как я понимаю...

Обнуление счетчика, сортировка - C++
Покажите пример , как можно вывести кол-во перестановок, которые были использованные при сортировке массива (любой можно). Там сделать ...

Вывод значения счетчика на определенной итерации - C++
Здравствуйте, Помогите чем сможете. Вот программка для помесячной капитализации депозита в банк. Все вроде работает. Но вот нужно что бы,...

Цифровой счетчик, добавить шаг счетчика - C++
Цифровой счетчик – это целочисленная переменная с ограниченным диапазоном значений, которая сбрасывается при достижении максимального...

Переполнение - C++
При вводе слишком большого числа (например: 4444444444444444) программа зацикливается и постоянно выводит "Ошибка. Введенный элемент...

Переполнение - C++
Доброго времени суток! Есть код: void menu() { IndexList Universal; List *tmp = NULL; int punkt_menu; char *value =...

Задача на переполнение - C++
Вот такая задачка: Дано число в двоичном виде состоящее из 1млн (короче из огромного количества) символов, нужно это число перевести в...

Переполнение массива - C++
Добрый день господа. :) Столкнулся с очередной проблемой и не знаю как решить. Где то в этой программе происходит переполнение...

Переполнение стека - C++
Добрый вечер! Я пытался решить следующую задачку: Петя и Вася часто играют в различные логические игры. Недавно Петя поведал Васе о...

Переполнение стека - C++
Всем добрый вечер. Я создаю вектор, который имеет большой размер: порядка 256000000. Этот вектор имеет тип float, т.к. функция, куда я...

Переполнение include - C++
Здравствуйте! Такой вопрос есть класс Program и класс Universe, в классе Program я подключаю(#include) Universe.cpp, а в классе Universe...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
30.04.2012, 13:51     PW_PAINT: переполнение счетчика #2
Не знаю в чем конкретно там у вас косяк, расскажу что я считаю неверным.
Сперва термины:
состояние - это координаты объекта, его положение и т.п.
Так вот у вас состояние изменяется при обработки сообщения о перерисовки. Это неверно.
Состояние должно менятся с течением времени, т.е. при событии от таймера. После смены в обработке этого же собития нужно инициировать перерисовку этого состояния. Обработка WM_PAINТ должна заключатся только в отрисовке текущего состояния.
А у вас еще там Sleep на 50 милисекунд вставлен. В течении этого времени основной поток засыпает и вообще не может ничего делать. В добавок к этому сообщения от таймера идут в частотой в 10 милисекунд, что в 5 раз меньше чем время засыпания. Деталей обработки сообщений я не знаю, но если вдруг просле пробуждени потока система понимает, что она за это время должна была сгенерить пять сообщений от таймера, она может захотеть послать все пять штук подряд. А каждое из них в свою очередь провоцирует событые WM_PAINT в котором поток опять засыпает. Что там при этом с очередью сообщений будет я тоже не знаю. Может новые сообщения просто не добавляются в очередь, может еще как-то.
Короче попробуйте такую схемку:

C++
1
2
3
4
5
6
7
8
case WM_TIMER:
  ChangeState();
  InvalidateRect(); // перерисовка случится при первой же возможности
  break;
 
case WM_PAINT:
  JustRedrawCurrentState(); // Без всяких Sleep, без изменения состояния и т.п.
  break;
Yandex
Объявления
30.04.2012, 13:51     PW_PAINT: переполнение счетчика
Ответ Создать тему
Опции темы

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