HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0216
トマトスープウィンドウのずれ5解決


トマトスープ

リンク

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以前の頃は明らかにウィンドウの大きさが違うのがわかったんですよね。
たぶんその頃の名残みたいなものが今でもあるんじゃないでしょうか。



Seal

リンク

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 を置いたら
そのウィンドウは左上に移動します



Seal

リンク

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やウィンドウスタイルの組み合わせでウィンドウの表示位置が変わるのは、
結構困りますね。
 今回のように同じウィンドウに見えるのに表示位置が違う場合は特に。


 それでは皆さんありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.