Я пытаюсь создать визуализатор формы волны с помощью FillRect, но через некоторое время прямоугольники исчезают. Я не уверен, связано ли это с этим, но я также столкнулся с несколькими визуальными сбоями после того, как они исчезли, например, кровотечение цвета и появление цифры 6 в одном из моих полей со списком.
Код
Для этого у меня есть 3 функции, каждая из которых вызывается в вызове WM_CREATE с использованием SetTimer (
Код: Выделить всё
SetTimer(window, ID, 1, (TIMERPROC) FUNCTION);); ЦИКЛКод: Выделить всё
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 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();
}
Код: Выделить всё
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
Мобильная версия