トップページ > 記事閲覧
最大化した時に残る黒い部分
名前:たわし 日時: 2014/01/07 16:12

dxlibに最大化を実装して最大化が出来るようにはなったのですが。 最大化した時、右端に数ミリの黒い幅が残ります。 どうしたら良いのでしょうか? cppの中はこんな感じです #include "DxLib.h" #include <Windows.h> #include "SceneMgr.h" #include "SceneGame.h" #include "Controller.h" #include "FPS.h" WNDPROC dxWndProc; int tate = 480,yoko = 854; void ChangeCallback( void *Data ){ ShowWindow(GetMainWindowHandle(),3); } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ RECT rcClient, rc; static int flagSIZE = FALSE; switch (msg){ case WM_SIZE: switch (wp){ case SIZE_MAXIMIZED: // 最大化 case SIZE_RESTORED: // 通常のサイズ変更 GetClientRect(hWnd, &rcClient); // クライエント領域の大きさを取得 /* if (rcClient.right > rcClient.bottom){ // 比率を合わせる rcClient.right = rcClient.bottom / 9 * 16; }else{ rcClient.bottom = rcClient.right / 9 * 16; } */ tate=rcClient.bottom; yoko=rcClient.right; AdjustWindowRectEx(&rcClient, GetWindowLong(hWnd, GWL_STYLE), FALSE, GetWindowLong(hWnd, GWL_EXSTYLE));// ウィンドウ領域に合わせる(タイトルバー等も考慮した大きさに) SendMessage(hWnd, WM_SIZING, WMSZ_LEFT, (LPARAM)&rcClient); // ウィンドウの比率を合わせる(rcClientのleft, topともに0ですがこのDXライブラリにおいては問題はありません) flagSIZE = TRUE; break; } break; case WM_PAINT: if (flagSIZE){ // サイズ変更が起きていたら HDC hdc; PAINTSTRUCT ps; HBRUSH hBrush, hOldBrush; hdc = BeginPaint(hWnd, &ps); // クライエント領域全体を黒く塗る { hBrush = CreateSolidBrush(RGB(0, 0, 0)); hOldBrush = (HBRUSH)SelectObject(hdc, hBrush); GetClientRect(hWnd, &rc); Rectangle(hdc, 0, 0, rc.right, rc.bottom); SelectObject(hdc, hOldBrush); DeleteObject(hBrush); } EndPaint(hWnd, &ps); flagSIZE = FALSE; } return CallWindowProc((WNDPROC)dxWndProc, hWnd, msg, wp, lp); default: return CallWindowProc((WNDPROC)dxWndProc, hWnd, msg, wp, lp); } return (DefWindowProc(hWnd, msg, wp, lp)); } //ここから int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ //ウィンドウタイトル    ウィンドウサイズ自由 ウィンドウの最大化   SetMainWindowText("Red Protect"),SetWindowSizeChangeEnableFlag( TRUE ),SetUseASyncChangeWindowModeFunction( TRUE, ChangeCallback, NULL ), //ウィンドウモード ウィンドウサイズ領域    初期化 描画先を裏画面 ChangeWindowMode( TRUE ),SetGraphMode( yoko, tate, 32 ),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK ); //準備 /**********************************************************************************************************/ HWND hWnd = GetMainWindowHandle(); dxWndProc = (WNDPROC)GetWindowLong(hWnd, GWL_WNDPROC); SetWindowLong(hWnd, GWL_WNDPROC, (LONG)WndProc); SceneMgr_Initialize(); //メニューの初期化 SceneGame_Initialize(); //ゲームの初期化 /**********************************************************************************************************/ //裏を表に反映 メッセージ処理   画面クリア キーの更新 while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && Update_Key()==0){ //表示 /*******************************************************************************************************************/ Fps_Update(); //フレーム更新 SceneMgr_Update(); //メニューの更新 SceneMgr_Draw(); //メニューの描画 SceneGame_Update(); //ゲームの更新 SceneGame_Draw(); //ゲームの描画 Fps_Wait(); //フレーム待機 /*******************************************************************************************************************/ } SceneMgr_Finalize(); //メニューの終了処理 SceneGame_Finalize(); //ゲームの終了処理 DxLib_End(); return 0; }
メンテ

