Замучался с отображением видео
От: sureec  
Дата: 30.07.03 16:56
Оценка:
В общем сделал стандартную вещь
Написал класс производный от CWnd и IVideoWindow::put_Owner поставил на этот
компонент
создал граф и отрендерил видео
но вывод видео пока не сдвинешь окна или не изменишь его размеры вообще не идет
(судя по звуку файл играется)
Полбеды — попытался вызывать IMediaControl::Stop или Pause как то помогает
но в ВыньХР ничего не помогает
обязательно надо сдвинуть.
Подскажите плз. Замучился.
Да и еще кстати при наведении на окно где показывется видео меняется курсор.
Как все эти штуки исправить?
Re: Замучался с отображением видео
От: Sergey A. Sablin Россия http://www.elecard.com
Дата: 31.07.03 05:28
Оценка:
Здравствуйте, sureec, Вы писали:

S>В общем сделал стандартную вещь

S>Написал класс производный от CWnd и IVideoWindow::put_Owner поставил на этот
S>компонент
S>создал граф и отрендерил видео
S>но вывод видео пока не сдвинешь окна или не изменишь его размеры вообще не идет
S>(судя по звуку файл играется)
S>Полбеды — попытался вызывать IMediaControl::Stop или Pause как то помогает
S>но в ВыньХР ничего не помогает
S>обязательно надо сдвинуть.
S>Подскажите плз. Замучился.
S>Да и еще кстати при наведении на окно где показывется видео меняется курсор.
S>Как все эти штуки исправить?

Курсор ты никак не изменишь, имхо, в момент наведения его на видео окно в оверлей режиме его рисует видюха своими средствами.
Можно только убрать его через IVideoWindow::HideCursor. Насчет окна попробуй put_Visible.
Сергей.
Re: Замучался с отображением видео
От: Alexmoon Украина  
Дата: 31.07.03 05:44
Оценка:
Здравствуйте, sureec, Вы писали:

S>В общем сделал стандартную вещь

S>Написал класс производный от CWnd и IVideoWindow::put_Owner поставил на этот
S>компонент
S>создал граф и отрендерил видео
S>но вывод видео пока не сдвинешь окна или не изменишь его размеры вообще не идет
S>(судя по звуку файл играется)
сделай такую последовательность действий

//назначь owner
IVideoWindow::put_Owner((OAHWND)hWndOwner));
//чтобы не перерисовывать перекрытые пользовательским интерфейсом части и выставить стиль дочернее от owner
IVideoWindow::put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
//размести свое video window в клиентской области экземпляра CWnd
IVideoWindow::SetWindowPosition(rect.left, rect.top, rect.right, rect.bottom);
//ну и дать фокус окну owner
SetFocus(hWndApp);

естественно код не привязан к конкретным объектам.

тут может быть несколько причин, а решить как мне заочно представляется можно следующей последовательностью действий приведенной выше или возможно даже некоторые из пунктов можно упустить, но по идее должно работать. Если бы ты привел некоторую интересующую часть кода, то возможно можно было бы дать более точный ответ.

S>Полбеды — попытался вызывать IMediaControl::Stop или Pause как то помогает

S>но в ВыньХР ничего не помогает
S>обязательно надо сдвинуть.
Если при здвижке все становится на свои места, то это скорее говорит о том, что только после этого происходит обновление отношений между ownerom и vieo window. После этих изменений обязательно нужно обновить фрейм главного окна или SetWindowPos или SetForegroundWindow для video window. Ты меняешь статус video window поэтому будь добр обнови состояния обоих фреймов или позаботься о соответствующем Z порядке и позиции.

S>Подскажите плз. Замучился.

S>Да и еще кстати при наведении на окно где показывется видео меняется курсор.
S>Как все эти штуки исправить?
У тебя о video window известно все, даже HWND. Способов несколько.
Вообще начнем с того зачем тебе курсор над областью вывода видео samplov. Он там только мигание создает.
Во-вторых, можно попытаться изменить классу окна video window, курсор по умолчанию.
Можно при этом еще вызвать метод put_MessageDrain с передачей дескриптора owner и все сообщения пользовательского IO будут в очереди ownera при движении курсора над областью окна. Тут тебе метод SetCursor обеспечит полныйкомплекс удовольствий.

