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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0919
甘酒某RPG風表示7解決


甘酒

リンク

2012/9/19(Wed) 01:33:08|NO.49440

ウィンドウを3つ作り、上から「HP表示ウィンドウ」「戦闘ウィンドウ」「メッセージウィンドウ」
と名前を付け、上から3段重ねでウィンドウをくっつけたいのですが、どうすればできますか?
まず、他ウィンドウに貼り付けるところまでは、調べたらたどり着けました

#uselib "user32.dll" #func FindWindow "FindWindowA" sptr, sptr #func GetWindowRect "GetWindowRect" int,int buffer 1,300,200 gsel 0 *main title "メインウィンドウ" dim mainwindo,4 FindWindow 0,"HP表示ウィンドウ" GetWindowRect stat,varptr(mainwindo) width 300,200,mainwindo(0),mainwindo(3) await 5 goto *main
教えてください。



この記事に返信する


甘酒

リンク

2012/9/19(Wed) 01:35:36|NO.49441

あ、bufferとgselは、どうやれば2つウィンドウを表示する事ができるかを考えた末の残りです。
サイト内検索、グーグル検索等調べてみましたが僕の表現力が弱いのか出ない・・?



甘酒

リンク

2012/9/19(Wed) 01:46:09|NO.49442

すみません、2段まではできました

#uselib "user32.dll" #func FindWindow "FindWindowA" sptr, sptr #func GetWindowRect "GetWindowRect" int,int screen 0,300,200 screen 1,300,200 screen 2,300,200 gsel 1 title "メインウィンドウ" gsel 2 title "メッセージウィンドウ" gsel 0 *main title "HP表示ウィンドウ" dim mainwindo,4 FindWindow 0,"メインウィンドウ" GetWindowRect stat,varptr(mainwindo) width 300,200,mainwindo(0),mainwindo(3) await 5 goto *main
少しコードがごちゃごちゃしてきたので適度に改行を入れて調整してみました。
後は3段を再現したいんですが・・・



甘酒

リンク

2012/9/19(Wed) 01:54:42|NO.49443

いろいろやってたら不思議な現象に遭遇。

#uselib "user32.dll" #func FindWindow "FindWindowA" sptr, sptr #func GetWindowRect "GetWindowRect" int,int HP = 100 screen 0,300,200 screen 1,300,200 gsel 1 title "HP表示ウィンドウ" gsel 0 *main redraw 0 color 255,255,255:boxf title "メインウィンドウ" dim mainwindo,4 FindWindow 0,"HP表示ウィンドウ" GetWindowRect stat,varptr(mainwindo) width 300,200,mainwindo(0),mainwindo(3) color 0,0,0 mes HP await 5 goto *main
メインウィンドウに表示した変数HPを、メッセージウィンドウが通ると、その分白くなる。
なんだろう?



甘酒

リンク

2012/9/19(Wed) 01:56:29|NO.49444

上のコード間違えました。

#uselib "user32.dll" #func FindWindow "FindWindowA" sptr, sptr #func GetWindowRect "GetWindowRect" int,int HP = 100 screen 0,300,200 screen 1,300,200 screen 2,300,200 gsel 1 title "HP表示ウィンドウ" gsel 2 title "メッセージウィンドウ" gsel 0 *main redraw 0 color 255,255,255:boxf title "メインウィンドウ" dim mainwindo,4 FindWindow 0,"HP表示ウィンドウ" GetWindowRect stat,varptr(mainwindo) width 300,200,mainwindo(0),mainwindo(3) color 0,0,0 mes HP await 5 goto *main
実験的にメッセージウィンドウを追加すると、上のような現象が起こりました。



てん

リンク

2012/9/19(Wed) 03:22:48|NO.49445

//少しスクリプトを修正しました。


#uselib "user32.dll" #func FindWindow "FindWindowA" sptr, sptr #func GetWindowRect "GetWindowRect" int,int HP = 100 screen 0, 300, 200 screen 1, 300, 200 screen 2, 300, 200 gsel 1 : title "HP表示ウィンドウ" gsel 2 : title "メッセージウィンドウ" gsel 0 : title "メインウィンドウ" dim mainwindow, 4 *main FindWindow 0, "HP表示ウィンドウ" GetWindowRect stat, varptr(mainwindow) width 300, 200, mainwindow(0), mainwindow(3) color 255,255,255 : boxf color 0, 0, 0 : pos 0, 0 : mes HP redraw 1 : redraw 0 await 5 goto *main
とりあえず 3ツ目も同様の方法でうまくいくでしょう。
白くなったことについては「無効領域」というまた別のお話なのでこのあとのレスで。



てん

リンク

2012/9/19(Wed) 03:37:14|NO.49446

無効領域について理解できるサンプルをよういしました。

screen 0, 800, 600, , 100, 100 title "青いウィンドウをおいたところが赤くなります" redraw 0 color $FF, $00, $00 : boxf bgscr 1, 100, 100, 0, 920, 100 : onclick gosub *click color $00, $00, $FF : boxf color $C0, $F0, $FF : boxf 10, 10, 90, 90 pos 10, 10 : color : mes "ドラッグ!" stop *click sendmsg hwnd, $00A1, 2, 0 return

青いウィンドウを真っ白なウィンドウ上にドラッグすると、ドラッグされた箇所が白から赤へ変化します。

そもそも、この白いウィンドウ(ID:0)は3行目で redraw 0 が呼び出されるため、画面の更新がされないはずでした。
そのため、4行目で全体を赤く塗りつぶしていますが、見かけは真っ白のままでした。

しかし、青いウィンドウ(ID:1)が上に来てしまったため、ウィンドウの一部が隠れてしまいました。
青いウィンドウがどいたら、白いウィンドウの一部をスクリーン上に描き直す必要ができてしまいましたね?
この「描き直す必要がある領域」こそが無効領域です。
今回、無効領域の発生に伴い、画面の再描画を行った結果、まだ反映されていなかった赤い画面が
スクリーン上に反映された、というわけです。



さて、問題の当初のスクリプトの場合

*main redraw 0 color 255,255,255:boxf title "メインウィンドウ" dim mainwindo,4 FindWindow 0,"HP表示ウィンドウ" GetWindowRect stat,varptr(mainwindo) width 300,200,mainwindo(0),mainwindo(3) color 0,0,0 mes HP await 5 goto *main
そもそも、2点の間違いを犯していました。
① redraw 1 の呼び出し忘れ
② mes命令の描画位置の指定忘れ

②があったために、mesの描画位置は呼び出されるたびに一行ずつ下へ動いて行きました。
そしてやがて、mes命令は画面をはみ出し、画面は真っ白になってしまいます。

しかし、①redrawの呼び出し忘れにより、スクリーンにはまだmes命令で描画した文字が残っていました。
ところが他のウィンドウがこのウィンドウ上を通過した際に無効領域が発生し、
画面を更新した結果真っ白になった、ということです。



甘酒

リンク

2012/9/19(Wed) 05:15:27|NO.49447

無効領域についての解説、ありがとうございました!
redrawの書き忘れ、睡魔のせいで忘れてたようだ・・・zzz



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