トップページ > 記事閲覧
ウインドウの初期位置は画面外
名前:MKII 日時: 2019/10/22 20:56

今日始めてDXライブラリを試しました、C# 用の UnicodeVer(DxLibW.dll)を使っています。 DX.DxLib_Init() 後、プログラム正常に動作しています(DX.LoadGraphScreen などで試しました) でも、画面のサイズを大きく(1280x720)すると、ウインドウの初期位置は画面外になる。 自分のパソコンの画面は小さい(1366x768)だが、タスクバーを横に置けばぎりぎり置けます。 どうやら現状のウインドウ初期位置は: 「タスクバーが下にいる状態、残り部分 1366x728 の中央」  に表示しています。(ウィンドウ枠があるため、画面内に収まらない。) 前述のとおり、自分のタスクバーは横(右)に設置しています。他の位置に設置するも、 「タスクバーを自動的に隠す」をオンするも、ウインドウの初期位置に一切影響しません。. ( Windows 7 SP1 x64 / Visual Studio 2017 Community / C# .Net 4.5.2 )
メンテ

Page: 1 |

Re: ウインドウの初期位置は画面外 ( No.1 )
名前:五月花 日時:2019/10/23 01:08

DX.SetWindowPosition でウィンドウの位置を指定することができます。 DX.DxLib_Init()の前に記述すれば初期位置を指定できると思います。 (デフォルトの初期位置がタスクバーの位置、状態に依存していないことを 指摘、作業領域の中心を基準としてほしい、ということでしたらすみません)
メンテ
Re: ウインドウの初期位置は画面外 ( No.2 )
名前:管理人 日時:2019/10/23 01:41

すみません、タスクバーの位置を考慮してウィンドウをセンタリングするように処理を変更してみましたので、 よろしければこちらの暫定最新バージョンをお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 > 五月花さん SetWindowPosition のご提案ありがとうございます 私も『ウィンドウの正確なセンタリングは難しい』という前提で SetWindowPosition で 位置を調整していただくことを考えていたのですが、Windows10 ではシンプルなウィンドウ形状に なったためか正確なサイズの取得や位置の設定が可能だったので試しにプログラムを調整してみたら 思いの外簡単に正確なセンタリングをすることができました ( Windows7 までは四隅が丸まっているウィンドウとなっていたためか GetWindowRect という ウィンドウの矩形を取得する関数では正確なウィンドウサイズや位置を取得できず、MoveWindow で 指定する通りの位置にウィンドウが配置されなかったのでデスクトップ画面でのセンタリングは 『それなりに中心に配置される』程度の精度が限界でした… )
メンテ
Re: ウインドウの初期位置は画面外 ( No.3 )
名前:MKII 日時:2019/10/23 14:01

新しいバージョンを試しました、タスクバーがどんな状態でも画面内に収まれました、ありがとうございます。 あんまり使われないと思いけど、SetWindowSize(width, height) でウインドウの大きさを変更した後にも中央に置きたい。 ーーーーーーーーーー この前自力で座標を計算するを試みましたが、おっしゃる通りかなりめんどくさい。最終的に 「ウインドウを表示する前に透明な Form を中央に表示して、その Form から .Net 勝手に計算してくれた座標を貰う。」  という方法て仮対応しています。 一応動くけど…Winforms が必要になるし、自分でも「(;-_-)これ、汚いな…」と思うので没にしました。
メンテ
Re: ウインドウの初期位置は画面外 ( No.4 )
名前:管理人 日時:2019/10/24 01:33