Удачи.
Re[2]: Замучался с отображением видео
От: sureec  
Дата: 31.07.03 19:54
Оценка:
Здравствуйте, Alexmoon, Вы писали:

A>
A>//назначь owner
A>IVideoWindow::put_Owner((OAHWND)hWndOwner));
A>//чтобы не перерисовывать перекрытые пользовательским интерфейсом части и выставить стиль дочернее от owner
A>IVideoWindow::put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
A>//размести свое video window в клиентской области экземпляра CWnd
A>IVideoWindow::SetWindowPosition(rect.left, rect.top, rect.right, rect.bottom);
A>//ну и дать фокус окну owner
A>SetFocus(hWndApp);
A>

A>естественно код не привязан к конкретным объектам.

A>тут может быть несколько причин, а решить как мне заочно представляется можно следующей последовательностью действий приведенной выше или возможно даже некоторые из пунктов можно упустить, но по идее должно работать. Если бы ты привел некоторую интересующую часть кода, то возможно можно было бы дать более точный ответ.

A>Если при здвижке все становится на свои места, то это скорее говорит о том, что только после этого происходит обновление отношений между ownerom и vieo window. После этих изменений обязательно нужно обновить фрейм главного окна или SetWindowPos или SetForegroundWindow для video window. Ты меняешь статус video window поэтому будь добр обнови состояния обоих фреймов или позаботься о соответствующем Z порядке и позиции.

A>У тебя о video window известно все, даже HWND. Способов несколько.

A>Вообще начнем с того зачем тебе курсор над областью вывода видео samplov. Он там только мигание создает.
A>Во-вторых, можно попытаться изменить классу окна video window, курсор по умолчанию.
A>Можно при этом еще вызвать метод put_MessageDrain с передачей дескриптора owner и все сообщения пользовательского IO будут в очереди ownera при движении курсора над областью окна. Тут тебе метод SetCursor обеспечит полныйкомплекс удовольствий.

A>Удачи.


Вот код который я я писал (он очень похож на указаный тобой)

IGraphBuilder *pGB;
IMediaSeeking *pMS;
IBasicVideo *pBV;
IBasicAudio *pBA;
IVideoWindow *pVW;
IMediaControl *pMC;
IMediaEventEx *pME;


USES_CONVERSION;
CA2W lpcwFileName(lpcFileName);
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGB);

pGB->RenderFile(lpcwFileName, NULL);

pGB->QueryInterface(IID_IMediaControl, (void **)&pMC);
pGB->QueryInterface(IID_IMediaEventEx, (void **)&pME);
pGB->QueryInterface(IID_IMediaSeeking, (void **)&pMS);
pGB->QueryInterface(IID_IVideoWindow, (void **)&pVW);
pGB->QueryInterface(IID_IBasicVideo, (void **)&pBV);
pGB->QueryInterface(IID_IBasicAudio, (void **)&pBA);

pME->SetNotifyWindow((OAHWND)this->GetSafeHwnd(),WM_PLAYERMSG,0);


pVW->put_Owner(m_pParent));

pVW->put_WindowStyle(this->GetStyle());
SetForegroundWindow();

Так вот симптомы то вот какие
Если просто загрузить файл все появляется — если кликнуть по меню — остается от него белое пятно
опять же помогает только сдвиг или ресайзинг
С чем это может быть связано?
Кстати может ли это зависеть от того что я унаследовал класс фактически от CStatic
вот код
if (CWnd::Create(_T("STATIC"), _T(""),WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,
CRect(0,0,0,0), pParent,WM_USER + 0x10))
{
.......
}
Re[3]: Замучался с отображением видео
От: Alexmoon Украина  
Дата: 01.08.03 06:53
Оценка:
Здравствуйте, sureec, Вы писали:

