Membervariable in globaler Funktion ansprechen

Hallo,

Mein Ziel ist es eine Firewire-Kamera anzusteuern.

Im folgenden Code-Abschnitt ist Kamera ein Objekt der Klasse C1394Camera, welche zahlreiche Methoden und Eigenschaften besitzt, mit deren Hilfe mal auf die Kamera zugreifen kann.

Wird der Quellcode so angewendet, bekomme ich ein einziges Bild der Kamera. Allerdings möchte ich einen LIVE-Stream.

Code:
void CMesssystemDlg::OnCmd1Start() 
{
	if (Kamera.CheckLink())
		AfxMessageBox("Keine Kamera gefunden");
	else
	{
		Kamera.InitCamera();
		Kamera.InquireControlRegisters();
		Kamera.StatusControlRegisters();
		Kamera.SetVideoFormat(Format());
		Kamera.SetVideoMode(Mode());
		Kamera.SetVideoFrameRate(Rate());
		if (Kamera.StartImageAcquisition())
			AfxMessageBox("Kann Bild nicht anzeigen. Bitte Einstellungen ändern");
		else
		{
			m_charBild = new unsigned char[Kamera.m_width * Kamera.m_height * 3];

	BITMAPINFO bmi;
	bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biWidth = Kamera.m_width;
	bmi.bmiHeader.biHeight = Kamera.m_height;
	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);

	Kamera.getDIB(m_charBild);

	SetDIBitsToDevice(dc, 0, 0, Kamera.m_width, Kamera.m_height, 0, 0, 0, Kamera.m_height, m_charBild, &bmi, DIB_PAL_COLORS);
		}
		
	}
}

Daher habe ich das eigentliche Anzeigen des Bildes in eine globale Funktion gepackt und diese mit AfxBeginThread aufgerufen. Das Problem dabei ist, wie lasse ich meinen Gerätekontext in der Funktion Bildschirm immernoch auf mein App zeigen? Und zweitens, wie kann ich die Member-Variable m_charBild von CMesssystemDlg oder CMesssystemApp verwenden?

Code:
UINT Bildschirm(LPVOID pParam)
{
	BITMAPINFO bmi;
	bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biWidth = Kamera.m_width;
	bmi.bmiHeader.biHeight = Kamera.m_height;
	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(CMesssystemApp);

	Kamera.getDIB(CMesssystemApp.m_charBild);

	SetDIBitsToDevice(dc, 0, 0, Kamera.m_width, Kamera.m_height, 0, 0, 0, Kamera.m_height, CMesssystemApp.m_charBild, &bmi, DIB_PAL_COLORS);
	return(0);
}

void CMesssystemDlg::OnCmd1Start() 
{
	if (Kamera.CheckLink())
		AfxMessageBox("Keine Kamera gefunden");
	else
	{
		Kamera.InitCamera();
		Kamera.InquireControlRegisters();
		Kamera.StatusControlRegisters();
		Kamera.SetVideoFormat(Format());
		Kamera.SetVideoMode(Mode());
		Kamera.SetVideoFrameRate(Rate());
		if (Kamera.StartImageAcquisition())
			AfxMessageBox("Kann Bild nicht anzeigen. Bitte Einstellungen ändern");
		else
		{
			m_charBild = new unsigned char[Kamera.m_width * Kamera.m_height * 3];
			AfxBeginThread(Bildschirm, NULL);
		}
		
	}
}

Gruß,
Alex
 
Hallo,

Ich habe nun global einen neuen Pointer deklariert.
CMesssystemDlg* pMyApp:
und die letzten Zeilen der Funktion Bildschirm folgendermaßen abgeändert

Code:
	bmi.bmiHeader.biClrImportant = 0;

	HDC dc = GetDC(pMyApp->m_hWnd);

	Kamera.getDIB(pMyApp->m_charBild);

	SetDIBitsToDevice(dc, 0, 0, Kamera.m_width, Kamera.m_height, 0, 0, 0, Kamera.m_height, pMyApp->m_charBild, &bmi, DIB_PAL_COLORS);
	return(0);

kompiliert wird nun ohne Fehler und Warnungen.
Allerdings stürzt das Programm ab, sobald ich den programmierten Button drücke.

Vielleicht kann nun jemand helfen.
 
Dumme Frage, hast du den Pointer auch irgendwo gesetzt?

Da würde sich der Constructor von CMesssystemDlg anbieten, der müsste schon angelegt sein. Einfach innerhalb des Constructors pMyApp = this; einsetzen.
 
Es gibt keine dummen Fragen.... so wie auch hier mal wieder....
als ich deine antwort gelesen habe, hab ich nur "Autsch" gesagt...

der Pointer ist nun dort zugewiesen.

Code:
CMesssystemDlg::CMesssystemDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMesssystemDlg::IDD, pParent)
{
	m_iImageSize = -1;
	m_iColor = -1;
	m_iRate = -1;
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	pMyApp = this;
}

Besten Dank,
Problem ist gelöst.
 
Zurück