|
|
2018/2/16(Fri) 21:39:07|NO.82478
HSP3.5をWIN7で使用しています。
SCREEN命令で複数のウィンドウを作っていた時に気付いたのですが、
何故かID0のウィンドウだけ表示位置がずれているようなんです。
以下サンプルです。
screen 0,200,200,0,0,0
title "ID0"
screen 1,200,200,0,300,0
title "ID1"
screen 2,200,200,0,600,0
title "ID2"
screen 3,200,200,0,0,300
title "ID3"
screen 4,200,200,0,0,600
title "ID4"
ID0とID1・ID2はy座標が、ID3・ID4はx座標が同じはずなのにID0だけ位置が違います。
X・Yともに-6程度ずれています。
後からWIDTH命令を使っても、やはりID0だけずれています。
私の環境だけの問題でしょうか?
解かる方がいらっしゃいましたら、宜しくお願いします。
|
|
2018/2/16(Fri) 22:52:00|NO.82482
自分の環境はWIN10、HSP3.5ですが、ほんとですね。
ただID0とID1・ID2はy座標は同じですが、YサイズがID1とID2の方が少し大きいです。
X座標はID0とID3・ID4ではずれてますね。ID0が正しい位置(x=0)です。
Yサイズはちゃんと調べてないのでどちらが正しいのかわかりません。
HSP3.4でも同様でした。
ウィンドウID=1以上で起こる既存バグですかね。
|
|
2018/2/16(Fri) 23:05:02|NO.82483
バグなのかどうかはわかりませんがAPIのGetWindowInfoで調べてみると、
ID0はサイズ固定ウィンドウ
ID1以降はリサイズ可能ウィンドウ
という違いがあるのがわかります。
実際、ウィンドウの枠にマウスを持って行くとID1以降はカーソルが変わります。
ウィンドウスタイルの違いはそれだけです。
Windows内部でどんな処理をしているのかわかりませんが、
それだけでウィンドウの境界線が違うようで
ID0は境界線が3に対しID1以降は8という数値になっていました。
(私はWindows10です)
最近のWindowsだとわからないのですが、
XP以前の頃は明らかにウィンドウの大きさが違うのがわかったんですよね。
たぶんその頃の名残みたいなものが今でもあるんじゃないでしょうか。
|
|
2018/2/17(Sat) 11:07:55|NO.82488
#module
#uselib "user32.dll"
#func SystemParametersInfo "SystemParametersInfoA" int, int, int, int
#func SetWindowPos "SetWindowPos" int, int, int, int, int, int, int
#deffunc SetWindowTopLeft
fla = int((ginfo(10)-ginfo(12))/2)
tit = ginfo(11)-ginfo(13)-fla
dim u_zone, 4
SystemParametersInfo $30, 0, varptr(u_zone), 0
max_wid = u_zone(2)-u_zone(0)
max_hei = u_zone(3)-u_zone(1)-tit
SetWindowPos hwnd, 0, u_zone(0)-fla, u_zone(1), 0, 0, $5
return 0
#global
screen 0, 640, 480, 0
SetWindowTopLeft
とりあえずモジュール作りました
どうでしょうか?
使い方としてはウィンドウを作る下の行に SetWindowTopLeft を置いたら
そのウィンドウは左上に移動します
|
|
2018/2/17(Sat) 11:13:05|NO.82489
もし途中からウィンドウを左上にした場合はハンドルを取得して
モジュールを以下のようにする
#module
#uselib "user32.dll"
#func SystemParametersInfo "SystemParametersInfoA" int, int, int, int
#func SetWindowPos "SetWindowPos" int, int, int, int, int, int, int
#deffunc SetWindowTopLeft int prm1
_hwnd = prm1
fla = int((ginfo(10)-ginfo(12))/2)
tit = ginfo(11)-ginfo(13)-fla
dim u_zone, 4
SystemParametersInfo $30, 0, varptr(u_zone), 0
max_wid = u_zone(2)-u_zone(0)
max_hei = u_zone(3)-u_zone(1)-tit
SetWindowPos _hwnd, 0, u_zone(0)-fla, u_zone(1), 0, 0, $5
return 0
#global
サンプル
#uselib "user32.dll"
#cfunc GetForegroundWindow "GetForegroundWindow"
screen 0
mes "0"
screen 1
mes "1"
screen 2
_hwnd = GetForegroundWindow()
mes "2"
screen 3
mes "3"
SetWindowTopLeft _hwnd
GetForegroundWindow関数でウィンドウハンドルを取得できる
|
|
2018/2/17(Sat) 21:13:00|NO.82500
ご返答頂いた皆さんありがとうございます。
>ID0はサイズ固定ウィンドウ
>ID1以降はリサイズ可能ウィンドウ
というのからヒントを得てサンプルを弄りました。
screen 0,200,200,0,0,0
title "ID0"
screen 1,200,200,4,300,0
title "ID1"
screen 2,200,200,4,600,0
title "ID2"
screen 3,200,200,4,0,300
title "ID3"
screen 4,200,200,4,0,600
title "ID4"
これでID0とID1以降のウィンドウの表示位置は同じになりました。
サイズ固定ウィンドウならこれで問題ないようです。
それとモジュールの提供下さった方、ありがとうございます。
リサイズ可能ウィンドウの場合は、こういうのを使わないといけない感じですね。
>XP以前の頃は明らかにウィンドウの大きさが違うのがわかったんですよね。
>たぶんその頃の名残みたいなものが今でもあるんじゃないでしょうか。
OSやウィンドウスタイルの組み合わせでウィンドウの表示位置が変わるのは、
結構困りますね。
今回のように同じウィンドウに見えるのに表示位置が違う場合は特に。
それでは皆さんありがとうございました。
|
|