Bitmaps & SpeicherDCs



  • Hallöle

    habe ein kleines Problem.
    Ich schreibe an einem Debugger für ein parallelisiertes FPGA-System und bin hierfür auf MFC festgesetzt. Mit QT habe ich schon einiges realisiert, leider bekomme ich die Bitmapverwaltung mit MFC nicht hin.

    Es geht darum in einer Unterklasse Bitmapstreifen (ca 12px hoch, 3000-8000px breit) zu erstellen. Das Erstellen klappt, die Streifen sind da. Dann lasse ich ein SpeicherDC (Compatible zum pDC) darauf laufen und will Linien malen & den Hintergrund ändern.

    Leider tut's das aber nicht, ich habe also im Hauptfenster (nur die Bitmap selber wird übergeben) nur schwarze Kästen. Da das System mit 8 FPGAKarten mit je 72 Kanälen arbeitet, kann ich keinesfalls die Graphen erst zur Laufzeit in der OnDraw(..) malen, das wird zu langsam.

    Mir scheint es so, als ob das SpeicherDC nicht in die Bitmap malt, sondern nur eine Art Overlay darstellt. Wir suchen und probieren jetzt seid Stunden, mit QT war das irgendwie ganz einfach...

    Nach einem "SpeicherInDieBitmap"-Befehl hab ich gesucht aber leider nichts gefunden, Tutorials beschäftigen sich meist nur damit Bitmaps zu laden und einzubinden, aber nicht wie man auf einem SpeicherDC eine Bitmap kreiert, diese im Speicher belässt und später nur noch mit Bitblt auf den Bildschirm kopiert.

    Wär schön wenn wer die Antwort wüsste.



  • Schau dir mal die beiden Beiträge an, das sollte dir weiterhelfen:

    http://www.codeproject.com/bitmap/drawing_without_flicker.asp
    http://www.codeproject.com/bitmap/membm.asp

    Gruß Matthias



  • Hmm Hilft mir irgendwie nicht wirklich weiter

    Hier was gerade da ist:

    --> Im Datenblock

    int Datenblock::makeBitmap(int faktor, CDC* pDC){	//baue Bitmap auf
    
    		Bitmap = new CBitmap();
    
    		CDC CMemDC;
    
    		CMemDC.CreateCompatibleDC(pDC);
    
    		int tmp = Bitmap -> CreateCompatibleBitmap(pDC,SPEICHERSTELLEN*faktor*10,12);
    
    		TRACE("PANIC, %i", tmp);
    
    		Bitmap -> SetBitmapDimension(SPEICHERSTELLEN*faktor*10,12);
    
    		HBITMAP pOldBitmapImage = (HBITMAP)CMemDC.SelectObject(&Bitmap);
    
    		CSize sz = Bitmap -> GetBitmapDimension();
    
    		TRACE("Bitmap Size: %i, %i\n",sz.cx,sz.cy);
    
    		CMemDC.FillSolidRect(0,0,SPEICHERSTELLEN*faktor*10,10,BgColor);
    
    		CMemDC.SetBkMode(OPAQUE);
    
    		CMemDC.SetBkColor(BgColor);
    
    		CPen *pCOrgPen;
    
    		CPen CRedPen(PS_SOLID,2,RGB(255,255,255));
    
            CPen CBluePen(PS_DASHDOT,1,RGB(0,0,255));
    
            // Grafikcursor auf Ausgangsposition setzen
    
            CMemDC.MoveTo(5,5);
    
            // Roten Stift fuer erste Linie auswaehlen
    
            pCOrgPen = CMemDC.SelectObject(&CRedPen);
    
            // Erste Linie zeichnen
    
            CMemDC.LineTo(100,5);
    
    		CMemDC.SelectObject(pOldBitmapImage);
    
    	return 1;
    
    	}
    

    Das ist der Aufruf in der OnDraw

    if(Fertig){
    
    		int i = 0;
    
    		std::list<Datenblock*> daten = comb->getList();
    
    		TRACE("Objekte in der Liste %i\n",daten.size());
    
    		for (std::list<Datenblock*>::iterator iter = daten.begin(); iter != daten.end(); iter++){
    
    			CBitmap * bm = (*iter)->getBitmap();
    
    			CDC CMemDC;
    
    			CMemDC.CreateCompatibleDC(pDC);
    
    			CMemDC.SelectObject(bm);
    
    			CRect rcClient;
    
    			GetClientRect(rcClient);
    
    			//CMemDC.FillSolidRect(0,0,640,10+10*i+i,RGB(255, 239, 93));
    
    			pDC->BitBlt(0,12*i+i,rcClient.Width(),12+12*i+i,&CMemDC,0,0,SRCCOPY);
    
    			i++;
    
    			TRACE("Male %i\n",i);
    
    			}
    
    		}
    
    	TRACE("Fenster wird neu gezeichnet!\n");
    

    Das einzige was ich bekomme sind Schwarze Balken. Was mich wundert ist auch, dass das CreateCompatibleBitmap laut der GetBitmapDimension eine 0x0 Bitmap erzeugt. Mit dem SetBitmapDimension lässt sich zumindest das verändern.

    DIB's bringen mir recht wenig, da auch überall steht das die langsam sind, was ich bräuchte sind DDB im Speicher 😕



  • .. doppelt wegen Netlag


Anmelden zum Antworten