Habe nur Window Handle -> Nachrichten ?
-
ok, bin etwas weiter gekommen. cvGetWindowHandle() gibt mir das Handle des Fensters zurück.
Damit müsste ich eine Callbackfunktion für dieses Fenster installieren. Mittels WinAPI kein Problem, aber wie realisiert man dieses in MFC ?

-
Fensterklasse ableiten und dann CWnd::SubclassWindow...
-
Wäre es sinnvoll das Ganze über Hooks zu probieren?
-
MFC-Anfänger2 schrieb:
Wäre es sinnvoll das Ganze über Hooks zu probieren?
Warum mit Kanonen (Hooks) auf Spatzen (Fenster die man subclassen kann) schießen?
Nur weil Du evtl. subclassing nicht verstanden hast? SCNR

-
Bin leicht zu durchschauen was?Aber erstmal vielen Dank für deine Hilfe !! Mittlerweile vermute(
) ich zu wissen wie es geht!Ich habe das nun folgendermaßen realisiert. Ist dass die Art und Weise wie man SubclassWindow() eisetzt oder haben sich mal wieder Denkfehler eingeschlichen ?:
// class VideoWindow: public CWnd // { // private: CString name; // HWND WindowHandle; // } ///////////////////////////////////////////////////////////////////////////// // VideoWindow VideoWindow::VideoWindow() { // Initialisierung der Attribute // name = ""; WindowHandle = NULL; } VideoWindow::~VideoWindow() { // Videodatei schließen // geschlossen. // SendMessage(WM_CLOSE); } // Methode zum Darstellen eines Frames. // // Parameter: // capture = Zeiger auf CvCapture-Struktur der geoeffneten Videodatei. // frameNumber = Position des darzustellenden Frames // void VideoWindow::show(CvCapture* capture, const double frameNumber) { // Ueberpruefen ob Fenster existiert. // if(IsWindow((HWND)cvGetWindowHandle(name)) == TRUE) { // Frame Position setzen. cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, frameNumber); // Bild im Fenster "name" darstellen. cvShowImage(name, cvQueryFrame(capture)); } } BEGIN_MESSAGE_MAP(VideoWindow, CWnd) //{{AFX_MSG_MAP(VideoWindow) ON_WM_CLOSE() ON_WM_LBUTTONDOWN() ON_WM_RBUTTONDOWN() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // VideoWindow message handlers BOOL VideoWindow::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { // Ueberpruefen ob gleichnamiges Fenster bereits existiert. // Wenn Fenster existiert wird es geschlossen. // if(IsWindow((HWND)cvGetWindowHandle(name)) == TRUE) cvDestroyWindow(name); // Durch OpenCV Erzeugtes Fenster skaliert sich selbst. // if(cvNamedWindow(name, CV_WINDOW_AUTOSIZE) < 1) throw UIException("Videofenster kann nicht erzeugt werden!"); // Window Handle vom erzeugten Fenster holen. WindowHandle = (HWND) cvGetWindowHandle(name); // Handle des Fensters an SubclassWindow() übergeben. Damit wird das erzeugte Fenster an das // VideoWindow Objekt "angeheftet". // if(this->SubclassWindow(WindowHandle) == 0) { // Erzeugtes Fenster kann nicht angehangen werden, daher wird es wieder zerstört. cvDestroyWindow(name); throw UIException("Videofenster kann nicht erzeugt werden!"); } return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext); } void VideoWindow::OnClose() { // Fensterhandle ermitteln und ueberpruefen ob Fenster existiert. // Wenn Fenster existiert wird es geschlossen. // if(IsWindow((HWND)cvGetWindowHandle(name)) == TRUE) cvDestroyWindow(name); CWnd::OnClose(); } void VideoWindow::OnLButtonDown(UINT nFlags, CPoint point) { // ... CWnd::OnLButtonDown(nFlags, point); } void VideoWindow::OnRButtonDown(UINT nFlags, CPoint point) { // ... CWnd::OnRButtonDown(nFlags, point); }
-
Sieht doch gut aus...
der Stil gefällt mir zwar nicht, aber das ist Geschmacksache...
z.B. Die Nutzung von SendMessage4 im Desturktor ist wohl zu überdenken etc.
-
Ich habe den Destruktor nochmal abgeändert. Ist diese Variante Ok?
VideoWindow::~VideoWindow() { // Fensterhandle ermitteln und ueberpruefen ob Fenster existiert. // Wenn Fenster existiert wird es geschlossen. // if(IsWindow((HWND)cvGetWindowHandle(name)) == TRUE) cvDestroyWindow(name); }Und nochmals vielen, vielen Dank für deine Hilfe !! Ohne das Forum wäre ich momentan wirklich aufgeschmissen !
-
Ich würde es noch anders machen. Durch diesen Konstruktor wird doch in jedem Fall ein Attach durchgeführt, wenn der Create ausgeführt wurde. In diesem Fall ist auch m_hWnd gesetzt.
Ich würde alles was cv angeht in Create abwickeln. Der Destruktor kümmert sich um das abwickeln der MFC Seite...
-
Das ganze will doch noch nicht so recht funktionieren.
// Objekt der Klasse VideoWindow erzeugen. VideoWindow VWindow; // ... in meinem Dialog rufe ich Create() auf, nur wahrscheinlich mit den falschen // Parametern, da: // Debug Assertion Failed! (wincore.cpp, Zeile: 628) an dieser steht folgende // Assertion: ASSERT(pWnd->m_hWnd == NULL); // only do once // Leider kann ich diese Assertion noch nicht so recht interpretieren (Anfänger). // Aufruf von VideoWindow::Create() // VWindow.Create( NULL, pApp->Data.getWindowName(), WS_BORDER | WS_VISIBLE, CRect(0,0, a, b), this, 1212 ); // a und b bei CRect() gebe ich der Übersichtlichkeit halber mal extra an: // a= cvGetCaptureProperty(pApp->Data.getVideoCapture(), CV_CAP_PROP_FRAME_WIDTH); b= cvGetCaptureProperty(pApp->Data.getVideoCapture(), CV_CAP_PROP_FRAME_HEIGHT); //////////////////////////////////////////////////////////////////////////// // Das Fenster welches durch VWindow gekapselt wird, wird durch die OpenCV // Funktion cvNamedWindow(name, CV_WINDOW_AUTOSIZE) erzeugt. Dadurch passt sich // das Fenster automatisch an die Dimensionen der Videodatei an. // Ist der Aufruf von VWindow.Create() mit meiner oben angegebenen // Parametrierung dafür passend ?
-
Ich würde es noch anders machen. Durch diesen Konstruktor wird doch in jedem Fall ein Attach durchgeführt, wenn der Create ausgeführt wurde. In diesem Fall ist auch m_hWnd gesetzt.
Wenn ich dich richtig verstanden habe brauch ich (Vorausgesetzt: m_hWnd != Null) das erzeugte Fenster nirgendwo explizit durch die OpenCV Funktion cvDestroyWindow() schließen. Ausgenommen natürlich in VideoWindow::OnClose().
