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

Код
Для этого у меня есть 3 функции, каждая из которых вызывается в вызове WM_CREATE с использованием SetTimer:
Код: Выделить всё
SetTimer(window, ID, 1, (TIMERPROC) FUNCTION);Код: Выделить всё
LOOPКод: Выделить всё
PROCESSКод: Выделить всё
PAINTКод: Выделить всё
PAINTКод: Выделить всё
RECT* r = new RECT {x, 0, 500, 500};
InvalidateRect(hwnd, r, TRUE);
Код: Выделить всё
PROCESSКод: Выделить всё
// data_buffer is queue data_buffer
if (data_buffer.size() < 100){
data_buffer.push(data); // data is queue data
}
Код: Выделить всё
// if we have at least 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();
}
Код: Выделить всё
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
Мобильная версия