突然ですが、DirectX9について質問させて頂きます。
突然ですが、DirectX9について質問させて頂きます。
ウィンドウモードとフルスクリーンモードを切り替える
プログラムを組んでいますが、なぜか、フルスクリーンモード
からウィンドウモードに復帰すると画面サイズが変化してしまいます。
以下がその問題となる関数です。
void SetWindowStyle( HWND hWnd, bool g_WindowMode )
{
if( g_WindowMode )
{
SetWindowLong( hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_VISIBLE );
MoveWindow( hWnd, 0, 0, 0, 0, false );
SetClientSize( hWnd, WINDOW_WIDTH, WINDOW_HEIGHT ); // 以下に記載
}
else
{
SetWindowLong( hWnd, GWL_STYLE, WS_POPUP | WS_VISIBLE );
MoveWindow( hWnd, 0, 0, 800, 600, true );
}
}
以下はウィンドウのサイズを再設定する関数です。
void SetClientSize( HWND hWnd, int width, int height )
{
RECT wnd_Rect, clt_Rect;
int WindowSize_Width, WindowSize_Height;
GetWindowRect( hWnd, &wnd_Rect );
GetClientRect( hWnd, &clt_Rect );
// ウィンドウのサイズを求める
WindowSize_Width = ( wnd_Rect.right - 1 ) - ( wnd_Rect.left - 1 );
WindowSize_Height = ( wnd_Rect.bottom - 1 ) - ( wnd_Rect.top - 1 );
// ウィンドウのサイズを変更
MoveWindow( hWnd,
wnd_Rect.left,
wnd_Rect.top,
width + (WindowSize_Width-clt_Rect.right),
height + (WindowSize_Height-clt_Rect.bottom),
true
);
}
SetClientSize関数はアプリ起動時に一度実行され、800x600に変更されます。
この時点では問題はありません。
しかし、フルスクリーンモード→ウィンドウモードと切り替えると、
800x576と値がおかしくなります。
結果的に800x600になる予定だったのですが…。
同じ関数を使用しているのに、なぜサイズが変化してしまうのでしょう?
どなたかこの問題を解決する方法をご存知ないでしょうか?
よろしくお願いします。
お礼
お返事遅くなって申し訳ありません。 丁寧な回答ありがとうございます。 >同じNovember 2008でもDirectX9系と10系があります。 >まずどちらを利用しているか書いた方が良いでしょう。 そうですよね。すっかり、抜けてました。 私はDirectX9系を使っています。 >DirectX9なら >SampleにあるTutorialが参考になるでしょう。 ・・・サンプルがあるのは知っていたのですが・・・、 C:\Program Files\Microsoft DirectX SDK (November 2008)\Samples\C++\Direct3D で止まってました・・・。 こんな、シンプルなサンプルがあったんですね。 とりあえず、いくつか読もうとしたサンプルはあるんですが、 サンプルのくせに、既に、すごくて・・・、フレームワークは良く分からないし・・・・。 いや、これは、本当に助かります。 とりあえず、読んでみます。 一応、三角形を表示できるようにはなりました。 問題はデバイス作成だとかではなく、頂点宣言の方法に問題があったようです。 ただ、 「柔軟な頂点フォーマットを(FVF)を使う方法」と 「頂点宣言オブジェクトを作る方法」のうち、前者でしか、描画できていません。 書けたから、問題は解決したと言えばしたのですが、私の読んでいる参考書には前者では、「DirectX9.0の機能の一部を使えない」とあるですが、具体的にどう違うのかには、全く、触れられていません。 もし、お時間があるのなら、 ・「両者の違い」 ・「どちらを使うべきか?」 について教えていただけないでしょうか? 参考サイトや書籍でも構いません。 sha-girlさんには、既に、十分な回答をいただいているので、 sha-girlさんさえ良ければ、別スレッドを立てさせて頂きます。 あと、時間の都合が合わない場合を考えて、 8/2までに返答が無かった時点で、こちらの点数を付与します。 ありがとうございました!!