ウインドウサイズ変更後のクライアント領域のサイズについて

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

ウインドウサイズ変更後のクライアント領域のサイズについて

#1

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

お世話になっております。
また皆様のご意見をいただきたいと思います。
よろしくお願いいたします。

今回はウインドウサイズ変更後のクライアント領域のリサイズについてです。
現在、ウインドウのサイズを変更することはできたのですが、クライアント領域は変更されないため、
ウインドウを大きくしても画像が途切れたままになってしまいます。
SetGraphModeを使用してみましたが、画像などの登録データがリセットされてしまいます。
また、使用後に画像データをを再度読み込んでも、画面が激しくちらついてしまいます。
SetWindowPosも試してみたのですが、こちらも同様にクライアント領域は更新されませんでした。



以下に掲載してあるコードではウインドウのリサイズ時に、プロシージャ内でウインドウのサイズの取得と
リサイズの許可を行い、ループ内でクライアント領域のリサイズを行っています。

実際にリサイズされたかの確認の手順は、まず480*640のウインドウで1024*768の画像を表示します。
この時点では画像は見切れています。
そしてウインドウの大きさを変更したとき(今回は大きくしたとき)、
見切れていた部分が描画されるようにしたいのです。
しかし現在では画像は見切れたままの状態になってしまいます。

最終的には、これに画像のリサイズのコードを組み合わせて出来るだけ解像度の高い
ゲーム画面にしたいと思っています。



そこでお聞きしたいのですが、
おそらくリサイズのコードはウインドウプロシージャ内に書くのが一番簡潔だと思うのですが、
どの様な関数を使えばいいのでしょうか。
それとも単に関数の使い方が間違っているだけなのでしょうか。

また、ウインドウのリサイズ時に左クリックを離してから再描画されるのではなく、
ウインドウのサイズ変更中も画像が同時にサイズ変更される様にするには
どうすればいいのでしょうか。
WM_SIZINGを使用するという記事も見かけたのですが、
WM_SIZEとの具体的な違いの説明を見つけることができませんでした。


以下がコードになります。

コード:

#include <windows.h>
#include "DxLib.h"

//グローバル変数
HINSTANCE g_hInstance;
RECT Window;
RECT Client;
int windowwide,windowhigth;
int hix,hiy,tuix,tuiy;//ウインドウの初期座標

//背景画像用の変数
int BackGraph;//ロード変数
int sjj;//スイッチ

/////////////////////////////////////////////////////////////////////////////
//ウィンドウプロシージャ(に、伝える内容)
//コールバック関数(自作)
LRESULT CALLBACK WndProc(HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case WM_CLOSE:
		DestroyWindow(hwnd);
		return 0;

	case WM_DESTROY://右上のバッテンを押した場合(ウインドウを閉じる)
		PostQuitMessage(0);
		break;
		default:
		return (DefWindowProc(hwnd,message,wParam,lParam));
	
        case WM_SIZE:

		GetClientRect(hwnd, &Client );	//クライアント領域を調べる
		GetWindowRect(hwnd, &Window );	//ウインドウ座標を調べる

		windowwide   =(Window.right - Window.left);
		windowhigth  =(Window.bottom - Window.top);

		sjj = 1;//スイッチオン

		break;
	}
	return 0L;
}


//ウインドウのデスクトップ上での初期座標設定
void window_position()
{
	hix = 500;                  //ウインドウのデスクトップ上の左上x座標
	hiy = 500;			//ウインドウのデスクトップ上の左上y座標
	tuix = 640 + 16;	        //ウインドウのデスクトップ上の右下x座標、バー補正有り
	tuiy = 480 + 38;	        //ウインドウのデスクトップ上の右下y座標、バー補正有り
}

