Naja wie gesagt, dass ganze sollte ausgelagert werden. Dein Programm erzeugt ja einen Hauptthread, also dein Hauptprogramm. Dieser kann Daten nur sequentiell abarbeiten. Also wird er entweder auf das Ausgabegerät Zeichnen ( also Bitmap auf Gerätekontext) oder die Daten in deine Bitmap zeichnen. Aber er wird nie beides machen.
Deshalb werden solche Sachen immer in separate Threads ausgelagert. Die Teilen sich in C einen Zeiger auf die Daten, der Worker-Thread ( der die Daten verarbeitet und deine Bitmap aktualisiert), muss dem Thread der grafischen Oberfläche ( GUI ) signalisieren, dass neue Daten da sind und die Bitmap fertig ist. Letzteres ist nötig, damit nicht beide auf die Daten zugreifen und es zu keiner Speicherzugriffsverletzung kommt (Stichwort Mutex oder Semaphore).
Dann brauchst du sozusagen nur das "Ich habe fertig"-Flag beim Eintreffen der WM_PAINT-Message abfragen und die Bitmap nur dann neuzeichnen. Ein weiterer aber aufwendigerer Weg ist nur die Punkte deiner Bitmap zu aktualisieren, die sich auch wirklich geändert haben.
Lesezeichen