Bitmap nach und nach zeichnen lassen



  • Hi, habe ein Problem.
    Ich habe eine Anwendung, die mir eine Wave-Datei als Bitmap zeichnet. Das dauert aber ziehmlich lange ( bei großen Dateien ). Jetzt möchte ich das so machen, daß die Bitmap nach und nach aufgebaut wird. Ich habe bloß keinen Plan, wie ich da rangehen soll.
    Hier die Funktion zum zeichnen:

    void DSoundUtils::DrawWavFile(CString filename, CDC *dc, CRect rect, int channel)
    	{
    		CWaveFile wavefile;
    		wavefile.OpenToRead(filename);
    
    		BYTE *pData = new BYTE[wavefile.GetSize()];
    		wavefile.Read(pData,wavefile.GetSize(),0,0);
    
    		int x = rect.left; // x-Position
    		int y = rect.top + (rect.bottom-rect.top)/2; // y-Position
    		short int value16, max16=0x7FFF; // für 16 Bit Samples
    		unsigned char value8, max8=0x7F; // für  8 Bit Samples
    		DWORD i=channel * wavefile.GetFormat()->wBitsPerSample/8;	
    
    		dc->MoveTo(x++, y);
    
    		DWORD nRecords = wavefile.GetSize()/wavefile.GetFormat()->nBlockAlign;
    		for (DWORD xd=0;xd<nRecords; xd++) {
    
    			//y berechnen
    			if ((int)wavefile.GetFormat()->wBitsPerSample == 16) {
    				y = rect.top + rect.Height()/2;
    				value16 = *((short int*)(pData + i));
    				y -= (int) ((float)value16/max16 * rect.Height()/2);
    			}
    			else
    			{
    				y = rect.bottom;
    				value8 = *((unsigned char*)(pData + i));
    				y -= (int) ((float)value8/max8 * rect.Height()/2);
    			}
    			i += wavefile.GetFormat()->nBlockAlign;
    
    			//x berechnen
    			x=int(rect.left + (float)xd/nRecords*rect.Width());
    
    			dc->LineTo(x,y);
    		}
    
    		wavefile.Close();
    		delete pData;
    	}
    

    Das ganze wird dann an OnPaint übergeben und dann dargestellt. Vorher wird dann noch ein Puffer für die Bitmap erzeugt. Also ich müßte ja irgendwie die Schleife aus der Zeichenfunktion mit einbeziehen. Ich habe es mal versucht, aber ich komme irgendwie nicht so richtig hin.

    Kann mir jemand einen Tip geben?

    Gruß



  • File Teilweise einlesen und anzeigen -> Backbuffering für schon gezeichnete Grafik, das neue in den Backbuffer schreiben und anzeigen.



  • Andere Frage: Tut das wirklich not, jedes mal das File zu laden, Speicher zu allokieren umzurechenn u.s.w.?
    Ich würde das in mehrere Routinen zerlegen, damit die Zeichenfunktion auch wirklich nur noch zeichnet. Btw: Zeichnset du wirklich alles? Ich denke mal, wenn das Wavefile so riesig ist, beschränke den Zeichenbereich auf das , was letztendlich auch wirklich auf dem Bildschirm sichtbar sein wird.



  • Ja also je nach Größe der Wav-Datei ist es halt riesig oder auch nicht so riesig. Ich zeichne alles. Es soll ja erstmal nur die Wav-Datei im Ganzen anzeigen. Ist halt eben nur nervig auf die komplette Zeichnung zu warten.

    Ich werde das mal so testen.

    Danke schonmal.

    Gruß


Anmelden zum Antworten