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);
}
------------------------------------------------------------------------------------------
初期位置の情報を基づいて簡単に計算できました。
初期位置は画面中央に居るのは前提なので、デスクトップより大きいなら壊れるかも…
|