код виджета следующий:
C++ (Qt)
#ifndef _D3D_WIDGET_H_
#define _D3D_WIDGET_H_
#include <QtGui/QWidget>
#include <d3d9.h>
#pragma comment(lib, "d3d9.lib")
class d3d_widget: public QWidget{
Q_OBJECT
private:
IDirect3D9* m_pD3D;
IDirect3DDevice9* m_pD3DDevice;
public:
d3d_widget(QWidget* _parent);
~d3d_widget();
bool init_d3d(HWND _wnd);
public slots:
bool render();
private:
void paintEvent(QPaintEvent* pEvent);
QPaintEngine* paintEngine();
};
#endif
#include "d3d_widget.h"
d3d_widget::d3d_widget(QWidget* _parent): QWidget(_parent){
setAttribute(Qt::WA_OpaquePaintEvent, true);
setAttribute(Qt::WA_NoSystemBackground, true);
setAttribute(Qt::WA_PaintOnScreen, true);
}
d3d_widget::~d3d_widget(){
}
bool d3d_widget::init_d3d(HWND _wnd){
m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(!m_pD3D)
return false;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = true;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
HRESULT hrResult = m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, _wnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &m_pD3DDevice);
if (FAILED(hrResult)){
return false;
}
return true;
}
bool d3d_widget::render(){
if(m_pD3DDevice == 0)
return false;
m_pD3DDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255, 0, 0), 1.0f, 0);
if(SUCCEEDED(m_pD3DDevice->BeginScene()))
m_pD3DDevice->EndScene();
m_pD3DDevice->Present(0, 0, 0, 0);
return true;
}
void d3d_widget::paintEvent(QPaintEvent* pEvent){
Q_UNUSED(pEvent);
render();
}
QPaintEngine* d3d_widget::paintEngine(){
return 0;
}
при запуске приложения, вместо жёлтого цвета, которым я очищаю буферы, виден стандартный цвет окна qt, причём при репэинте происходит мигание, тоесть сначала отображается буфер директ 3д, а затем qt его затирает, кто нибудь знает, как решить проблему?
Чего-то с установкой атрибутов.
Qt::WA_PaintOnScreen - ... Note: This flag is only supported on X11 and it disables double buffering. ...
Ups - извиняйте, влез в тему не разобравшись - как оказалось для D3D только так и делают