S>Так вот симптомы то вот какие

S>Если просто загрузить файл все появляется — если кликнуть по меню — остается от него белое пятно
S>опять же помогает только сдвиг или ресайзинг
S>С чем это может быть связано?
S>Кстати может ли это зависеть от того что я унаследовал класс фактически от CStatic
S>вот код
S> if (CWnd::Create(_T("STATIC"), _T(""),WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,
S> CRect(0,0,0,0), pParent,WM_USER + 0x10))
S> {
S> .......
S> }

тут общими советами не обойдешся. причина в принципе в простом, но чтобы быть более корректным, то напомни мне иерархию твоих окон относительно video window и с их стилями.
Re[4]: Замучался с отображением видео
От: sureec  
Дата: 01.08.03 14:42
Оценка:
Здравствуйте, Alexmoon, Вы писали:

A>Здравствуйте, sureec, Вы писали:


S>>Так вот симптомы то вот какие

S>>Если просто загрузить файл все появляется — если кликнуть по меню — остается от него белое пятно
S>>опять же помогает только сдвиг или ресайзинг
S>>С чем это может быть связано?
S>>Кстати может ли это зависеть от того что я унаследовал класс фактически от CStatic
S>>вот код
S>> if (CWnd::Create(_T("STATIC"), _T(""),WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,
S>> CRect(0,0,0,0), pParent,WM_USER + 0x10))
S>> {
S>> .......
S>> }

A>тут общими советами не обойдешся. причина в принципе в простом, но чтобы быть более корректным, то напомни мне иерархию твоих окон относительно video window и с их стилями.



Вот код которым я инициализирую и показываю видео окно
До этого создание основного компонента и на него присваивание владельца видео окна

pBV = IBasicVideo
pVW = IVideoWindow

pVW->put_Owner(m_pParent);

SetForegroundWindow();
if (!pBV)
return E_FAIL;
LONG lHeight, lWidth;
pBV->GetVideoSize(&lWidth, &lHeight);
VERIFY(lWidth);
VERIFY(lHeight);
pVW->SetWindowPosition(rect.left,rect.top,rect.Width(),rect.Height());
pVW->put_BorderColor(COLORREF(0));
pVW->put_WindowStyle(WS_VISIBLE|WS_CHILD|WS_BORDER);


Может быть где то неправильный порядок вызова методов?
Re[5]: Замучался с отображением видео
От: Alexmoon Украина  
Дата: 02.08.03 08:42
Оценка:
Здравствуйте, sureec, Вы писали:

можешь сокращения не разворачивать я все прекрасно понимаю.
естественно начиная с первого и по мере того как будет не помагать.

1. Попробуй после всей инициализации вызвать
pVW->SetForegroundWindow(-1);


2. Я всей твоей иерархии окон не знаю, поэтому предложу попробовать убрать статику стили WS_CLIPSIBLINGS. Что обозначает прочтешь в хелпе. Думаю вполне возможно. Если будет принципиально непонятно то попытаюсь объяснить. Если прочтешь хелп, то яснее станет. Это предположение. Не на чем делать эксперимент и поэтому попробуешь сам.

3. Если не получится, то будем думать дальше. Во всяком случае я почему то почти уверен в том, что это связано в большей степени со статиком.

Удачи.
Re[6]: Замучался с отображением видео
От: Аноним  
Дата: 18.01.05 17:51
Оценка:
У меня тоже сначала не работала, но пото я переставил настройку стилей и установку владельца и все стало ОК!
Мой код:
if (result)
result = SUCCEEDED(m_pGraph->RenderFile(lpcFile, NULL));
if (result)
result = SUCCEEDED(m_pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN));
if (result)
result = SUCCEEDED(m_pVideoWindow->put_Owner((OAHWND)m_hWnd));
if (result) {
RECT rc; GetClientRect(&rc);
result = SUCCEEDED(m_pVideoWindow->SetWindowPosition(rc.left, rc.top, rc.right — rc.left, rc.bottom — rc.top));
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.