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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
1027
とあるプログラマredrawが効かない。バグ?仕様?5解決


とあるプログラマ

リンク

2018/10/27(Sat) 14:59:02|NO.85727

screen,bgscrで非表示ウィンドウを作成 またはgselで一度でも非表示にしたウィンドウはredrawが効かないのですが、これはバグでしょうか? それとも仕様でしょうか?


screen 0,,,2 screen 1 screen 2 gsel 2,-1 repeat 3 gsel cnt title "screen "+cnt+"" redraw 0 pos 0,0 mes "a" ;redraw 1 loop gsel 0,1 gsel 2,1 repeat 3 gsel cnt redraw 0 pos 0,20 mes "b" ;redraw 1 loop



この記事に返信する


あらや

リンク

2018/10/27(Sat) 15:22:31|NO.85729

バグっぽいですね。
>gsel 0,1
>gsel 2,1
このウィンドウを表示した時点で
強制的に再描画される(redraw 1)になるのは
仕様っぽいんですが
その後にredrawが無視されるのはバグっぽいです。

一応、ウィンドウ表示後にウェイトを入れると正常に戻るみたいです。

gsel 0,1 gsel 2,1 await 0 repeat 3 gsel cnt redraw 0 pos 0,20 mes "b" ;redraw 1 loop



とあるプログラマ

リンク

2018/10/27(Sat) 15:43:20|NO.85730

>>あらやさん
なるほどawaitで正常になるのですか。bufferで初期化してShowWindow関数とかSetWindowPos関数を使って回りくどい方法を模索してしまった(笑)
awaitで正常になるということはウィンドウプロシージャ関連ですかね。だとするとバグではなく仕様よりになるのかな…?



掘木

リンク

2018/10/27(Sat) 17:45:12|NO.85731

仕様ですね。

そもそもどの場合でもredrawは無視されていません。
HSPシステム的には描画命令でばバックバッファの更新だけを行っています。

ウィンドウを再表示する際にウィンドウは今の表示状態を再構築します。
この際にHSPはバックバッファの内容を転送するよう作られているため、
「システムが再描画を要求する事態」が発生すれば、バックバッファの内容で画面が更新されるのです。

>このウィンドウを表示した時点で
>強制的に再描画される(redraw 1)になるのは
>仕様っぽいんですが
>その後にredrawが無視されるのはバグっぽいです。
ウィンドウの再表示においては、ウィンドウの状態を書き換えますが、
ウィンドウの中身を要求するタイミングは、メッセージディスパッチ処理が行われるタイミングになります。
掲題のコードではstop時(コードの終端に到達時)ですから、そもそも時系列が逆なのです。


詳しい処理順を調べるならoncmdでWM_PAINTとかを捕まえてみよう。

現実問題としては、コードの実行結果が画面に反映されないなら困るが、
反映されるのだから何も問題にならないと思う。



とあるプログラマ

リンク

2018/10/27(Sat) 18:31:01|NO.85732

>>掘木さん
やはり仕様でしたか。
もう一つお聞きしたいのですが、SetParentとSeWindowLongで子ウィンドウ化したウィンドウでredraw 1を行うとウィンドウオブジェクトの表示がおかしくなるのは仕様でしょうか?
以下サンプルです。

#include "user32.as" #const global GWL_STYLE $FFFFFFF0 #const global WS_CHILD $40000000 screen 0 h=hwnd bgscr 1 width ,,0,0 SetParent hwnd,h SetWindowLong hwnd, GWL_STYLE, WS_CHILD gsel 1,1 pos 0,0 string="abcd" mesbox string,200,200 combox comb,100,"a\nb" *main gsel 1 redraw 0 color 255,0,0 boxf color pos 200,0 mes i i++ redraw 1 await 16 goto *main

子ウィンドウに描画を行いたい場合はどうすれば良いでしょうか。



とあるプログラマ

リンク

2018/10/27(Sat) 20:06:45|NO.85733

自己解決しました。redrawやboxf等で描画される範囲からオブジェクトの範囲を除外すればいいそうです。

参考サイト↓
https://teratail.com/questions/137025



#include "user32.as" #const global GWL_STYLE $FFFFFFF0 #const global GWL_EXSTYLE $FFFFFFEC #const global WS_OVERLAPPED $00000000 #const global WS_CAPTION $00C00000 #const global WS_MINIMIZEBOX $00020000 #const global WS_SYSMENU $00080000 #const global WS_CHILD $40000000 #const global WS_CLIPCHILDREN $02000000 #const global WS_MAXIMIZE $01000000 #const global WS_VISIBLE $10000000 #const global WS_CLIPSIBLINGS $04000000 #const global WS_EX_MDICHILD $00000040 screen 0 GetWindowLong hwnd , GWL_STYLE SetWindowLong hwnd , GWL_STYLE , WS_OVERLAPPED|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU|WS_CLIPCHILDREN|WS_MAXIMIZE|WS_VISIBLE h=hwnd bgscr 1 SetWindowLong hwnd , GWL_STYLE , WS_OVERLAPPED|WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_MAXIMIZE|WS_VISIBLE SetWindowLong hwnd , GWL_EXSTYLE , WS_EX_MDICHILD SetParent hwnd,h pos 0,0 string="abcd" mesbox string,200,200 combox comb,100,"a\nb" *main gsel 1 redraw 0 color 255,0,0 boxf color pos 200,0 mes i i++ redraw 1 await 16 goto *main



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