FillRect verschwindet nach einiger Zeit [geschlossen]C++

Programme in C++. Entwicklerforum
Anonymous
 FillRect verschwindet nach einiger Zeit [geschlossen]

Post by Anonymous »

Gliederung
Ich versuche, einen Wellenform-Visualizer mit FillRect zu erstellen, aber nach einiger Zeit verschwinden die Rechtecke.
Ich bin mir nicht sicher, ob das zusammenhängt, aber nachdem sie verschwunden sind, stoße ich auch auf ein paar visuelle Störungen, wie z. src="https://i.sstatic.net/BH3Pc7az.png" />
Code
Dazu habe ich drei Funktionen, die jeweils im WM_CREATE-Aufruf mit SetTimer aufgerufen werden:

Code: Select all

SetTimer(window, ID, 1, (TIMERPROC) FUNCTION);

Code: Select all

LOOP

Code: Select all

PROCESS

Code: Select all

PAINT

Code: Select all

PAINT
führt diesen Code aus;

Code: Select all

RECT* r = new RECT {x, 0, 500, 500};
InvalidateRect(hwnd, r, TRUE);

Code: Select all

PROCESS
führt diesen Code aus;

Code: Select all

// data_buffer is queue data_buffer
if (data_buffer.size() < 100){
data_buffer.push(data); // data is queue data
}
and LOOP führt diesen Code aus;

Code: Select all

// 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();
}
Dann zeichne ich mit WM_PAINT auf die Anzeige:

Code: Select all

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;
}
Theorie
Ich denke, mein Code zeichnet möglicherweise mehrmals über sich selbst und erreicht die Objektgrenze für GDI, oder ich zeichne/ungültig mache zu häufig, und irgendetwas löst den Code aus, um das Löschen der Rechtecke zu erzwingen.
Erprobt und getestet
  • Ich habe versucht, jedes zu ändern Rückrufzeit des Timers – die Rechtecke scheinen nicht zu verschwinden, wenn ich sie auf etwa eine Sekunde ändere, obwohl es immer noch visuelle Störungen gibt und ich nicht sicher bin, ob sie später verschwinden – Idealerweise hätte ich gerne einen kürzeren Zeitraum als eine Sekunde.
  • Ich habe versucht, UpdateWindow(hwnd) zu verwenden, um das Zeichnen zu erzwingen, aber es scheint nichts zu ändern.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post