Qt+DirectDraw实现

Qt一般是用来写界面,而当系统对图片绘制速度要求较高时,Qt自带的图像绘制引擎往往不能达到我们的要求,这个时候我们就需要更加底层的绘图API,如DiretDraw(DirectDraw已经很旧了,目前使用的是Direct3D)。
在DirectDraw中,可以使用如下函数,将绘制操作映射到指定的窗口:
// create IDirectDraw interface 7.0 object and test for error
if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpddIID_IDirectDraw7NULL)))
      return(0);

      // set cooperation to full screen
if (FAILED(lpdd->SetCooperativeLevel(m_pWnd->GetSafeHwnd(), DDSCL_NORMAL | DDSCL_NOWINDOWCHANGES)))
      return(0);
关于DirectDraw API的使用,可以参考《windows游戏编程大师技巧》第5-7章。

在MFC程序中,我们可以很容易的得到一个窗口的句柄pWnd,那如何在Qt程序获得Qt窗口(QWidget)的句柄呢?
很简单,直接调用winId()获得HWnd,然后通过FromHandle将HWnd转换成CWnd。
假设我们要在videoWidget(QWidget对象)上显示视频,调用如下代码即可。
m_ddraw = new MyDDraw(CWnd::FromHandle(videoWidget->winId()));

部分源代码

qtDDraw.cpp
QtDDraw::QtDDraw(QWidget *parent /* = 0 */Qt::WFlags flags /* = 0 */)
:QWidget(parentflags)
{
      setWindowTitle(tr("using DDraw in Qt"));
      videoWidget = new QWidget(this);
      videoWidget->setFixedSize(QSize(640,480));

      m_ddraw = new MyDDraw(CWnd::FromHandle(videoWidget->winId()));
      m_timer = new QTimer(this);
      connect(m_timerSIGNAL(timeout()), thisSLOT(refreshScreen()));
      m_timer->start(40);

      QVBoxLayout *layout = new QVBoxLayout;
      layout->setContentsMargins(0,0,0,0);
      layout->addWidget(videoWidget);

      setLayout(layout);
}

void QtDDraw::refreshScreen()
{           
      m_ddraw->Update_Screen();
      //m_timer->stop();
}


myDDraw.cpp
MyDDraw::MyDDraw(CWnd *cWnd) : m_pWnd(cWnd)
{
      Init_DDraw();
}

int MyDDraw::Update_Screen()
{
      RECT rc;
      m_pWnd->GetClientRect(&rc);
      m_pWnd->ClientToScreen(&rc);

      // copy background to back buffer
      DDraw_Draw_Surface(lpddsbackground,rc.left,rc.top,SCREEN_WIDTHSCREEN_HEIGHTrc.right-rc.leftrc.bottom-rc.toplpddsprimary,0);  

      return(1);

// end Update_Screen


项目工程文件:(VS008+Qt4.8)
http://download.csdn.net/detail/ajaxhe/4273871

若你是其他的Qt版本,编译时会出错(valid Qt version for platfom)


只需要修改项目解决方案的属性中的“Change Soluetion's Qt version”即可




运行结果:

你可能感兴趣的:(Qt,C/C++)