トップページ > 記事閲覧
地力でウィンドウプロシージャを用意する場合のサイズ変更対応
名前:yumetodo 日時: 2016/07/14 18:24

//detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10161640440 をきっかけに https://github.com/yumetodo/DxLib_own_create_window でいろいろ試していたのですが、 WM_WINDOWPOSCHANGING を捕まえてリサイズとAero Snapに追従しようとしたのですが、うまく追従できません。 どうも描画した後表示されるまでに勝手に縮小されているように思えます。というのは、WM_WINDOWPOSCHANGINGで捕まえたWindows sizeはちゃんと取れているのに、 描画が過剰にリサイズされたり、Aero Snapでは横に縮んで縦に伸びたりというよくわからない描画をします。 なにか参考になるような情報は無いでしょうか?
メンテ

Page: 1 |

Re: 地力でウィンドウプロシージャを用意する場合のサイズ変更対応 ( No.1 )
名前:管理人 日時:2016/07/17 05:35

元のご質問を拝見しますと 「ゲーム画面のウィンドウをユーザーの任意のサイズに変更できるようにしたい」とのことですね、 それでしたらプロージャを自作していただかなくても可能です ( ウインドウのサイズが可変の DxLibModelViewer.exe もDXライブラリで作成していますが 独自のプロージャは使用していませんので ) SetWindowSizeChangeEnableFlag を使用してウインドウのサイズを変更できるようにしても SetGraphMode で指定したサイズ以上にウインドウを大きくすることができないのですが、 GetDefaultState で取得できるデスクトップのサイズを 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 ; }
メンテ
Re: 最大化時のウィンドウの枠の太さ ( No.2 )
名前:元の質問の質問者 日時:2016/07/17 15:45

元々の質問をYahoo知恵袋に投稿した者です。 なるほど、わざわざウィンドウプロシージャを自力で作成しなくてもデフォルトでできたんですね。 ありがとうございます。 あと、追加での質問になり申し訳ないのですが、ウィンドウの枠がほかのアプリケーションよりも太いために、最大化した際に枠が少し見えてしまうのが気になります。 SetWindowStyleMode関数の引数を9にすることで枠を細くすることができたのですが、最大化ボタンが使えなくなってしまいます。 ウィンドウサイズをユーザーの任意で変更・最大化ができ、かつウィンドウの枠を細くすることはできませんか?
メンテ
Re: 地力でウィンドウプロシージャを用意する場合のサイズ変更対応 ( No.3 )
名前:管理人 日時:2016/07/18 22:10

SetWindowStyleMode関数の引数を 10 にすると枠が細くて最大化ボタンが使用できるタイプとなりますので、 よろしければお試しください m(_ _)m
メンテ
Re: 解決しました ( No.4 )
名前:元の質問の質問者 日時:2016/07/19 15:34

無事解決しました! 最後になりましたが、 改めてこちらに質問を投稿してくださったyumetodo様、そして回答していただいた管理人様、ありがとうございました!
メンテ

Page: 1 |

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

   クッキー保存