HWNd von Teilfenster?

Hallo…
Ich habe folgendes Problem:
Ich habe eine SDI-Anwendung.
In dem Fenster werden diverse Dinge ausgegeben.
Ich möchte nun aber einen Teilbereich
(z.B. von der linken oberen Ecke bis Punkt 800,600)
davon haben.
Bzw. was ich brauche, ist ein HWND auf genau diesen Teilbereich des Fensters…

Wie mach ich sowas?
-Eventuell den HWND aufs ganze Fenster nehmen, und irgendwie verändern? Wenn das geht, wie?
-Oder muß ich da ein neues Fenster anlegen?
-Oder muß ich vielleicht einen devicecontext anlegen und
mirt ein Handle auf den holen?

Egal wie, ich braucvh irgendwie einen HWNd…

Für Hilfe wäre ich sehr dankbar…

Hallo…
Ich habe folgendes Problem:
Ich habe eine SDI-Anwendung.
In dem Fenster werden diverse Dinge ausgegeben.
Ich möchte nun aber einen Teilbereich
(z.B. von der linken oberen Ecke bis Punkt 800,600)
davon haben.
Bzw. was ich brauche, ist ein HWND auf genau diesen
Teilbereich des Fensters…

Ein Handle-Zeiger kann immer nur auf das Fensterobjekt als ganzes den Zugriff bieten.
Um nur auf einen rechteckigen Teilbereich zu zeichnen oder diesen in andere Speichervariablen zu kopieren, dienen Funktionen wie BitBlt und ähnliche, wo diese Maße jeweils einzugeben sind. Oft wird hierzu ein kompatibler DC verwendet, der mit Funktionen wie CreateCompatibleDC erzeugt werden kann und der dann als interner Puffer verwendet werden kann, so auch in fester Verbindung mit einem CBitmap-Objekt.

Um tatsächlich einen bearbeitbaren Speicherbereich zu schaffen, sind dann oft die relativ komplizierten Funktionen GetDIBits und SetDIBits von großer Bedeutung, um aus DC- oder Bitmap-Objekten die Daten in einen selbst allokierten lockbaren Speicherbereich zu bekommen, wo dann auch Verarbeitungen vorgenommen werden können. Um dies alles zu verstehen, kommt man fast nicht darum, sich mit Musterbeispielen aus den MSDN-Paketen zu beschäftigen.

Wie mach ich sowas?
-Eventuell den HWND aufs ganze Fenster nehmen, und irgendwie
verändern? Wenn das geht, wie?
-Oder muß ich da ein neues Fenster anlegen?
-Oder muß ich vielleicht einen devicecontext anlegen und
mirt ein Handle auf den holen?

Wenn nur einzele Pixel zu verarbeiten sind oder darauf mit Standardfunktionen geschrieben werden soll, genügt es vielleicht, sich einen zweiten kompatiblen DC anzulegen. Wenn mit hoher Geschwindigkeit komplexere Bildverarbeitungen erfolgen sollen, muss über GetDIBits eine Kopie des Datenspeichers angelegt werden, da die üblichen Manipulationsfunktionen für DCs sonst nicht effizient arbeiten, wahrscheinlich weil dann wegen jedem Pixel intern das ganze Bild gelockt und wieder freigegeben wird.

Gerald

Also effektiv geht’s darum,
dass ich ein Kamerabild in meinem Fenster darstelle.
Die Kamera braucht einen HWND.
Übergebe ich ihr den normalen HWND,
so legt die Kamera das Bild auf die gesammte Fensterfläche.
Ich wills ja aber nur auf einen Teilbereich skalieren.

Heißt das ich werde nicht drumrum kommen mit StretchDIBits usw zu arbeiten?

Vielen DAnk schonmal für die kompetente Antwort soweit.

Gruß

Sebastian

Also effektiv geht’s darum,
dass ich ein Kamerabild in meinem Fenster darstelle.
Die Kamera braucht einen HWND.
Übergebe ich ihr den normalen HWND,
so legt die Kamera das Bild auf die gesammte Fensterfläche.
Ich wills ja aber nur auf einen Teilbereich skalieren.
Heißt das ich werde nicht drumrum kommen mit StretchDIBits usw
zu arbeiten?

Die Programmierung mit Videoquellen ist erst recht ein sehr problematisches Aufgabengebiet, wo es sehr schwer ist, überhaupt brauchbare Anleitungen zu finden. Wenn die hierfür verwendbaren Standardfunktionen von Microsoft nicht professionell aufeinander abgestimmt werden, kommt es sehr schnell zu endlosen Systemabstürzen, ohne dass man etwas sinnvolles damit anfangen kann. Als Einstieg kann ich hier nur das Musterprogramm vidcap aus den MSDN-Paketen empfehlen, wo diese Aufgaben sehr ordentlich gelöst werden und sicher auch durch Anpassung des Codes oder Verwendung von Spezialfunktionen wie Stretch-Methoden die gewünschte Maßlösung erreicht werden könnte.

Nach anderen Musterprogrammen hierzu habe auch ich bisher vergeblich gesucht, wahrscheinlich weil es für einen Nichtinsider zu diesen Microsoftfunktionen überhaupt kaum möglich sein wird, aus diesen sehr mysteriösen Funktionen ein funktionsfähiges Programm zu schreiben, das nicht den Rahmen aller Lehrbücher und Toolkitanleitungen sprengen würde.

Gerald

Egal wie, ich braucvh irgendwie einen HWNd…

hwndObj = GetDlgItem(hwnd, IDC_EDIT);

hwnd: von aktuelle Fenster
hwndObj: jeweile Object im Fenster
IDC_EDIT: Name von Object im Fenster

vielleicht hilf dir das weiter?

Also effektiv geht’s darum,
dass ich ein Kamerabild in meinem Fenster darstelle.

Erzeugt doch ein Objekt in dein Fenster, der deiner Bilder dastellen kann.

dass ich ein Kamerabild in meinem Fenster darstelle.
Die Kamera braucht einen HWND.
Übergebe ich ihr den normalen HWND,

hwndObj = GetDlgItem(hwnd, BILD_OBJECT);
hwnd: von aktuelle Fenster

Ich habe so was noch nicht programmiert, aber ich glaube nicht, dass es so schwer ist. Muss halt einbisschen probieren.

Also effektiv geht’s darum,
dass ich ein Kamerabild in meinem Fenster darstelle.
Die Kamera braucht einen HWND.
Übergebe ich ihr den normalen HWND,
so legt die Kamera das Bild auf die gesammte Fensterfläche.
Ich wills ja aber nur auf einen Teilbereich skalieren.

Also wenn die Kamera das Bild vollkommen automatisch im Bereich des Fensters mit einem gegebenen Handle hwnd darstellt, wird dies in der Regel bei fehlendem weiterem Parameter unverzerrt erfolgen, d. h. das Bild wird in seiner vollen Größe dargestellt und bei zu kleinem Fenster wird der überstehende Teil nicht angezeigt. Ob dann überhaupt eine Variation der Darstellungsgröße möglich ist, ist sehr fraglich.
Um etwas anderes zu erreichen wie eine Anpassung an variierende Fenstergrößen, dürfte es dann kaum umgänglich sein, spezielle Funktionen der Videoprogrammierung zu verwenden, soweit nicht eine Notlösung oder Bastellösung mit Kopieren des Bildes für die gewünschte Anwendung ausreicht.

Gerald