////////////////////////////////////////////l/////////////////////////////////
//WinMain関数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmd, int nCmdShow)
{

	MSG msg;
	g_hInstance = hInstance;
	window_position();//ウインドウの初期座標設定

//InitWindow関数の内容を記述
	//ウインドウの設定、作成、表示まで
//***************************************************************************************
	HWND hWnd;//使用するウインドウのハンドルを作成

	LPCTSTR szclassName = "succ";
	WNDCLASSEX wcex;
	ZeroMemory((LPVOID)&wcex, sizeof(WNDCLASSEX));

	//ウィンドウクラスを登録
	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.style = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc = WndProc;
	wcex.cbClsExtra = 0;
	wcex.cbWndExtra = 0;
	wcex.hInstance = g_hInstance;
	wcex.hIcon = NULL;
	wcex.hCursor = LoadCursor(NULL,IDC_ARROW);
	wcex.hbrBackground = ( HBRUSH)( COLOR_WINDOW+3);
	wcex.lpszMenuName = NULL;
	wcex.lpszClassName = szclassName;
	wcex.hIconSm = NULL;
	RegisterClassEx(&wcex);

	//ウィンドウ作成
	hWnd=CreateWindowEx(0,szclassName,"test中",WS_OVERLAPPEDWINDOW,
	hix,hiy,//左上座標xy
	tuix,tuiy,//xyの幅
	NULL,NULL,g_hInstance,NULL);

	//RECT構造体への各領域の座標代入
	GetClientRect(hWnd, &Client );	//クライアント領域の座標代入
	GetWindowRect(hWnd, &Window );	//クライアント領域の座標代入
	//ウィンドウ表示
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);


	sjj = 0;//リサイズのスイッチ

//****************************************Dxライブラリの設定など***********************************

	SetUserWindow( hWnd ) ;//上記で設定された内容のウインドウを使用する
	if( DxLib_Init() == -1 )//この記述以降でなければdxライブラリの関数は作動しない
	{
		return -1;
	}
	SetDrawScreen( DX_SCREEN_BACK );

	//背景画像の登録
	BackGraph = LoadGraph("背景.png");

	while (CheckHitKey(KEY_INPUT_ESCAPE)==0)
	{
		// エラーが起きたらループを抜ける
		if( ProcessMessage() == -1 ){break ;}
		ClearDrawScreen();

		//ウインドウプロシージャへの命令
		if(PeekMessage (&msg,NULL,0,0,PM_NOREMOVE))
		{
			if (!GetMessage (&msg,NULL,0,0))
			return msg.wParam ;
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}

    //リサイズされた際のクライアント領域の設定
    if(sjj == 1)
		{
			SetGraphMode(windowwide,windowhigth,32);
			sjj = 0;
			BackGraph = LoadGraph("背景.png");
		}

		//背景画像の表示
		DrawGraph(0,0,BackGraph,FALSE);
		ScreenFlip();
	}
	DxLib_End() ;
	return msg.wParam;
}


稚拙な質問かと思いますが、ヒント等頂けたらと思います。
宜しくお願いいたします。

yamada

Re: ウインドウサイズ変更後のクライアント領域のサイズについて

#2

投稿記事 by yamada » 9年前

1. ウィンドウのクライアントサイズ
2. DirectXの描画領域のサイズ

この二つは異なるもの。
WinAPIによるウィンドウのクライアントサイズはSetWindowPos等で変わるが、DirectXの描画領域が変わっていなければ、描画サイズ自体は変わらずにただただ運が良ければ伸長されて表示されるだけである。

DirectXによる描画領域の変更を同時に変更を行いたいのであれば、それを再初期化する必要がある。DxLibでの行い方は分からないが(SetGraphMode()か?)。

ゴンマサ

Re: ウインドウサイズ変更後のクライアント領域のサイズについて

#3

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

yamada様

返信ありがとうございます。
二つの要素が絡んでいるとは思いもしませんでした。

DirectXについて再度勉強したいと思います。
貴重なご意見ありがとうございました。

ru-pu

Re: ウインドウサイズ変更後のクライアント領域のサイズについて

#4

投稿記事 by ru-pu » 9年前

> SetGraphModeを使用してみましたが、画像などの登録データがリセットされてしまいます。
> また、使用後に画像データをを再度読み込んでも、画面が激しくちらついてしまいます。
SetGraphModeの後にSetDrawScreen(DX_SCREEN_BACK);を実行すれば画面の激しいちらつきは無くなると思います

ゴンマサ

Re: ウインドウサイズ変更後のクライアント領域のサイズについて

#5

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

-----------------------------------------------------------------------------------------------------
解決したトピックへのトピック主の返信がマナー違反でしたら申し訳ございません
-----------------------------------------------------------------------------------------------------

ru-pu様

返信ありがとうございます。
SetDrawScreen(DX_SCREEN_BACK);を使用することでちらつきを無くす事が出来ました。
ありがとうございます。

閉鎖

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