IDC_Static Feld freigeben
-
Hi @all,
ich habe folgendes Prob.
Ich lasse in meinem Programm ein Video (das Bild einer Webcam) laufen. Wenn ich diese Funktion stoppe und danach wieder starte hat sich das Bild in das Steuerelement eingebrannt. Also habe ich alle Pointer freigegeben und beim Neustart des Videos die Pointer neu erzeugt. Klappt leider auch nicht.

Gibt es eine Funktion, wie ich das Static-Feld (IDC_VIDEO) leeren kann?
-
Hm,
ich schätze mal.
CStatic::Invalidate
CStatic::RedrawWindow
Grüße Rapha
-
Hi Rapha,
habe
m_pControl->Invalidate(); m_pControl->RedrawWindow();probiert.
Klappt leider nicht. m_pControl ist übrigens der Pointer auf das Static-Feld IDC_VIDEO
-
Ähm...CWnd::UpdateWindow ?
void UpdateWindow( );
Remarks
Updates the client area by sending aWM_PAINT message if the update region is not empty. The UpdateWindow member function sends a WM_PAINT message directly, bypassing the application queue. If the update region is empty, WM_PAINT is not sent.
klingt vielversprechend...
Grüße Rapha
-
UpdateWindow() hab ich drin.
Leider keine Besserung

-
Hm, langsam gehen mir die Ideen aus

Versuch mal den ganzen Dialog mit den bereits genannten Funktionen neu zu zeichnen...
Grüße Rapha
-
Wie meinst Du das, den ganzen Dialog neuzeichnen mit den genannten Funktionen?
CWnd* pParent = GetDlgItem(IDD_GAMIGOTV_DIALOG); pParent->Invalidate(); pParent->RedrawWindow(); UpdateWindow();Klappt so net

-
Ne, einfach die Funktionen auf die CDialog-Klasse anwenden.
Also praktisch in einer CDialog - Methode
this->blablabla
aufrufen (wobei this nicht nötig ist).Grüße Rapha
-
Ich raff es net.
Keine Besserung, was ich auch mache

