日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT中IDirect3DDevice9的Present方法失败情况的处理笔记

發布時間:2023/12/9 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT中IDirect3DDevice9的Present方法失败情况的处理笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這幾天在試著使用QT做編輯器,然后打算使用Irrlicht作為渲染引擎。結果在集成的時候遇到了問題。

使用了Irrlicht論壇里面有人提供的QIrrlichtWidget,結果什么都畫不出來。仔細跟蹤了一下,結果是IDirect3DDevice9的Present函數返回了E_FAIL。

查了下文檔,文檔只說是內部錯誤,沒有說具體會是什么原因造成的。網上找原因,按照大家說的使用D3D的debug模式,看到了如下的輸出信息:

Direct3D9: (ERROR) :GetClientRect Failed ?
Direct3D9: (ERROR) :GetClientRect Failed ?
Direct3D9: (ERROR) :BitBlt or StretchBlt failed in Present

有人遇到了類似的問題,是先銷毀窗口然后繼續使用Present函數就會這樣,于是我就懷疑到是不是窗口系統出了什么問題。

結果發現了,在創建device的時候獲得的winId(),竟然和Present的時候的winId()不同。

于是我懷疑,是我使用QT的窗口系統不當,初始化的時候獲得了跟顯示出Widget時不同的winId,導致最后Present失敗。

于是我使用了下列代碼做了實驗,代碼如下:

1 QApplication app(argc, argv);
2

3 MainWindow mainWin;
4

5 QVBoxLayout *layout = new QVBoxLayout();
6

7 QIrrlichtWidget* irrWidget = new QIrrlichtWidget();
8 QIrrlichtWidget* irrWidget1 = new
QIrrlichtWidget();
9

10 HWND id1 = irrWidget->winId();
11

12 layout->addWidget(irrWidget);
13 layout->
addWidget(irrWidget1);
14

15 //如果初始化代碼在這里,就會導致Present失敗,什么都繪制不出來
16 //
irrWidget->init();
17 //
irrWidget1->init();
18 //
setupIrrlicht( irrWidget->getIrrlichtDevice() );
19 //setupIrrlicht( irrWidget1->getIrrlichtDevice() );

20 ?
21 HWND id2 = irrWidget->winId();
22

23 mainWin.centralwidget->setLayout(layout);
24

25 //在這里winId()的返回值就不同了
26 ? HWND id3 = irrWidget->winId();
27

28 mainWin.resize(400,400);
29

30 HWND id4 = irrWidget->winId();
31

32 //在擁有了正確的winId之后,就可以初始化設備了
33 irrWidget->init();
34 irrWidget1->
init();
35

36 setupIrrlicht( irrWidget->getIrrlichtDevice() );
37 setupIrrlicht( irrWidget1->
getIrrlichtDevice() );
38

39 mainWin.show();
40

41 HWND id7 = irrWidget->winId();
42

43 return app.exec();

上述代碼將兩個QIrrlichtWidget垂直排列放到一個QVBoxLayout中,init方法就是初始化設備,setupIrrlicht是向場景中添加些繪制的元素,代碼都是參照

http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=15112&postdays=0&postorder=asc&highlight=qirrlichtwidget&start=0&sid=ce09058e811438f511b01b2449e2ba71?

來寫的。

上面的代碼,注釋中標記了什么時候winId改變了,以及錯誤的初始化位置。我沒有深入研究QT中winId相關的內容,只是知道了以后要在什么時候初始化,以防再次遇到這樣的問題。

特此記錄下來與大家分享。

轉載于:https://www.cnblogs.com/baixiaohu/archive/2011/02/28/1967540.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的QT中IDirect3DDevice9的Present方法失败情况的处理笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。