"this"

Hallo,

Ich habe den Pointer this benutzt, um ein HBITMAP zu erstellen

Code:
CClientDC dc(this);
HBITMAP hBitmap;

hBitmap =  CreateCompatibleBitmap(dc,m_Width,m_Height);

Nun gehört dieses Codefragmet allerdings zu einem Codebereich, den ich aus der Dialog-Klasse heraus in eine neue C++Klasse ausgliedern möchte.

Das heißt, ich weiß nicht, was ich an dc bzgl. vorher an meine neue Klasse übergeben muss.

Bitte um Hilfe,

Gruß,
WilliamSpiderWeb
 
Hallo,

zu klären wäre, ob sich die neue Klasse auf denselben Dialog bezieht. Dann kannst du den this-Zeiger weiterverwenden und dir in der neuen Klasse den DC besorgen.
Und wie bzw. von wo wird dieser Code dann aufgerufen? Wenn du ihn aus der Dialogklasse aufrufst, kannst du den DC einfach als Parameter mit übergeben.
Code:
CMeineNeueKlasse neueKlasse;
CClientDC dc(this);
neueKlasse.dieseFunktion(dc,.....);
Und in der neuen Klasse definierst du dann einfach die Funktion.

Mfg

langer
 
Hi langer,

Erstmal danke für die Antwort, aber...

Bisher ist der Aufruf CClientDC dc(this) wie gesagt, in einem Dialogfenster,
soll aber in eine neue Klasse, die in einer anderen cpp-Datei steht und direkt nichts mehr mit dem Dialogfenster zu tun hat.

Da aber die Klasse und speziell auch die Methode, in der sich das CClientDC befindet von dem Dialogfenster aufgerufen werden soll, muss ich halt wissen, was ich den CClientDC übergeben soll.

Gruß,
WilliamSpiderWeb
 
Um mal genauer festzuhalten, worum es geht.
Diese neue Klasse stellt ein Bild in Form eines Array aus unsigned chars dar.
Eine Methode davon soll dieses Bild in einer Picturebox darstellen.
Dafür muss der dc erstellt werden. Ich habe jetzt mehr oder weniger geraten, dass es sich um ein CWnd* handelt, weiß aber natürlich nicht, ob das stimmt, weil ich noch nicht so besonders viel über den this Pointer weiß, den ich vorher benutzt habe.

Code:
bool ArrayPic::ShowPic(CWnd* pWnd, 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(pWnd);		//verknüpft dc mit dem  Fenster xxx
	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;
}
 
Bräuchte so langsam wirklich Hilfe.... Bitte..... :-(

Also ich habe einige Parameterübergaben in der ShowPic abgeändert.

Code:
bool ArrayPic::ShowPic(HWND* pWnd, CStatic* Picturebox)
// Array als Bild in Picturebox zeichnen
{
	//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;

	HDC hdc = GetDC(*pWnd);	//verknüpft hdc mit dem Fenster pWnd
	HBITMAP hBitmap;		//Bitmap-Handle erstellen

	//erstellt und dimensioniert hBitmap
	hBitmap =  CreateCompatibleBitmap(hdc, m_iWidth, m_iHeight);
	//wandelt Array* in hBitmap um
	SetDIBits(hdc, hBitmap, 0, m_iHeight, m_Array, &bmi, DIB_PAL_COLORS);	

	Picturebox->SetBitmap(getHBitmap());

	DeleteObject(hBitmap);	//Speicher wieder freigeben
	ReleaseDC(*pWnd, hdc);	//Speicher wieder freigeben
	

	return false;
}

m_Array ist ein Array von unsigned chars der Größe m_iWidth * m_iHeight * 3.
Dieses Array stellt das Bild dar, welches in der Klasse ArrayPic erstellt, bearbeitet und angezeigt wird.

Erstellt wird es über

Code:
void ArrayPic::setNew(int Width, int Height)
//Dimensioniert ein leeres Bild
{
	m_iWidth = Width;
	m_iHeight = Height;

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

	DrawRect(0, 0, m_iWidth, m_iHeight, 255, 255, 255);
}

So, außerhalb der Klasse erstelle ich ein Objekt dieser Klasse, definiere es und versuche es anzuzeigen.
(m_statPic ist eine Control-Variable für eine PictureBox)

Code:
void CTESTDlg::OnBnClickedButton1()
{
	ArrayPic Picture;

	Picture.setNew(200, 150);
	Picture.ShowPic(&this->m_hWnd, &m_statPic);
}

Beim Compilieren gibt es zum Glück schon einmal keine Fehlermeldungen,
Allerdings passiert nichts sichtbares, wenn ich auf den Button klicke.
 

Neue Beiträge

Zurück