科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Visual C++.NET DirectShow编程

Visual C++.NET DirectShow编程

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

运用DirectShow我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据并进行相应的后期处理乃至存储到文件中

作者:sunjin007 来源:论坛 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
7.修改CPlayWndDlg::OnPaint(),由于现在视频显示区域必须由我们自己进行重画:

void CPlayWndDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // 用于绘制的设备上下文
  SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

  // 使图标在工作矩形中居中
  
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // 绘制图标

  dc.DrawIcon(x, y, m_hIcon);

 }
 else
 {
  if(m_isPlaying == FALSE)
  {
   CClientDC dc(GetDlgItem(IDC_VW_FRAME));
   dc.SetBkColor(RGB(0,0,0));
   CRect rc;
   GetDlgItem(IDC_VW_FRAME)->GetClientRect(rc);
 
   //ClientToScreen(rc);

   dc.FillRect(rc, CBrush::FromHandle((HBRUSH)GetStockObject(BLACK_BRUSH)));
   GetDlgItem(IDC_VW_FRAME)->Invalidate();
  }

  CDialog::OnPaint();
 }
}

  添加浏览、播放、暂停、关闭四按钮的相应事件响应函数,同时在CPlayWndDlg中添加如下四个私有方法:

void MoveVideoWindow(void);
void CleanUp(void);
BOOL Stop(void);
BOOL Play(void);

  上述方法的实现如下:

// IDC_VW_FRAME控件Picture Control主要作用是控制Vedio Window的显示位置
void CPlayWndDlg::MoveVideoWindow(void)
{
 IVideoWindow* pVideoWinow = NULL;
 if(m_pGraph)
 {
  m_pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVideoWinow);
  CRect rc;
  GetDlgItem(IDC_VW_FRAME)->GetWindowRect(rc);
  ScreenToClient(rc);
  pVideoWinow->SetWindowPosition(rc.left, rc.top, rc.Width(), rc.Height());
  pVideoWinow->Release();
  pVideoWinow = NULL;
 }
}

void CPlayWndDlg::CleanUp(void)
{
 long levCode;
 IVideoWindow *pVidWin = NULL;

 if(!m_pGraph)
  return;

 m_pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);
 m_pEvent->WaitForCompletion(INFINITE, &levCode);

 pVidWin->put_Visible(OAFALSE);
 pVidWin->Release();
 m_pMediaSeeking->Release();
 m_pMediaControl->Release();
 m_pEvent->Release();
 m_pGraph->Release();
 m_pMediaSeeking = NULL;
 m_pMediaControl = NULL;
 m_pEvent = NULL;
 m_pGraph = NULL;

 UpdateData(FALSE);
 CClientDC dc(GetDlgItem(IDC_VW_FRAME));
 dc.SetBkColor(RGB(0,0,0));

 CRect rc;

 GetDlgItem(IDC_VW_FRAME)->GetClientRect(rc);
 ClientToScreen(rc);
 dc.FillRect(rc, CBrush::FromHandle((HBRUSH)GetStockObject(BLACK_BRUSH)));
 Invalidate();
}

BOOL CPlayWndDlg::Stop(void)
{
 IVideoWindow *pVidWin = NULL;
 HRESULT hr;

 if(m_pMediaControl)
 {
  LONGLONG pos = 0;
  hr = m_pMediaControl->Stop();
  hr = m_pMediaSeeking->SetPositions(&pos, AM_SEEKING_AbsolutePositioning ,&pos, AM_SEEKING_NoPositioning);

  m_pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);
  pVidWin->put_Visible(OAFALSE);

  m_isPlaying = FALSE;
  GetDlgItem(IDC_PLAY_BUTTON)->EnableWindow(TRUE);
  GetDlgItem(IDC_PAUSE_BUTTON)->EnableWindow(FALSE);
  pVidWin->Release();
  long levCode;
  m_pEvent->WaitForCompletion(INFINITE, &levCode);
  m_pMediaControl->Release();

  return TRUE;
 }
 return FALSE;
}

BOOL CPlayWndDlg::Play(void)
{
 // 运行

 IVideoWindow *pVidWin = NULL;

 if(m_pGraph)
 {
  m_pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);
  pVidWin->put_Visible(OATRUE);
  m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);
  m_pMediaControl->Run();
  m_isPlaying = TRUE;
  GetDlgItem(IDC_PLAY_BUTTON)->EnableWindow(FALSE);
  GetDlgItem(IDC_PAUSE_BUTTON)->EnableWindow(TRUE);

  return TRUE;
 }
 return FALSE;
}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章