MemDC ist nach Übergabe an andere Klasse leer



  • Hallo zusammen,

    ich möchte einen MemoryDeviceContext, den ich in der Ansichtsklasse erstellt habe, in einer anderen Klasse pixelweise ändern, danach zurückgeben und anzeigen lassen. Folgendes habe ich versucht:

    void CMonitoringView::OnDraw(CDC* pDC) 
    {
    	// TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
    	if(m_bInit)
    	{
    		m_pMemDC->CreateCompatibleDC(pDC);
    		m_bInit = false;
    	}
    	pDC->BitBlt(0,0,800,600,m_pMemDC, 0,0, SRCCOPY);
    }
    

    m_pMemDC ist vom Typ CDC* und liegt als globale Variable vor. Ebenfalls in der Ansichtklasse starte ich jetzt einen Thread und übergebe m_pMemDC an die Klasse Cam, m_cam ist eine Instanz dieser Klasse. p_this enthält einen Zeiger auf die Ansichtsklasse:

    DWORD WINAPI CMonitoringView::ThreadFunc(LPVOID data)
    {
    	//ThreadArgs* pArg = (ThreadArgs*)data;
    	CMonitoringView* p_this = (CMonitoringView*)data;
    
    	while(true)
    	{
    		p_this->m_pMemDC->Detach();
    		p_this->m_pMemDC = p_this->m_cam.start(p_this->m_pMemDC);
    	}
    	return(0);
    }
    

    In der Methode CDC* Cam::start(CDC* memDC) möchte ich memDC jetzt ändern und anschließend zurückgeben:

    CDC* CCam::start(CDC* pOrgMemDC){
    
       unsigned char *bytePtr = (unsigned char*)Fg_getImagePtr(fg,pic_nr,nCamPort);
       CBitmap* pCBitmap_dest = new CBitmap();
       pCBitmap_dest->CreateBitmap(m_nWidth,m_nHeight,1,32,NULL);
    
       pMemDC->CreateCompatibleDC(pOrgMemDC);
       pMemDC->SelectObject(pCBitmap_dest);
    
       unsigned char source;
       int x,y = 0;
       int gespart = 0;
       for(int i=0;i<m_nWidth*m_nHeight;i++)
       {
          source = bytePtr[i];
          int sum = source & 255;
          if(sum != backupPtr[i])
             pMemDC->SetPixel(x,y,RGB(r,g,b));
          if((i+1)%m_nWidth==0)
          {
             x=0;
             y++;
          }
          else
             x++;
       }
    
       delete pCBitmap_dest;
       return pMemDC;
    }
    

    backupPtr* enthält die einzelnen Werte des vorhergehenden memDC, sum die aktuellen. Stimmen sie nicht überein, soll die entsprechenden Pixel des vorhergehenden memDC (und nur diese) ersetzt werden. Diese Bedingungen arbeitet auch korrekt, das habe ich überprüft. Das Problem ist, dass anschließend die Pixel, die nicht explizit neu gesetzt werden, schwarz sind. Der an die Methode start() übergebene memDC ist leer.
    Für Hinweise und Tipps, wo die Ursache liegen könnte, wäre ich euch sehr dankbar 🙂



  • Wenn m_pMemDC eine globale Variable ist, solltest du sie entsprechend mit dem Präfix "g_" kennzeichnen. "m_" steht für ein Member einer Klasse. Da man globale Variablen jedoch in den meisten Fällen vermeiden sollte, ist es vielleicht ratsam, m_pMemDC direkt als Member deiner Klasse zu verwenden.



  • es gbit doch bei Codeprojekt oder codeguru ne CMemDC klasse..



  • Gegenfrage wo sollen die nicht gesetzten Pixel her kommen wenn du mit

    pMemDC->SelectObject(pCBitmap_dest);
    

    eine neue Bitmap selektierst, da rein zeichnest und dann als Krönung die se am ende weg schmeisst. Is mir rätzelhaft das es überhaupt irgendwie läuft (aber egal soweit hab ich net geschaut). Also entweder du benutzt immer die gleiche bitmap in deinem MemDC oder du kopierst um. Und noch zu deinem vergleich ob sich was geändert hat und nur dann das Pixel setzen, würdest du nicht mit SetPixel die Pixel in der Bitmap setzen, könntest du dir den Vergleich spaaren, außer du willst damit was besonderes bezwecken, das mir verborgen bleibt.

    Gruß Matthias


Anmelden zum Antworten