|
|
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
|
|