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 Dialogrefresh

    z.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;



  • @Sovok

    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



  • ach ja, wenn es einer Testen will.

    Dazu braucht Ihr die Windows Media Encoder 9 SDK
    http://www.microsoft.com/downloads/details.aspx?FamilyID=000a16f5-d62b-4303-bb22-f0c0861be25b&displaylang=en


Anmelden zum Antworten