また皆様のご意見をいただきたいと思います。
よろしくお願いいたします。
今回はウインドウサイズ変更後のクライアント領域のリサイズについてです。
現在、ウインドウのサイズを変更することはできたのですが、クライアント領域は変更されないため、
ウインドウを大きくしても画像が途切れたままになってしまいます。
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;
}
宜しくお願いいたします。