пишу 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>>