質問者
Vista上のAcitveXコントロールでのDirectX9利用の描画

質問
-
VC++ 6.0 と DirectX9.0b にてAcitveXコントロールを作成しています。
OnDraw 関数にて下記のように描画処理を行っています(主要部分のみ抜粋)。
このコントロールを WindowsXP上で実行した場合には正しく描画されますが、
WindowsVista上で実行した場合には、正しく描画されません。
(表示領域が真っ黒になったり、ディスプレイドライバが停止したりします)対応方法などお分かりになりましたら、お教えください。
よろしくお願いいたします。void CXXXCtrl:: OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) {
LPDIRECT3DSURFACE9 pSuf = NULL;
HDC hdc = pdc->GetSafeHdc();
hr = m_pd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSuf);
hr = pSuf->GetDC(&hdc);hr = Render();
hr = pSuf->ReleaseDC(hdc);
m_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
すべての返信
-
Releaseはされていましたか、失礼しました。
現状のコードだと、経験豊富と言えない私では手に負えません。
他のPC(異なるハード構成)でも同様に問題が起きるのかどうかも含めて検証をしてみてはいかがでしょうか。
TADAPOM さんからの引用 HDC hdc = pdc->GetSafeHdc();
hr = m_pd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSuf);
hr = pSuf->GetDC(&hdc);あと、気になったのですが、GetSafeHdcで取得したHDCって使われてないですよね…。
IDirect3DSurface9::GetDCはout、つまりそこに入っている値は気にしないということとなっているので。
-
Azuleanさん、ご返信ありがとうございました。
他のPCを借りて調査してみたところ、下記のような現象が見られました。
1) グラフィックカードを搭載しない環境(Windows Vista Ultimate 32bit)
Present関数 → S_OK を返す
2) nVidia系のグラフィックカードを搭載する環境(Windows Vista Ultimate 32bit)
Present関数 → 0xC0262111 を返す
DXGetErrorString9 では "Unknown" とのこと。
2) のリターンコードが手がかりになる気がするのですが、
調べてもよく分かりませんでした。。。
> あと、気になったのですが、GetSafeHdcで取得したHDCって使われてないですよね…。
> IDirect3DSurface9::GetDCはout、つまりそこに入っている値は気にしないということとなっているので。
なるほど。。。ご指摘の通りです。ありがとうございます。
-
TADAPOM さんからの引用 2) nVidia系のグラフィックカードを搭載する環境(Windows Vista Ultimate 32bit)
Present関数 → 0xC0262111 を返す
DXGetErrorString9 では "Unknown" とのこと。
http://msdn.microsoft.com/en-us/library/cc231198.aspx
ERROR_GRAPHICS_CANT_RENDER_LOCKED_ALLOCATIONらしいです。
文章を読む限り、「ロックされた領域は使用(レンダリング)できません」と見えましたが、ロジック中にロックの解放ができていないとかあるんでしょうか?(抜粋コードに本体部分がないので判断しかねます)