Page: 1 |

Re: 最大化した時に残る黒い部分 ( No.1 )
名前:管理人 日時:2014/01/09 01:03

すみません、プログラムを拝見する限りでは、どのようにして最大化しているのかが分かりません 私の手元で実行しながら原因を探したいと思いますので、問題の現象が確認できる 短いプログラムを作成して頂けないでしょうか?
メンテ
Re: 最大化した時に残る黒い部分 ( No.2 )
名前:たわし 日時:2014/01/09 01:57

わかりました 短くしプログラムを作ってきますので 少しお待ちください
メンテ
Re: 最大化した時に残る黒い部分 ( No.3 )
名前:たわし 日時:2014/01/09 02:34

こんな感じでよろしいでしょうか? 黒い幅の出現条件 手動で画面を大きくする分には黒い幅は出ないのですが、最大化ボタンを押したときのみ右側にでます #include "DxLib.h" #include <Windows.h> int tate = 480,yoko = 854;//ウィンドウサイズ、縦横の大きさ WNDPROC dxWndProc; void ChangeCallback( void *Data ){ ShowWindow(GetMainWindowHandle(),3); } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ RECT rcClient, rc; static int flagSIZE = FALSE; switch (msg){ case WM_SIZE: switch (wp){   case SIZE_MAXIMIZED: // 最大化   case SIZE_RESTORED: // 通常のサイズ変更 GetClientRect(hWnd, &rcClient); // クライエント領域の大きさを取得   tate=rcClient.bottom;   yoko=rcClient.right; AdjustWindowRectEx(&rcClient, GetWindowLong(hWnd, GWL_STYLE), FALSE, GetWindowLong(hWnd, GWL_EXSTYLE));// ウィンドウ領域に合わせる(タイトルバー等も考慮した大きさに) SendMessage(hWnd, WM_SIZING, WMSZ_LEFT, (LPARAM)&rcClient); // ウィンドウの比率を合わせる(rcClientのleft, topともに0ですがこのDXライブラリにおいては問題はありません) flagSIZE = TRUE; break; } break; case WM_PAINT: if (flagSIZE){ // サイズ変更が起きていたら HDC hdc; PAINTSTRUCT ps; HBRUSH hBrush, hOldBrush; hdc = BeginPaint(hWnd, &ps); // クライエント領域全体を黒く塗る { hBrush = CreateSolidBrush(RGB(0, 0, 0)); hOldBrush = (HBRUSH)SelectObject(hdc, hBrush); GetClientRect(hWnd, &rc); Rectangle(hdc, 0, 0, rc.right, rc.bottom); SelectObject(hdc, hOldBrush); DeleteObject(hBrush); } EndPaint(hWnd, &ps); flagSIZE = FALSE; } return CallWindowProc((WNDPROC)dxWndProc, hWnd, msg, wp, lp); default: return CallWindowProc((WNDPROC)dxWndProc, hWnd, msg, wp, lp); } return (DefWindowProc(hWnd, msg, wp, lp)); } //ここからメイン int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){     SetBackgroundColor( 0, 255, 0 );//画面を白に //ウィンドウサイズ自由 ウィンドウの最大化   SetWindowSizeChangeEnableFlag( TRUE ),SetUseASyncChangeWindowModeFunction( TRUE, ChangeCallback, NULL ), //ウィンドウモード ウィンドウサイズ領域    初期化 描画先を裏画面 ChangeWindowMode( TRUE ),SetGraphMode( yoko, tate, 32 ),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK ); /**********************************************************************************************************/ HWND hWnd = GetMainWindowHandle(); dxWndProc = (WNDPROC)GetWindowLong(hWnd, GWL_WNDPROC); SetWindowLong(hWnd, GWL_WNDPROC, (LONG)WndProc); /**********************************************************************************************************/ //裏を表に反映    メッセージ処理   画面クリア while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){ //表示 /*******************************************************************************************************************/ /*******************************************************************************************************************/ } DxLib_End(); return 0; }
メンテ
Re: 最大化した時に残る黒い部分 ( No.4 )
名前:管理人 日時:2014/01/11 15:27

