IDC_Static Feld freigeben



  • 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



  • Kommen wir wieder zurück, das CStatic dynamisch zu erstellen.

    Global

    CStatic* pVideo = new CStatic;
    

    in Funktion OnPreviewStart()

    pVideo->Create(NULL,SS_ENHMETAFILE | WS_VISIBLE,re,this,IDC_VIDEO);
    

    In Funktion OnPreviewStop()

    pVideo->ShowWindow(FALSE);
    pVideo->DestroyWindow();
    

    so weit, so gut.
    Aber wie krieg ich jetzt wieder pVideo erzeugt?
    Global erstellt, durch DestroyWindow() zerstört.


Anmelden zum Antworten