> あんまり使われないと思いけど、SetWindowSize(width, height) でウインドウの大きさを変更した後にも中央に置きたい。 DXライブラリでは通常は SetGraphMode でウィンドウのサイズを変更するのですが、 SetGraphMode ではなく SetWindowSize を使用されるのは何か特別な理由があるのでしょうか? > 「ウインドウを表示する前に透明な Form を中央に表示して、その Form から .Net 勝手に計算してくれた座標を貰う。」 手段を選ばない感じは個人的には良いと思います (^ ^; DXライブラリの動画再生機能も最初期は非表示状態のウィンドウに出力された動画の画像を 読み取ってDXライブラリ側のテクスチャに転送して描画するという手段を選ばない類のものでしたし… ( 当時『メインウィンドウとは別のウィンドウに動画を表示する』という方法しか見つけられなかった為にこんな方法に… )
メンテ
Re: ウインドウの初期位置は画面外 ( No.5 )
名前:MKII 日時:2019/10/24 10:48

はい、起動時のウィンドウサイズは SetGraphMode で設定しています。 でも起動後、プレイヤーの選択に応じてゲームを再起動しないままウィンドウサイズを変更したいので、 検索したら以前の記事を見つかりました:  >ウィンドウの大きさを自由に変えられるか  >dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=3612 その記事の中で書かれた方法で実現しましたが、ウィンドウの左上座標は元位置にいます。 SetWindowSize(width, height) の前に SetWindowInitPosition(x, y) で座標を指定しますと、指定の位置に出ます。 …ですがその座標の計算はめんどくさいなので、できれば自力で計算したくない。
メンテ
Re: ウインドウの初期位置は画面外 ( No.6 )
名前:管理人 日時:2019/10/25 00:26

> でも起動後、プレイヤーの選択に応じてゲームを再起動しないままウィンドウサイズを変更したいので、 > 検索したら以前の記事を見つかりました: なるほど、こちらの方法でしたか > その記事の中で書かれた方法で実現しましたが、ウィンドウの左上座標は元位置にいます。 > SetWindowSize(width, height) の前に SetWindowInitPosition(x, y) で座標を指定しますと、指定の位置に出ます。 > …ですがその座標の計算はめんどくさいなので、できれば自力で計算したくない。 そうですか… Windows10 限定ですがウィンドウをセンタリングする関数は容易に実装できそうですので、 もし必要でしたら仰ってください
メンテ
Re: ウインドウの初期位置は画面外 ( No.7 )
名前:MKII 日時:2019/10/25 19:49

初期化の時はどのような処理を行ってますか、自分の OS は Windows 7 ですか、ウインドウの初期位置は画面中央にいます。 ウインドウサイズ変更する時も同じような処理で駄目かな? (´∀`) もし駄目なら素直に諦めます…自力で「透明な Form」など使って対応する。
メンテ
Re: ウインドウの初期位置は画面外 ( No.8 )
名前:MKII (解決) 日時:2019/10/27 12:28

解決策を思いつきました: ------------------------------------------------------------------------------------------ private static int DesktopWidth; private static int DesktopHeight; private static int WindowPositionOffset_X; private static int WindowPositionOffset_Y; static void Main(string[] args) { // Get Desktop Info DX.GetDefaultState(out DesktopWidth, out DesktopHeight, out int desktop_color, out int desktop_refresh, out int desktop_top_x, out int desktop_top_y, out int desktop_pixel_w, out int desktop_pixel_h); // Init DXLib DX.ChangeWindowMode(DX.TRUE); DX.SetGraphMode(640, 480, desktop_color); DX.SetWindowSizeChangeEnableFlag(DX.FALSE, DX.FALSE); if (DX.DxLib_Init() != 0) { Console.WriteLine("DXLibrary failed to load. \nPress any key to exit."); Console.ReadLine(); return; } Console.WriteLine("DXLibrary loaded."); DX.SetDrawScreen(DX.DX_SCREEN_BACK); // Need to set after Init // Calculate Window Position Offset DX.GetWindowPosition(out int window_init_x, out int window_init_y); DX.GetWindowSize(out int window_init_w, out int window_init_h); WindowPositionOffset_X = (DesktopWidth - window_init_w) / 2 - window_init_x; WindowPositionOffset_Y = (DesktopHeight - window_init_h) / 2 - window_init_y; // 略 } private static void ChangeWindowSize(int width, int height) { // SetGraphMode if current mode is not enough DX.GetScreenState(out int now_screen_w, out int now_screen_h, out int now_color); if (width > now_screen_w || height > now_screen_h) { DX.SetGraphMode(width, height, now_color); } // Calculate new window position int window_x = (DesktopWidth - width) / 2 - WindowPositionOffset_X; int window_y = (DesktopHeight - height) / 2 - WindowPositionOffset_Y; DX.SetWindowInitPosition(window_x, window_y); DX.SetWindowSize(width, height); } ------------------------------------------------------------------------------------------ 初期位置の情報を基づいて簡単に計算できました。 初期位置は画面中央に居るのは前提なので、デスクトップより大きいなら壊れるかも…
メンテ

Page: 1 |

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

   クッキー保存