プログラムの掲載ありがとうございます、状況が把握できました まず、SetUseASyncChangeWindowModeFunction はウインドウを最大化するための機能ではなく、 フルスクリーンモードとウインドウモードの切り替えをできるようにするかどうかの機能です なのでデスクトップ画面のままウインドウを最大化することは想定していません たわしさんの意図する動作は本来の動作通りフルスクリーンモードに切り替わることでしょうか? それともデスクトップ画面のままウインドウが最大化することでしょうか?
メンテ
Re: 最大化した時に残る黒い部分 ( No.5 )
名前:たわし 日時:2014/01/11 16:02

フルスクリーンではなく、デスクトップ画面のままウィンドウを最大化するほうです。 その場合、どのようにプログラムを組めばよいでしょうか?
メンテ
Re: 最大化した時に残る黒い部分 ( No.6 )
名前:管理人 日時:2014/01/12 01:31

DxLib_Init を呼ぶ前に SetWindowStyleMode( 7 ) ; を実行して最大化ボタンを押せるようにするだけでウインドウを最大化できるようにしてみました SetUseASyncChangeWindowModeFunction も SetWindowSizeChangeEnableFlag も GetMainWindowHandle も SetWindowLong も 使用する必要はありません よろしければその変更を行ったこちらのバージョンをお試しになってみてください 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)」をして下さい)
メンテ
Re: 最大化した時に残る黒い部分 ( No.7 )
名前:たわし 日時:2014/01/12 03:24

最大化のボタンもあって、黒い幅もなくなりました ですが、最大化したときにウィンドウサイズがデスクトップいっぱいまで広がりきらずに右幅が空いてしまいました。
メンテ
Re: 最大化した時に残る黒い部分 ( No.8 )
名前:管理人 日時:2014/01/12 09:20

それは yoko = 854, tate = 480 の比率を保とうとするとデスクトップ画面にぴったり収まらないからだと思います たわしさんとしてはDXライブラリの画面が縦や横に伸びてしまってもデスクトップ画面一杯に広がった方が良いのでしょうか? ( そうした場合、例えば画面内のキャラクターが横に引き伸ばされて太って見えたり、縦に引き伸ばされて痩せて見えたりします )
メンテ
Re: 最大化した時に残る黒い部分 ( No.9 )
名前:たわし 日時:2014/01/12 16:02

はい どんなデスクトップやノートパソコンでも画面一杯に広げたいです でも、画面内のキャラが横に引き伸ばされたりするのはイヤです そして、この yoko = 854 , tate = 480 は最初の起動時に表示される大きさを設定しているので、比率を保とうとは思っていません(自分的には) DXLibは保とうとしているようですが
メンテ
Re: 最大化した時に残る黒い部分 ( No.10 )
名前:管理人 日時:2014/01/12 18:15

