CClientDC ersetzen durch GetDC



  • Hallo,

    Ich habe ein Array aus unsigned char erstellt, welches ich als Bild benutze

    unsigned char* m_Array
    m_Array = new unsigned char[m_iWidth * m_iHeight * 3];
    

    Nachdem das Bild gefüllt und bearbeitet wurde, kann es durch folgenden Quellcode in einer Picturebox angezeigt werden. Der Picturebox ist eine Controlvariable (m_statPic) vom Typ CStatic zugefügt.

    bool CTestDlg::ShowPic(CStatic* Picturebox)
    {
    	//Bitmapheader mit Informationen zum Bild für HBITMAP
    	BITMAPINFO bmi;
    	bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    	bmi.bmiHeader.biWidth = m_iWidth;
    	bmi.bmiHeader.biHeight = m_iHeight;
    	bmi.bmiHeader.biPlanes = 1;
    	bmi.bmiHeader.biBitCount = 24;
    	bmi.bmiHeader.biCompression = BI_RGB;
    	bmi.bmiHeader.biSizeImage = 0;
    	bmi.bmiHeader.biXPelsPerMeter = 1000;
    	bmi.bmiHeader.biYPelsPerMeter = 1000;	
    	bmi.bmiHeader.biClrUsed = 0;
    	bmi.bmiHeader.biClrImportant = 0;
    
    	CClientDC dc(this);	//verknüpft dc mit dem  Fenster 
    	HBITMAP hBitmap;		//Bitmap-Handle erstellen
    
    	//erstellt und dimensioniert hBitmap
    	hBitmap =  CreateCompatibleBitmap(dc,m_iWidth,m_iHeight);
    	//wandelt Array* in hBitmap um
    	SetDIBits(dc, hBitmap, 0, m_iHeight, m_Array, &bmi, DIB_PAL_COLORS);	
    
    	Picturebox->SetBitmap(getHBitmap());
    
    	DeleteObject(hBitmap);		//Speicher wieder freigeben
    	ReleaseDC(&dc);				//Speicher wieder freigeben
    
    	return false;
    }
    

    Jetzt habe ich eine neue Klasse erzeugt, in der ich ein Array als Bild verwalten möchte. Das heißt, die Deklaration des Array, das Bearbeiten des Array und die Routine zum anzeigen des Array werden ebenfalls als Methoden dieser neuen Klasse ArrayPic ausgelagert.

    In der ShowPic() muss dann allerdings die Verknüpfung des dc anders realisiert werden, da der this-Pointer auf das falsche Objekt zeigen würde. Mein Versuch zur Korrektur war

    bool CTestDlg::ShowPic([b]CWnd* pWnd,[/b] CStatic* Picturebox)
    {
    ...
    HDC hdc = GetDC(*pWnd);
    ...
    ReleaseDC(*pWnd, hdc);
    }
    

    Der Aufruf der Methode erfolgt über

    ArrayPic Obj;
    Obj.setNew(...);
    Obj.DrawRect(...);
    //Bis hier hin ist noch alles OK.
    //Das Auslesen einzelner Bildpunkte etc. klappt.
    //Das Array ist also da und gefüllt
    Obj.ShowPic(&m_hWnd, &m_statPic);
    

    Leider ohne erfolg. Nachdem die Routine ausgelagert und abgeändert wurde, ist auf dem Bildschirm kein Bild zu sehen.

    Bitte um Hilfe... trotz der Menge Text.
    Gruß,
    Alex


Anmelden zum Antworten