最新バージョンで擬似フルスクリーンモードを実現するサンプルプログラムを作成してみましたので、
よろしければご覧ください
なお、こちらで ALT + ENTER が押されたかどうかの判断に使用している GetInputSystemChar は
今回追加した関数なので、この関数を追加したこちらのバージョンをお使いください m(_ _)m
http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用
http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
#include "DxLib.h"
#define SCREEN_SIZE_X (640)
#define SCREEN_SIZE_Y (480)
int NowWindowSizeX ;
int NowWindowSizeY ;
int FullScreenMode ;
int WindowPositionX ;
int WindowPositionY ;
int DesktopSizeX ;
int DesktopSizeY ;
int DesktopColorBitDepth ;
int DesktopRefreshRate ;
int SubScreenHandle ;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int handle, x, add ;
int AltPlusEnter ;
// デスクトップの情報を取得する
GetDefaultState( &DesktopSizeX, &DesktopSizeY, &DesktopColorBitDepth, &DesktopRefreshRate ) ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// 最大化ボタン付きウインドウにする
SetWindowStyleMode( 7 ) ;
// ウインドウサイズにソフトの画面をフィットさせない設定にする
SetWindowSizeChangeEnableFlag( FALSE, FALSE ) ;
// ソフト画面のサイズはデスクトップと同じにする
SetGraphMode( DesktopSizeX, DesktopSizeY, 32 ) ;
// ウインドウのサイズはソフト画面のサイズにする
SetWindowSize( SCREEN_SIZE_X, SCREEN_SIZE_Y ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
return -1 ;
}
// 初期状態はウインドウモード
FullScreenMode = FALSE ;
// ソフト画面描画用の描画対象に出来る画像を作成
SubScreenHandle = MakeScreen( SCREEN_SIZE_X, SCREEN_SIZE_Y, FALSE ) ;
// 画像の読み込み
handle = LoadGraph( "Test1.bmp" ) ;
// メインループ
x = 0 ;
add = 8 ;
while( ProcessMessage() == 0 )
{
// 現在のウインドウのサイズを取得する
GetWindowSize( &NowWindowSizeX, &NowWindowSizeY ) ;
// ALT + ENTER が押されたかどうかを取得しておく
AltPlusEnter = GetInputSystemChar( TRUE ) == CTRL_CODE_CR ;
// ウインドウモードで、且つウインドウのサイズがソフト画面のサイズではなくなった場合( 最大化ボタンが押された場合 )か、
// 又は ALT + ENTER が押されたら擬似フルスクリーンモードにする
if( FullScreenMode == FALSE &&
( ( NowWindowSizeX != SCREEN_SIZE_X &&
NowWindowSizeY != SCREEN_SIZE_Y ) || AltPlusEnter ) )
{
// 擬似フルスクリーンモードかどうかのフラグを立てる
FullScreenMode = TRUE ;
// ウインドウをクライアント領域以外何も無いタイプにする
SetWindowStyleMode( 4 ) ;
// ウインドウの位置をデスクトップの一番左上に移動
SetWindowPosition( 0, 0 ) ;
// ウインドウサイズをデスクトップと同じにする
SetWindowSize( DesktopSizeX, DesktopSizeY ) ;
// 裏画面をクリア
SetDrawScreen( DX_SCREEN_BACK ) ;
ClearDrawScreen() ;
}
else
// 擬似フルスクリーンモードで、且つ ALT + ENTER が押されたらウインドウモードにする
if( FullScreenMode == TRUE && AltPlusEnter )
{
// 擬似フルスクリーンモードかどうかのフラグを倒す
FullScreenMode = FALSE ;
// 最大化ボタン付きウインドウにする
SetWindowStyleMode( 7 ) ;
// ウインドウのサイズをソフト画面と等しくする
SetWindowSize( SCREEN_SIZE_X, SCREEN_SIZE_Y ) ;
// ウインドウの位置を元に戻す
SetWindowPosition( WindowPositionX, WindowPositionY ) ;
// 裏画面をクリア
SetDrawScreen( DX_SCREEN_BACK ) ;
ClearDrawScreen() ;
}
// ウインドウモードの場合はウインドウの座標を取得しておく
if( FullScreenMode == FALSE )
{
GetWindowPosition( &WindowPositionX, &WindowPositionY ) ;
}
// 描画先をソフト画面描画用のグラフィックハンドルにする
SetDrawScreen( SubScreenHandle ) ;
// 画面のクリア
ClearDrawScreen() ;
// 移動
x += add ;
if( x < 0 || x > 640 ) add = -add ;
// 画像の描画
DrawGraph( x, 0, handle, TRUE ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 擬似フルスクリーンモードかどうかで処理を分岐
if( FullScreenMode == TRUE )
{
// 擬似フルスクリーンモードの場合
int ScalingSizeX ;
int ScalingSizeY ;
int DrawX ;
int DrawY ;
// 描画モードはバイリニア補間モードにする
SetDrawMode( DX_DRAWMODE_BILINEAR ) ;
// 裏画面への拡大描画のサイズを決定
ScalingSizeX = DesktopSizeY * SCREEN_SIZE_X / SCREEN_SIZE_Y ;
if( ScalingSizeX < DesktopSizeX )
{
ScalingSizeY = DesktopSizeY ;
}
else
{
ScalingSizeX = DesktopSizeX ;
ScalingSizeY = DesktopSizeX * SCREEN_SIZE_Y / SCREEN_SIZE_X ;
}
// 裏画面の中央にソフト画面描画用のグラフィックハンドルを拡大して描画
DrawX = ( DesktopSizeX - ScalingSizeX ) / 2 ;
DrawY = ( DesktopSizeY - ScalingSizeY ) / 2 ;
DrawExtendGraph( DrawX, DrawY, DrawX + ScalingSizeX, DrawY + ScalingSizeY, SubScreenHandle, FALSE ) ;
}
else
{
// ウインドウモードの場合は等倍でソフト画面描画用のグラフィックハンドルを描画
DrawGraph( 0, 0, SubScreenHandle, FALSE ) ;
}
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
このサンプルで行っていることはプログラムの注釈の通りですが、要約すると
SetGraphMode でソフト画面のサイズをデスクトップと同じにして、
擬似フルスクリーンモードの場合はウインドウモードを 4 の枠無しウインドウにして、
ウインドウをデスクトップ一杯に表示しつつ、ゲームの画面をウインドウ中央に拡大して描画、
擬似フルスクリーンモードではない場合はウインドウモードを 7 の最大化ボタン付き
ウインドウにして、ウインドウのサイズもゲームの画面と同じにして、ゲームの画面を等倍で描画
最大化ボタンが押されたか、ALT+ENTER が押されたら擬似フルスクリーンモードかどうかを切り替え
ということをしています
よろしければお試しください m(_ _)m