transparentes Steuerelement mit Video darunter



  • Hallo zusammen,

    ich habe folgende Herausforderung:
    Ich habe eine Anwendung, in welcher in ActiveX enthalten ist, welches ein Video abspielt. Nun möchte ich aber gern in den Videobereich Buttons einblenden, also direkt über das Videobild legen, welche transparent sind.
    Zum einen möchte ich nur auf eine bestimmte Region über dem Video auf Klicks bzw. Mausbewegungen reagieren können, und zum anderen hätte ich gern Buttons darüber gelegt, welche mit einer Farbe transparent das Videobild durchlässig darstellen.

    Ich habe nun schon Stunden nach transparenten Buttons gesucht, aber immer nur abgeleitete Klassen gefunden, welche eine statische Bitmap aus dem Hintergrund auf dem button abbilden, also nicht wirklich transparent, oder gar teiltransparent sind.

    Ab Windows 2000 gibt es doch die Möglichkeit, sogar ganze Fenster transparent darzustellen. Kan man das nicht auch mt einzelnen Buttons machen?

    Ich bin dankbar für jedes beispiel, und jeden Hinweis.

    klsc



  • Spontan fallen mir vier Möglichkeiten ein:

    - unsichtbaren Button über dem Video platzieren, StaticText drüber und Klicken abfangen
    - du könntest auch bei einem Klick aufs ActiveX-Video-Element wo geklickt wurde abfragen und einen StaticText an die entsprechende Stelle drüber legen
    - oder du arbeitest mit dem STN_CLICKED-Event
    - etwas umständlich: du ermittelst für jeden Frame das Teilbild deines Videos und malst es als Hintergrund immer wieder auf deinen Button



  • So kannst du einen Dialog durchsichtig machen.. sollte aber auch mit einem Control funzen, wenn du ne Klasse vom eigentlichen Control ableitest:

    in der stdafx.h:

    # define LWA_COLORKEY 1
    # define LWA_ALPHA 2
    # define WS_EX_LAYERED 0x80000
    

    in deiner Klasse:

    #include windows.h
    
    void CClass::SetSeeThru(int factor)
    {
    	HWND hWnd=this->m_hWnd;
    	    typedef DWORD (WINAPI *PSLWA)(HWND, DWORD, BYTE, DWORD);
    
    	PSLWA pSetLayeredWindowAttributes;
    
    	HMODULE hDLL = LoadLibrary ("user32");
    	pSetLayeredWindowAttributes = (PSLWA) GetProcAddress(hDLL,"SetLayeredWindowAttributes");
    
    	if (pSetLayeredWindowAttributes != NULL) 
    	{
    		SetWindowLong (hWnd, GWL_EXSTYLE, GetWindowLong
    		(hWnd, GWL_EXSTYLE) |WS_EX_LAYERED/*|WS_EX_TOOLWINDOW*/ );
    
    		pSetLayeredWindowAttributes (hWnd, RGB(100,100,100), factor, LWA_COLORKEY|LWA_ALPHA);
    	}
    	bAlphaBlend = ! bAlphaBlend;
    
    	FreeLibrary(hDLL);
    }
    

    Wobei RGB(100,100,100) dann die Farbe ist, die immer komplett durchsichtig ist...



  • @Flockig
    unsichtbarrer button?! bei meinen bisherigen versuchen hat der button keine klicks mehr genommen, sobald er visible false war. enabled hab ich natürlich auf true gelassen.

    das activex selber reagiert auf klicks. aber wie ich vorgehen muss um klicks auf teilbereiche des activex controls abzufangen, weiß ich momentan nicht. das klingt auch nach ner menge google aufwand 😉
    aber das wird sicher keine schlechte idee sein.



  • das activex selber reagiert auf klicks. aber wie ich vorgehen muss um klicks auf teilbereiche des activex controls abzufangen, weiß ich momentan nicht. das klingt auch nach ner menge google aufwand 😉

    Naja, du weisst ja die Position und Größe deines ActiveX-Controls. Bei einem Klick darauf erhältst du x und y-Koordinate des Mousezeigers beim Klick. Liegt die Position innerhalb des gewünschten Bereichs (-> Buttonposition), wird etwas ausgeführt - sonst nicht!



  • ist gerade nen anderes Problem aufgetaucht. als ich versucht habe nen button über das video zu setzen, wurde dieser im bereich des videos gar nicht dargestellt. und das obwohl ich overlay deaktiviert hab.

    mist, werd ich wohl doch das mit dem klickbereich probieren müssen



  • @Machine

    Machine schrieb:

    bAlphaBlend = ! bAlphaBlend;

    Ich habe eben eine neue Klasse erstellt, abgeleitet von CButton. Dieser wie du beschrieben hast die Funktion zum Transparentmachen hinzugefügt und einen zweiten Button hinzugefügt, welcher diese Funktion dann ausführen soll.

    Unter dem transparenten Button liegen andere Steuerelemente. Aber es scheint keine Veränderung zu geben. Die darunter liegenden Buttons sind nicht dadurch sichtbar.

    außerdem hab ich die Zeile oben auskommentiert, da er nen Fehler meckerte und mir die Nutzung der variablen überflüssig erschien.

    Kann es sein das ich noch irgendwas vergessen habe? Vielleicht muss ich dem Haupt Dlg noch sagen das er überhaupt transparente Steuerelemente händeln kann?

    PS: füge ich die gleiche Funktion im Dialog ein, funktioniert mit dem gesamten Dialog die Transparenz


Anmelden zum Antworten