DirectXを使用してのウインドウサイズ変更後の描画領域の再設定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ゴンマサ

DirectXを使用してのウインドウサイズ変更後の描画領域の再設定

#1

投稿記事 by ゴンマサ » 9年前

お世話になっております。今回も知恵を貸していただけたらと思い投稿させていただきました。
稚拙な質問ですが宜しくお願いいたします。

前回の質問でDirectXを使用するよう助言を頂き、
ネットで見つけたコードを自分なりに直してみましたが、
結果としては、クライアント領域が変更されることはありませんでした。



そこで質問させていただきたいのですが、

まずDirectXを使用できるようにし、"d3d9.h"をインクルードしようとしたところ、
"DxDirectX.h"というものがあることに気がつきました。
結果として今回のコードは"d3d9.h"ではなく、"DxDirectX.h"を使用しているのですが、
これは"d3d9.h"とは何が違うのでしょうか。
そもそも私の書いたコードはDirectXの要素を新たに取り入れる事が出来ているのでしょうか。


次に、クライアント領域の変更はウインドウプロシージャ内で行うものだと思うのですか、
今のところ、ウインドウのサイズを変更する方法を検索すると、
ウインドウのクラスを設定するといった始めの部分の説明ばかりで、
一度表示されたウインドウのクライアント領域の描画範囲を再度変更する方法が見つかりません。
お手数ですが、使用する関数や、詳細が書かれたサイトなどがありましたら、教えていただきたく思います。


以下は、前回の質問の内容、参考にさせて頂いたコードのあるサイト、
そしてそれらを自分なりに混ぜたコードになります。
自作のコードの内容はウインドウに小さな四角を描画し、
それを動かして描画範囲を確認するというものです。

プロシージャのWM_SIZINGに書かれたリサイズの関数は
いずれも効果がないようでしたので、以下の記述では無効にしてあります。




前回の質問
http://dixq.net/forum/viewtopic.php?f=3&t=17383
参考にしたコード
http://www36.atwiki.jp/directx/pages/13.html

自作コード

コード:

#include "DxDirectX.h"
#include "DxLib.h"
//#include "d3d9.h"
#define SAFE_RELEASE(p) {if(p){(p)->Release();(p)=NULL;}}//安全に解放する

int box1x;
int box1y ;
#define idoukyori 8

int wide,high;
RECT Client;

//各ボックスの初期座標
void BoxPosition()
{
	box1x = 0;
	box1y = 0;
}

void drawboxs()
{
	DrawBox(box1x,box1y,box1x+32,box1y+32,GetColor(255,32,32),TRUE);
}

void Boxact()
{
	//左上
	if((CheckHitKey(KEY_INPUT_UP)== 1)
		&&(CheckHitKey(KEY_INPUT_LEFT)== 1))
	{
		box1y=box1y - idoukyori;
		box1x=box1x - idoukyori;	
	}
	//左下
	else if((CheckHitKey(KEY_INPUT_DOWN)== 1)
		&&(CheckHitKey(KEY_INPUT_LEFT)== 1))
	{
		box1y=box1y + idoukyori;
		box1x=box1x - idoukyori;
	}
	//右上
	else if((CheckHitKey(KEY_INPUT_UP)== 1)
		&&(CheckHitKey(KEY_INPUT_RIGHT)== 1))
	{
		box1y=box1y - idoukyori;
		box1x=box1x + idoukyori;
	}
	//右下
	else if((CheckHitKey(KEY_INPUT_DOWN)== 1)
		&&(CheckHitKey(KEY_INPUT_RIGHT)== 1))
	{
		box1y=box1y + idoukyori;
		box1x=box1x + idoukyori;
	}
	else if(CheckHitKey(KEY_INPUT_UP)== 1)
	{
		box1y=box1y - idoukyori;
	}
	else if(CheckHitKey(KEY_INPUT_DOWN)== 1)
	{
		box1y=box1y + idoukyori;
	}
	else if(CheckHitKey(KEY_INPUT_LEFT)== 1)
	{
		box1x=box1x - idoukyori;
	}
	else if(CheckHitKey(KEY_INPUT_RIGHT)== 1)
	{
		box1x=box1x + idoukyori;
	}
}

