|
|
|
2020/2/17(Mon) 09:50:13|NO.89496
ウィンドウにサイズ変更時に、オブジェクトや背景をリサイズさせるのですが、
一瞬、ウィンドウの端に黒いのが見えたり、ListBoxがちかちかなったりと、思うようになりません。
そのスクリプトです。↓
#include "obj.as"
// ウィンドウ
gsel 0,-1
screen 1, ginfo_dispx, ginfo_dispy, 0, 400, 500, 500, 200;サイズ変更可能
title "リサイズ時にいろいろちらつく"
// 背景を塗りつぶす
#define windowColor 240
color windowColor,windowColor,windowColor :boxf :color
; mes
pos 5,5
font "MSゴシック",12
mes "リスト"
; listbox
pos 0,20
objsize 130,ginfo_winy-20 -23 -25
listbox listSel,0,"A\nB"
id_WodiList = stat; id保存
; 白の下地
color 255,255,255
boxf 135, 20, ginfo_winx-5, ginfo_winy-28
color
; mes
pos 145,26
mes "input:"
pos 145,68
mes "input:"
; input
pos 155,40
sdim buf
input buf, ginfo_winx-155-15, 20
id_TitleInput = stat; id保存
sendmsg objinfo(id_TitleInput, 2), $CF, 1; 編集無効化
pos 155,82
input buf, ginfo_winx-155-15, 20
id_PathInput = stat; id保存
sendmsg objinfo(id_PathInput, 2), $CF, 1; 編集無効化
// listboxにフォーカスを合わせる
objsel id_WodiList
// ウィンドウサイズ変更時の割り込み
oncmd gosub *ReSize, 0x0005
stop
// ウィンドウサイズ変更時の割り込み
*ReSize
redraw 0
; 背景を塗りつぶす (一瞬端に黒いのが見える)
color windowColor,windowColor,windowColor :boxf :color
; 白の下地
color 255,255,255
boxf 135, 20, ginfo_winx-5, ginfo_winy-28
color
; mes
font "MSゴシック",12
pos 5,5
mes "リスト"
pos 145,26
mes "input:"
pos 145,68
mes "input:"
redraw 1
; listbox (ちかちかする)
sp = 130 , ginfo_winy-20 -23 -25 ,0,0
resizeobj id_WodiList, sp ,1
; input1
sp = ginfo_winx-155-15, 20 ,0,0
resizeobj id_TitleInput, sp, 1
; input2
sp = ginfo_winx-155-15, 20 ,0,0
resizeobj id_PathInput, sp ,1
return
背景を塗りつぶすときに、再描画を停止しているので、端が少しちらついてしまうようです。
かといって、redraw 0を消すと、次はmesの文字がちらついてしまいます。
listboxに関しては、仕様っぽいのですが、
あるソフトでは、ちかちかせずにリサイズされていたので、できるはずだと思います。。。
| |
|
2020/2/17(Mon) 21:57:35|NO.89502
すみません。
これでは質問の主旨がわかりにくかったですね。
教えてほしいことは、
どうすれば、リサイズ時にウィンドウの端に黒いのが見えたり、
ListBoxがチカチカなったりするのを無くせるのか、です。
|
|
2020/2/18(Tue) 08:20:06|NO.89506
こいるさん、申し訳ないが正常です。としか言えない結果なのです。
ウィンドウの端が黒くなってしまう現象は、ウィンドウその物の描画前にウィンドウの情報その物が持っている色情報で塗りつぶす時の黒くなってしまう問題。
(ウィンドウクラス(WNDCLASS)の hbrBackground を参照)
オブジェクトのリサイズ時にチカチカしてしまうのは、OSが原因なのか再描画の問題なのかが判断できないのです。
obj.as の resizeobj 命令が利用しているWin32 API 命令の _MoveWindow には、オブジェクトを再描画するかしないかのフラグがあります。
それを改良して、再描画しないようにしてみてはいかがでしょうか。
#deffunc resizeobj int v1,array v2,int v3,int v4
;================================================================================
; resizeobj n1,v2,n3 オブジェクトのサイズ変更
;
; n1 : オブジェクトのID
; v2 : サイズ、位置が入った数値変数
; n3 : 位置、サイズを変更しないかどうかのフラグ
; v4 : 再描画するかしないかのフラグ
;================================================================================
;
;<>説明
; オブジェクトn1のサイズを変更します。
; v2には幅、高さ、x座標,y座表の順に代入しておきます。
; n3を1にすると位置を変えずにサイズだけ変更します。
; n3を2にするとサイズを変えずに位置だけ変更します。
;
;例)
; button "width*2",wx2
; button "height*2",hx2
; input s,100,20
; ipt_id=2
; ;幅を40、高さを30にして(0,80)に移動する
; s=40,30,0,80
; resizeobj ipt_id,s
; stop
;*wx2
; ;幅を2倍にする
; getobjsize s,ipt_id
; s=s*2
; resizeobj ipt_id,s
; stop
;*hx2
; ;高さを2倍にする
; getobjsize s,ipt_id
; s.1=s.1*2
; resizeobj ipt_id,s
; stop
;
sx=v2(0):sy=v2(1):x=v2(2):y=v2(3)
if v3 {
getobjsize m,v1 ;getobjsizeでm.0からw,h,x,yが代入される
if stat=-1 : return stat
if v3=1 : x=m(2):y=m(3) ;位置を変更しない
if v3=2 : sx=m:sy=m(1) ;サイズを変更しない
}
_MoveWindow objinfo_hwnd(v1),x,y,sx,sy,v4
return stat
オブジェクトもウィンドウですので、ウィンドウの端と同じ現象が起きる場合は対策は難しいです。
また Windows の一部バージョンでは、オブジェクトその物の描画が強制描画になってしまうバグが存在するため、原因が判断できないのです。
| |
|
2020/2/18(Tue) 14:44:43|NO.89507
WM_SIZEはサイズ変更後にだけ送られるメッセージなんですが、
gosub〜returnの流れだとなぜか変更中も処理をする事になっていますね。
WM_SIZEとWM_SIZINGを明確に別けて使用するときは
goto〜stopの流れにしないといけないようです。
本題に関しましては
実行してみましたが、私の環境では「黒いの」や「ちらつき」は発生しませんでした。
(Windows10 バージョン1903)
一応、実行ファイル化し互換性モードでXPにする事で再現出来ましたが
MillkeyStarsさんが仰る通り環境次第のようですね。
拡張ウィンドウスタイルにWS_EX_COMPOSITEDを追加することで
ちらつきを軽減するという手法もあります。
#include "obj.as"
#define GWL_EXSTYLE -20 // 拡張ウィンドウスタイル
#define WS_EX_COMPOSITED 0x02000000 // ダブルバッファ
#uselib "user32.dll"
#cfunc GetWindowLong "GetWindowLongA" int, int
#func SetWindowLong "SetWindowLongA" int, int, int
// ウィンドウ
gsel 0,-1
screen 1, ginfo_dispx, ginfo_dispy, 0, 400, 500, 500, 200;サイズ変更可能
title "リサイズ時にいろいろちらつく"
// ウィンドウの描画をダブルバッファ化する(こちらは意味が無いかもしれない)
StyleEx = GetWindowLong(hWnd, GWL_EXSTYLE);
SetWindowLong hWnd, GWL_EXSTYLE, StyleEx | WS_EX_COMPOSITED;
// 背景を塗りつぶす
#define windowColor 240
color windowColor,windowColor,windowColor :boxf :color
; mes
pos 5,5
font "MSゴシック",12
mes "リスト"
; listbox
pos 0,20
objsize 130,ginfo_winy-20 -23 -25
listbox listSel,0,"A\nB"
id_WodiList = stat; id保存
// リストボックスの描画をダブルバッファ化してちらつきを抑える
StyleEx = GetWindowLong(objinfo(id_WodiList, 2), GWL_EXSTYLE);
SetWindowLong objinfo(id_WodiList, 2), GWL_EXSTYLE, StyleEx | WS_EX_COMPOSITED;
| |
|
2020/2/19(Wed) 19:51:16|NO.89514
割り込みをWM_SIZEからWM_SIZINGに変更して、
あらやさんが提示してくださったスクリプトを使用すると、
ウィンドウの端に見えていた黒のちらつきがなくなり、
リストボックスのチカチカも見事になくなりました!
皆さんありがとうございました!
|
|