// Create the main window. The WS_CLIPCHILDREN style is required. ghApp = CreateWindow(CLASSNAME, APPLICATIONNAME, WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, DEFAULT_VIDEO_WIDTH, DEFAULT_VIDEO_HEIGHT, 0, 0, hIns, 0); if(ghApp) { // Create DirectShow graph and start capturing video hr = CaptureVideo(); if (FAILED (hr)) { CloseInterfaces(); ::DestroyWindow(ghApp); } else { // Don't display the main window until the DirectShow // preview graph has been created. Once video data is // being received and processed, the window will appear // and immediately have useful video data to display. // Otherwise, it will be black until video data arrives. ::SetWindowPos(hWnd,HWND_BOTTOM,rc.left,rc.top,rc.Width(),rc.Height (),SWP_DRAWFRAME); ::ShowWindow(ghApp, TRUE); } while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return hr; }2.回调函数 LRESULT CALLBACK WndMainProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { CShowTool sst; switch (message) { case WM_GRAPHNOTIFY: sst.HandleGraphEvent(); break; case WM_SIZE: sst.ResizeVideoWindow(); break; case WM_WINDOWPOSCHANGED: sst.ChangePreviewState(! (::IsIconic(hwnd))); break; case WM_CLOSE: // Hide the main window while the graph is destroyed ::ShowWindow(sst.ghApp, SW_HIDE); sst.CloseInterfaces(); // Stop capturing and release interfaces break; case WM_DESTROY: PostQuitMessage(0); return 0; } // Pass this message to the video window for notification of system changes if (sst.g_pVW) sst.g_pVW->NotifyOwnerMessage((long) hwnd, message, wParam, lParam); return ::DefWindowProc (hwnd , message, wParam, lParam); }
主要看你要完成什么功能
我现在已经用DShow做了一个程序,能够接受服务器端组播过来的视频流并播放之。
现在的问题是我想把它转为一个ActiveX控件,以便嵌套在web中,
请各位大虾指点迷津。若能提供样例源码更好。
我准备了300分。
问题如下:
做一个对话框的activex控件,如果在上面放置普通控件如edit等,没有问题。
但如果“insert activex control”,插入media player控件。则测试时报错“debug assertion failed”。对话框无法显示。
不知何故。
剩下的工作量是移植你的代码,内容并不太多
或许是小弟愚鲁,创建成功的视频播放窗口却不能接收到视频流,望不吝赐教。1.创建窗口函数
HRESULT CShowTool::StartShow(HWND hWnd,CRect rc)
{
MSG msg={0};
HRESULT hr;
WNDCLASS wc;
HINSTANCE hIns;
// Initialize COM
if( FAILED( CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
{
Msg(TEXT("CoInitialize Failed!\r\n"));
exit(1);
}
//注册网络传输组件dsnet.ax
LPTSTR ComName=_T("dsnet.ax");
BOOL bRet=RegisterCom(ComName);
if(!bRet)
{
Msg(TEXT("注册网络传输组件失败!\r\n"));
exit(1);
}
hIns=::AfxGetInstanceHandle();
// Register the window class
ZeroMemory(&wc, sizeof wc);
wc.lpfnWndProc = WndMainProc;
wc.hInstance = hIns;
wc.lpszClassName = CLASSNAME;
wc.lpszMenuName = NULL;
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(hIns, MAKEINTRESOURCE(IDI_VIDPREVIEW));
if(!RegisterClass(&wc))
{
Msg(TEXT("RegisterClass Failed! Error=0x%x\r\n"), GetLastError());
CoUninitialize();
return E_FAIL;
}
// Create the main window. The WS_CLIPCHILDREN style is required.
ghApp = CreateWindow(CLASSNAME, APPLICATIONNAME,
WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_CLIPCHILDREN,
CW_USEDEFAULT, CW_USEDEFAULT,
DEFAULT_VIDEO_WIDTH, DEFAULT_VIDEO_HEIGHT,
0, 0, hIns, 0); if(ghApp)
{ // Create DirectShow graph and start capturing video
hr = CaptureVideo();
if (FAILED (hr))
{
CloseInterfaces();
::DestroyWindow(ghApp);
}
else
{
// Don't display the main window until the DirectShow
// preview graph has been created. Once video data is
// being received and processed, the window will appear
// and immediately have useful video data to display.
// Otherwise, it will be black until video data arrives.
::SetWindowPos(hWnd,HWND_BOTTOM,rc.left,rc.top,rc.Width(),rc.Height (),SWP_DRAWFRAME);
::ShowWindow(ghApp, TRUE);
} while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return hr;
}2.回调函数
LRESULT CALLBACK WndMainProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
CShowTool sst;
switch (message)
{
case WM_GRAPHNOTIFY:
sst.HandleGraphEvent();
break; case WM_SIZE:
sst.ResizeVideoWindow();
break; case WM_WINDOWPOSCHANGED:
sst.ChangePreviewState(! (::IsIconic(hwnd)));
break; case WM_CLOSE:
// Hide the main window while the graph is destroyed
::ShowWindow(sst.ghApp, SW_HIDE);
sst.CloseInterfaces(); // Stop capturing and release interfaces
break; case WM_DESTROY:
PostQuitMessage(0);
return 0;
} // Pass this message to the video window for notification of system changes
if (sst.g_pVW)
sst.g_pVW->NotifyOwnerMessage((long) hwnd, message, wParam, lParam); return ::DefWindowProc (hwnd , message, wParam, lParam);
}