//メッセージプロシージャ
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
	HDC hdc;//デバイスコンテキスト
	PAINTSTRUCT ps;

    switch( msg )
    {
        case WM_DESTROY://終了時
            PostQuitMessage(0);
            return 0;

        case WM_PAINT://ウインドウ描画時
			hdc = BeginPaint (hWnd,&ps);
			EndPaint(hWnd,&ps);
			
			InvalidateRect(hWnd,NULL,TRUE);
            ValidateRect( hWnd, NULL );
            return 0;

		case WM_SIZING:
			//		case WM_SIZE:
			//OnSize(SIZE_RESTORED , 100, 100);
			GetClientRect(hWnd, &Client );	//クライアント領域を調べる

			wide   =(Client.right - Client.left);
			high  =(Client.bottom - Client.top);
			//SetViewport(0, 0, 640, 480);
	
			//SetWindowPosを記述した結果、白い枠が出なくなった
			/*
			AdjustWindowRectEx(&Client,WS_OVERLAPPEDWINDOW,FALSE,0);
			SetWindowPos(hWnd,NULL,0,0,wide,high,SWP_NOMOVE|SWP_NOZORDER);*/
			//MoveWindow(hWnd,Client.left,Client.top,wide,high,TRUE);
			break;

    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}


//メイン関数
INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )
{
	wide = 640;
	high = 480;

    //ウインドウクラスの登録に関する記述
	//ウインドウクラスの情報の設定
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      "Window1", NULL };
    RegisterClassEx( &wc );//ウインドウクラスの登録

	//タイトルバーとウインドウ枠の分を含めてウインドウサイズを設定
	RECT rect;
	SetRect(&rect,0,0,wide,high);
	AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE);
	rect.right=rect.right-rect.left;
	rect.bottom=rect.bottom-rect.top;
	rect.top=0;
	rect.left=0;

    //ウインドウの生成
    HWND hWnd = CreateWindow( "Window1", "Hello DirectX9 World !!",
    WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rect.right, rect.bottom,
                              NULL, NULL, wc.hInstance, NULL );

	MSG msg;

    //ウインドウ初期化
    ShowWindow(hWnd,SW_SHOWDEFAULT);
    UpdateWindow(hWnd);//ウインドウの更新
	BoxPosition();//ボックスの座標指定


	//上記で設定された内容のウインドウを使用する
	SetUserWindow( hWnd ) ;//これがないと全画面になる



//*****************************ここからDXライブラリ


	if( DxLib_Init() == -1 )//この記述以降でなければdxライブラリの関数は作動しない
	{
		return -1;
	}

	while (CheckHitKey(KEY_INPUT_ESCAPE)==0)//()内は継続条件
	{
		// エラーが起きたらループを抜ける
		if( ProcessMessage() == -1 ){break ;}
		ClearDrawScreen();
		SetDrawScreen( DX_SCREEN_BACK );
		//ウインドウプロシージャへの命令
		if(PeekMessage (&msg,NULL,0,0,PM_NOREMOVE))
		{
			if (!GetMessage (&msg,NULL,0,0))
			return msg.wParam ;
			TranslateMessage(&msg);//メッセージを変換しDispatchMessageに渡す
			DispatchMessage(&msg);//変換されたメッセージをプロシージャへ送る
		}

		Boxact();//ボックスの移動
		drawboxs();//ボックスの描画
		ScreenFlip();
	}
	DxLib_End() ;

    UnregisterClass("Window1",wc.hInstance);
    return 0;
}



以上になります。
宜しくお願いいたします。

ゴンマサ

Re: DirectXを使用してのウインドウサイズ変更後の描画領域の再設定

#2

投稿記事 by ゴンマサ » 9年前

自己解決しました。
質問を御覧になっていただいた皆様、ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る