Kannst Du mir vieleicht mal erklären, wie man mit CStatic::Create
ein Steuerelement zur Laufzeit erzeugt. Vieleicht geht es ja, wenn ich das Static-Feld beim Videostart komplett neu erzeuge und bei Stop mit Destroy zerstöre?Ich hab es gerade schon die ganze Zeit versucht, krieg es aber irgendwie nicht hin.
-
Hi
Erstelle einfach ein neues CStatic Objekt (entweder als Membervariable in der Dialogklasse oder mit new => es darf nicht lokal sein) und rufe Create auf.
Die Parameter von CStatic::Create kannst du in der MSDN nachschlagen.Dies ist aber keine so gute Lösung.
Erzwinge einfach einen Dialogrefreshz.B. so
void CDeinDlg::OnButton1() { // blablabla // weiß nicht, welche Funktion die beste ist, probiere einfach mal folgende aus: Invalidate(); RedrawWindow(); UpdateWindow(); }Grüße Rapha
-
Das hab ich bereits gemacht, klappt ja nicht.
-
hier noch zwei ideen
-ShowWindow(SW_FALSE); auf das static bevor du es zerstörst
-CPaintDC dc(this);
dc.PatBlt(...);
-
Trikor schrieb:
CWnd* pParent = GetDlgItem(IDD_GAMIGOTV_DIALOG); pParent->Invalidate(); pParent->RedrawWindow(); UpdateWindow();Eieiei, ob es so funktioniert, kann ich nicht sagen.
Habs noch nie so funktioniert, da das ziemlich unlogisch ist
Versuchs mal so, wie ichs in meinem vorherigen Post beschrieben hab.Grüße Rapha
-
Das hab ich doch auch schon lange verworfen.
Hab gehoft, es sieht keiner.

-
Habs nochmal ausprobiert
Invalidate()
und
RedrawWindow()müssten funktionieren.
Grüße Rapha
-
Trikor schrieb:
Das hab ich doch auch schon lange verworfen.
Hab gehoft, es sieht keiner.

Habs anhand einer kleinen Testanwendung versucht:
Kannst dir das Beispiel ja mal anschauen:
http://mitglied.lycos.de/rame03/files.htm (Dateiname: update.zip)Grüße Rapha
-
Aber leider nicht bei mir
Ich poste mal ein bissle Code
Vorschau starten
CComBSTR bstrName = NULL; // Initialize the COM library and retrieve a pointer // to an IWMEncoder interface. hr = CoInitialize(NULL); if ( SUCCEEDED( hr ) ) { hr = CoCreateInstance(CLSID_WMEncoder, NULL, CLSCTX_INPROC_SERVER, IID_IWMEncoder, (void**) &pEncoder); } // Retrieve a pointer to an IWMEncSourceGroupCollection interface. if ( SUCCEEDED( hr ) ) { hr = pEncoder->get_SourceGroupCollection(&pSrcGrpColl); } // Add a source group to the collection. if ( SUCCEEDED( hr ) ) { hr = pSrcGrpColl->Add(CComBSTR("SG_1"), &pSrcGrp); } // Add a video source and an audio source. if ( SUCCEEDED( hr ) ) { hr = pSrcGrp->AddSource(WMENC_VIDEO, &pSrcVid); } // Specify the sources. if ( SUCCEEDED( hr ) ) { hr = pSrcVid->SetInput(CComBSTR("Device://"+m_strVideo)); } // Specify the output. if ( SUCCEEDED( hr ) ) { hr = pEncoder->get_Broadcast(&pBrdCst); } if ( SUCCEEDED( hr ) ) { hr = pBrdCst->put_PortNumber(WMENC_PROTOCOL_HTTP, 8080); } // Select the 5th profile from the collection and set it into the source group. if ( SUCCEEDED( hr ) ) { hr = pEncoder->get_ProfileCollection(&pProColl); } if ( SUCCEEDED( hr ) ) { hr = pProColl->Item(4, &pPro); } if ( SUCCEEDED( hr ) ) { hr = pSrcGrp->put_Profile(CComVariant(pPro)); } // Retrieve a pointer to a preview object. if ( SUCCEEDED( hr ) ) { hr = CoCreateInstance( CLSID_WMEncPreview, NULL, CLSCTX_INPROC_SERVER, IID_IWMEncDataView, (void**)&pPreview); } // Retrieve the preview collection. if ( SUCCEEDED( hr ) ) { hr = pSrcVid->get_PreviewCollection( &pPreviewColl ); } // Add the postiew object to the data view collection. If you set the // cookie to -1, the encoder engine automatically generates a unique cookie. long lCookie = -1; if ( SUCCEEDED( hr ) ) { hr = pPreviewColl->Add(pPreview, &lCookie); } // Continue configuring the encoder engine. // Initialize the encoder engine. if ( SUCCEEDED( hr ) ) { hr = pEncoder->PrepareToEncode(VARIANT_TRUE); } // Handle von IDC_VIDEO übergeben. m_pControl = GetDlgItem(IDC_VIDEO); hControl = m_pControl->GetSafeHwnd(); if ( SUCCEEDED( hr ) ) { hr = pPreview->SetViewSetting((DWORD) lCookie, sizeof(hControl), (BYTE*)&hControl); } // Start encoding. if ( SUCCEEDED( hr ) ) { hr = pEncoder->Start(); } // Start viewing the stream in a pop-up window. if ( SUCCEEDED( hr ) ) { hr = pPreview->Start(lCookie); } // Vorschau sichtbar machen GetDlgItem(IDC_VIDEO)->ShowWindow(TRUE); GetDlgItem(IDC_INKPICTURE1)->ShowWindow(FALSE); UpdateWindow(); // Button aktivieren bzw. deaktivieren GetDlgItem(IDC_VIEWSTART)->EnableWindow(FALSE); GetDlgItem(IDC_VIEWSTOP)->EnableWindow(TRUE); m_bPreviewStart = TRUE; // Retrieve a pointer to an IWMEncDataView2 interface. if ( SUCCEEDED( hr ) ) { hr = pPreview->QueryInterface(IID_IWMEncDataView2, (void**)&pPreview2); } // Set the view to available. if ( SUCCEEDED( hr ) ) { hr = pPreview2->put_ViewAvailable(lCookie, VARIANT_TRUE); } // Determine whether the view is available. VARIANT_BOOL bIsViewAvailable; if ( SUCCEEDED( hr ) ) { hr = pPreview2->get_ViewAvailable(lCookie, &bIsViewAvailable); } // Setzen der Bildwiederholrate if ( SUCCEEDED( hr ) ) { hr = pPreview2->put_FrameRateBalance(lCookie, VARIANT_TRUE); } // Prüfen ob die Bildwiederholrate stimmt VARIANT_BOOL bIsBalanced; if ( SUCCEEDED( hr ) ) { hr = pPreview2->get_FrameRateBalance(lCookie, &bIsBalanced); } // Prüfen ob Ansicht vorhanden ist VARIANT_BOOL bIsRunning; if ( SUCCEEDED( hr ) ) { hr = pPreview2->IsRunning(lCookie, &bIsRunning); } m_lCookieTemp = lCookie;Vorschau stoppen
GetDlgItem(IDC_VIDEO)->ShowWindow(FALSE); GetDlgItem(IDC_INKPICTURE1)->ShowWindow(TRUE); UpdateWindow(); // Stop the encoding process. GetDlgItem(IDC_VIEWSTART)->EnableWindow(TRUE); GetDlgItem(IDC_VIEWSTOP)->EnableWindow(FALSE); // Prüfvariable korrigieren m_bPreviewStart = FALSE; // When finished, stop the preview. if ( SUCCEEDED( hr ) ) { hr = pPreview->Stop(m_lCookieTemp); } // Stop the encoding process. if ( SUCCEEDED( hr ) ) { hr = pEncoder->Stop(); } Invalidate(); RedrawWindow(); UpdateWindow(); m_pControl = NULL; delete m_pControl; // Release pointers. if ( pPreview != NULL) { pPreview->Release(); pPreview = NULL; delete pPreview; } if ( pPreview2 != NULL) { pPreview2->Release(); pPreview2 = NULL; delete pPreview2; } if ( pPreviewColl ) { pPreviewColl->Release(); pPreviewColl = NULL; delete pPreviewColl; } if ( pSrcGrpColl ) { pSrcGrpColl->Release(); pSrcGrpColl = NULL; delete pSrcGrpColl; } if ( pSrcGrp ) { pSrcGrp->Release(); pSrcGrp = NULL; delete pSrcGrp; } if ( pSrcVid ) { pSrcVid->Release(); pSrcVid = NULL; delete pSrcVid; } if ( pProColl ) { pProColl->Release(); pProColl = NULL; delete pProColl; } if ( pPro ) { pPro->Release(); pPro = NULL; delete pPro; } if ( pEncoder ) { pEncoder->Release(); pEncoder = NULL; delete pEncoder; } // Prüfvariable korrigieren m_bPreviewStart = FALSE;
-
die dritte zeile is falsch plaziert und unnötig
pPreview->Release();
pPreview = NULL;
delete pPreview;hier isses ganz falsch
m_pControl = NULL;
delete m_pControl;
-
pPreview muß ich doch wieder freigeben, da die Vorschau ja beendet wurde und m_pControl ist der Pointer auf das IDC_VIDEO (Static-Feld indem das Video läuft) als Membervariable deklariert.
Was soll daran falsch sein.
-
1. sorgst du erst dafür, dass der zeiger auf "nichts" zeigt, dann willst du das "nichts" löschen
2. com objekte musst du nich mit delete löschen
release und auf 0 setzen reicht