FillRect исчезает через некоторое времяC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 FillRect исчезает через некоторое время

Сообщение Anonymous »

Структура

Я пытаюсь создать визуализатор формы волны с помощью FillRect, но через некоторое время прямоугольники исчезают. Я не уверен, связано ли это с этим, но я также столкнулся с несколькими визуальными сбоями после того, как они исчезли, например, кровотечение цвета и появление цифры 6 в одном из моих полей со списком.
Код

Для этого у меня есть 3 функции, каждая из которых вызывается в вызове WM_CREATE с использованием SetTimer ( 

Код: Выделить всё

SetTimer(window, ID, 1, (TIMERPROC) FUNCTION);); ЦИКЛ
, ПРОЦЕСС, КРАСКА запускает этот код;

Код: Выделить всё

RECT* r = new RECT {x, 0, 500, 500};
InvalidateRect(hwnd, r, TRUE);
запускает этот код;

Код: Выделить всё

// data_buffer is queue data_buffer
if (data_buffer.size() < 100){
data_buffer.push(data); // data is queue data
}
and LOOP запускает этот код;

Код: Выделить всё

// if we have atleast 1 step entry
if (data_buffer.size() > 0){
// count the steps
int steps = data_buffer.front().size();

// if we have steps
if (steps > 0){

// add and delete item for each step
for (int i = 0; i < steps; i++){
// get first step data
int v = data_buffer.front().front();

if (v == 0) {
v = 1;
} else {
v = (int)((double)v / (2000000000.0) * 50);
}

// add a data point using the first step data
scroll.push_back(v);

// remove the leftmost data point
scroll.erase(scroll.begin());

// remove first step data
data_buffer.front().pop();
}
}

// delete first step entry
data_buffer.pop();
}
Затем с помощью WM_PAINT я рисую на дисплее;

Код: Выделить всё

case WM_PAINT: {
// paint
PAINTSTRUCT ps;
HDC hdc = BeginPaint(window, &ps);
//FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

// brush color
HBRUSH brush;

// draw rects
for (int i = 0; i < scroll.size(); i++){
if (i == 0){
brush = CreateSolidBrush(RGB(0, 255, 0));
} else {
brush = CreateSolidBrush(RGB(255, 0, 0));
}

RECT* r = new RECT {
x + (i * scroll_mult),
75 - scroll[i],
y + (i * scroll_mult),
75 + scroll[i]
};

FillRect(hdc,
r,
brush
);

delete r;
}

// finish
EndPaint(window, &ps); // end window paint
DeleteObject(brush); // delete brush object

return 0;
}
Теория
Я думаю, что мой код может прорисовываться несколько раз и достигать предела объектов для GDI, или я слишком часто рисую или делаю недействительными, и что-то «сбивает» код, заставляя прямоугольники удаляться.
Проверено

[*]Я пробовал изменить время обратного вызова каждого таймера - прямоугольники, кажется, не исчезают, если я изменяю его примерно на секунду, хотя все еще есть визуальные сбои, и я не уверен, исчезнут ли они позже - В идеале мне нужен более короткий период времени, чем секунда.

[*]Я пробовал использовать UpdateWindow(hwnd) для принудительной отрисовки, но, похоже, это ничего не меняет.



Подробнее здесь: https://stackoverflow.com/questions/798 ... -some-time
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»