проблемы с IVideoWindow
От: squid  
Дата: 15.07.07 04:59
Оценка:
пишу ActiveX control (MFC C++) для проигрывания видео. сразу столкнулся с проблемой...

для отображения я использую фильтр Video Renderer и Panel для отображения (демка на C#).
если кликнуть на этой панели во время проигрывания основное окно становиться неактивным а панелька для отображения (или сам контрол если отображать на нем) — активными. как это побороть?

вот код установки параметром IVideoWindow

FullScreen = false
OwnerHWND — панелька
AppHWND — основное окно

void ChangeVideoMode(bool FullScreen, OAHWND OwnerHWND, OAHWND AppHWND, int Width, int Height, IVideoWindow * pVideoWindow, IGraphBuilder * pGraphBuilder)
{
    try
    {
        long StyleEX;
        long OldStyle, OldStyleEx;
        HDC DC;
        IBasicVideo2 * pBasicVideo = NULL;

        long VideoScreenWidth, VideoScreenHeight, ClipWidth, ClipHeight, NewImageWidth, NewImageHeight, NewImageLeft, NewImageTop;

        if((pVideoWindow != NULL) &&  (pGraphBuilder != NULL))
            if(FullScreen)
            { 
                pVideoWindow->put_Owner(0);

                pVideoWindow->get_WindowStyle(&OldStyle);
                pVideoWindow->put_WindowStyle(OldStyle && !(WS_BORDER || WS_CAPTION || WS_THICKFRAME));
                pVideoWindow->get_WindowStyleEx(&OldStyleEx);

                StyleEX =  OldStyleEx && !(WS_EX_CLIENTEDGE || WS_EX_STATICEDGE || WS_EX_WINDOWEDGE || WS_EX_DLGMODALFRAME);
                pVideoWindow->put_WindowStyleEx(StyleEX);

                DC =  CreateDC(L"DISPLAY", NULL, NULL, NULL);
                Width = GetDeviceCaps(DC, HORZRES);
                Height = GetDeviceCaps(DC, VERTRES);
                DeleteDC(DC);
            } 
            else
            { 
                pVideoWindow->put_MessageDrain(AppHWND);
                
                pVideoWindow->put_Owner(OwnerHWND);
                pVideoWindow->put_Visible(OATRUE);

                pVideoWindow->put_WindowStyle(WS_CHILD || WS_CLIPSIBLINGS);
            } 

            VideoScreenWidth =  Width;
            VideoScreenHeight =  Height;

            
            if((pGraphBuilder->QueryInterface(IID_IBasicVideo2, (void**)&pBasicVideo) == S_OK))
            {
                pBasicVideo->get_VideoWidth(&ClipWidth);
                pBasicVideo->get_VideoHeight(&ClipHeight);

                if((VideoScreenWidth > 0) &&  (VideoScreenHeight > 0)   )
                { 
                    if((ClipWidth / ClipHeight) > (VideoScreenWidth / VideoScreenHeight)   )
                    { 
                        NewImageWidth =  VideoScreenWidth;
                        NewImageHeight =  (long)VF_Round((float)ClipHeight / (float)ClipWidth * (float)VideoScreenWidth);
                    }  
                    else
                    { 
                        NewImageWidth =  (long)VF_Round((float)ClipWidth / (float)ClipHeight * (float)VideoScreenHeight);
                        NewImageHeight =  VideoScreenHeight;
                    } 
                } 

                NewImageLeft = (VideoScreenWidth / 2) - (NewImageWidth / 2);
                NewImageTop = (VideoScreenHeight / 2) - (NewImageHeight / 2);

                pVideoWindow->put_Left(NewImageLeft);
                pVideoWindow->put_Top(NewImageTop);
                pVideoWindow->put_Width(NewImageWidth);
                pVideoWindow->put_Width(NewImageHeight);

                pVideoWindow->SetWindowPosition(NewImageLeft, NewImageTop, NewImageWidth, NewImageHeight);
            };

            //pVideoWindow->SetWindowForeground(OAFALSE);

            SAFE_RELEASE(pBasicVideo);
            
    }
    catch(...)
    {

    }
}


вторая проблема — сделал pVideoWindow->put_MessageDrain(AppHWND) но тоже не работает (сообщения не приходят)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.