画面の縦横比率が変化しても問題が無いソフトということでしょうか? もしそうでしたら、SetGraphMode で画面をデスクトップのサイズにして、且つウインドウのサイズが 変化してもウインドウの中に表示される映像にスケールが掛からないようにすれば たわしさんの希望の処理を実装できると思います よろしければこちらのプログラムを実行してみてください #include "DxLib.h" #define INIT_SCREEN_W (640) #define INIT_SCREEN_H (480) int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int x, xadd ; int y, yadd ; int DesktopW, DesktopH ; int WindowW, WindowH ; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // 最大化ボタンが存在するウインドウモードに変更 SetWindowStyleMode( 7 ) ; // 画面サイズをデスクトップのサイズと同じにする GetDefaultState( &DesktopW, &DesktopH, NULL ) ; SetGraphMode( DesktopW, DesktopH, 32 ) ; // サイズ変更を可能にする SetWindowSizeChangeEnableFlag( TRUE, FALSE ) ; // ウインドウサイズはゲーム画面と一致させる SetWindowSize( INIT_SCREEN_W, INIT_SCREEN_H ) ; // ウインドウの位置は画面中心付近にする SetWindowPosition( ( DesktopW - INIT_SCREEN_W ) / 2, ( DesktopH - INIT_SCREEN_H ) / 2 ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // ウインドウサイズ情報の初期化 GetWindowSize( &WindowW, &WindowH ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ x = 0 ; xadd = 8 ; y = 0 ; yadd = 8 ; while( ProcessMessage() == 0 ) { // ウインドウのクライアント領域を取得する GetWindowSize( &WindowW, &WindowH ) ; // 移動( ウインドウの端で移動方向が反転する ) x += xadd ; if( ( xadd > 0 && x > WindowW ) || ( xadd < 0 && x < 0 ) ) { xadd = -xadd; } y += yadd ; if( ( yadd > 0 && y > WindowH ) || ( yadd < 0 && y < 0 ) ) { yadd = -yadd; } // 画面のクリア ClearDrawScreen() ; // 箱の描画 DrawBox( x, 0, x + 32, 32, GetColor( 255,255,255 ), TRUE ) ; DrawBox( 0, y, 32, y + 32, GetColor( 255,255,255 ), TRUE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 画面上端と左端を四角形が移動します、ウインドウの端に到達すると移動方向が反転します 初期状態ではウインドウのサイズは 640x480 ですが、最大化ボタンやウインドウの端を掴んで 引っ張ることでサイズを変更することが出来ます サイズが変化すると移動する四角形の移動範囲も広くなります ウインドウの現在のサイズは GetWindowSize で取得することができます 因みに、最大化ボタンを有効にした場合、最初の最大化ボタン押しの際に 正常に最大化されないというバグがありましたので、お手数で申し訳ありませんが それを修正したこちらのバージョンをお使いください 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)」をして下さい)
メンテ
Re: 最大化した時に残る黒い部分 ( No.11 )
名前:たわし 日時:2014/01/13 05:00

バグ潰しご苦労様です 頂いたサンプルプログラムを実装したところ、右端が空くのはなくなりました。 ただ、 DXライブラリ置き場、3Dを扱ったサンプルプログラム、3Dアクション基本を、頂いたサンプルプログラムと合わせたらちょっとおかしな事になってしまって なんと言いますか・・・ 起動時の640*480のウィンドウサイズにデスクトップの大きさで表示されているみたいで、画面の一部が欠落しています たぶんこれが画面の縦横比率が変化しても問題が無いソフト、何だと思います。 でも、これではないと思います 例えると「マインクフト」のようなウィンドウサイズの変更ができればよいです すいません長々と
メンテ
Re: 最大化した時に残る黒い部分 ( No.12 )
名前:管理人 日時:2014/01/13 09:35

マインクラフトをプレイしたことが無かったので見てみました、なるほど理解できました マインクラフトはウインドウの縦幅に応じて3D描画の拡大率を変更しているようです そして2D描画はウインドウのサイズに応じて位置やサイズを変更しているようです ( 必ずウインドウ下端にあるアイコン群や、必ずウインドウの中心付近に配置するボタンなど ) ただ、2D描画は3D描画と違いシームレスにスケールが変化するのではなく、一定サイズ毎に切り替わるようです この方式を実現する場合は、基本的には前回の「画面をデスクトップと同じサイズにする方式」に処理を追加する形になります まず2D描画については GetWindowSize でウインドウのサイズを取得して、マインクラフトと 同じようにウインドウのサイズに応じて描画位置を変更するしかありません ( ウインドウサイズに合わせてスケールも変更する場合は DrawExtendGraph などを使用して・・・ ) 3D描画については while( ProcessMessage() == 0 ) のループの中に以下の処理を追加することで 「ウインドウの縦幅に応じた拡大表示」ができます // 描画範囲をウインドウの範囲に限定する SetDrawArea( 0, 0, WindowW, WindowH ) ; // 3D描画の中心をウインドウの中心に設定する SetCameraScreenCenter( WindowW / 2.0f, WindowH / 2.0f ) ; // 3D描画のスケールをウインドウの縦幅によって変更する SetDraw3DScale( ( float )WindowH / DesktopH ) ; よろしければお試しください
メンテ
Re: 最大化した時に残る黒い部分 ( No.13 )
名前:たわし(解決) 日時:2014/01/14 01:41

で、できましたー!! こんな拙い情報源しか与えられない私に時間を裂いていただいてありがとうございます 管理人様、本当にありがとうございます
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存