#ifndef MY_FRAME__HH__
#define MY_FRAME__HH__
#include <QtGui/QWidget>
struct IDirect3D9;
struct IDirect3DDevice9;
class QD3DWidget : public QWidget
{
Q_OBJECT
public:
QD3DWidget( QWidget* pParent = NULL);
~QD3DWidget();
QSizePolicy sizePolicy() const { return QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); }
QPaintEngine *paintEngine() const { return NULL; }
protected:
void Setup();
void Close();
void paintEvent( QPaintEvent* pEvent);
private:
IDirect3D9* mD3D;
IDirect3DDevice9* mDevice;
};
#endif
#include <QMessageBox>
#define WIN32_LEAN_AND_MEAN
#include <d3d9.h>
#include <d3dx9.h>
#include "MyFrame.h"
#pragma comment(lib, "d3dx9d.lib")
#pragma comment(lib, "d3d9.lib")
QD3DWidget::QD3DWidget( QWidget* pParent)
: QWidget( pParent)
{
mD3D = NULL;
mDevice = NULL;
setMinimumSize( 400, 400);
setAttribute( Qt::WA_OpaquePaintEvent, true);
setAttribute( Qt::WA_PaintOnScreen, true);
Setup();
}
QD3DWidget::~QD3DWidget()
{
Close();
}
void QD3DWidget::Setup()
{
HWND windowHandle = winId();
mD3D = Direct3DCreate9( D3D_SDK_VERSION);
if( NULL == mD3D)
QMessageBox::critical(this,
"ERROR",
"Failed to create D3D object",
QMessageBox::Ok);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = windowHandle;
HRESULT hr = mD3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
windowHandle,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&mDevice);
if( FAILED( hr))
QMessageBox::critical(this,
"ERROR",
"Failed to create D3D device",
QMessageBox::Ok);
}
void QD3DWidget::Close()
{
if( mDevice)
mDevice->Release();
if( mD3D)
mD3D->Release();
}
void QD3DWidget::paintEvent( QPaintEvent* pEvent)
{
HRESULT hr = mDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(100, 0, 0), 1.0f, 0);
if( FAILED( hr))
QMessageBox::critical(this,
"ERROR",
"Failed to clear backbuffer.",
QMessageBox::Ok);
mDevice->BeginScene();
mDevice->EndScene();
hr = mDevice->Present(NULL, NULL, NULL, NULL);
if( FAILED( hr))
QMessageBox::critical(this,
"ERROR",
"Failed to Present().",
QMessageBox::Ok);
update();
}