|
|
2015/4/20(Mon) 13:42:42|NO.68666
特定の子ウィンドウを常に最前面表示(非アクティブ時にも最前面)
させたいです。私があまり理解できておらず質問がうまく出来ませんので
サンプルをのせます。
#uselib "user32"
#func SetParent "SetParent" int,int
screen 0,600,400 : hwnd0 = hwnd
screen 1,300,200,0,0,0 : hwnd1 = hwnd
SetParent hwnd1,hwnd0
screen 2,300,200,0,0,200 : hwnd2 = hwnd
SetParent hwnd2,hwnd0
title "常に上にしたい"
gsel 2,2
ウィンドウID=2をウィンドウID=1より常に上に表示させたいです。
やり方がわかる方ご教授よろしくお願いします。
|
|
2015/4/20(Mon) 19:20:59|NO.68670
これじゃダメなのかな・・
#uselib "user32"
#func SetParent "SetParent" int,int
screen 0,600,400 : hwnd0 = hwnd
screen 1,300,200,0,0,0 : hwnd1 = hwnd
SetParent hwnd1;,hwnd0
screen 2,300,200,0,0,200 : hwnd2 = hwnd
SetParent hwnd2;,hwnd0
title "常に上にしたい"
gsel 2,2
|
|
2015/4/20(Mon) 21:00:26|NO.68673
子ウィンドウの前面化は gsel 2,1 のようにするだけでヨイとおもいます。
子ウィンドウのばあい、ふつう最小化の問題とかはないわけですから。
あとは、一番前面にある子ウィンドウをどうやって調べるかだとおもいます。
#module "_chk_topwin"
#uselib "user32.dll"
#cfunc GetForegroundWindow "GetForegroundWindow"
#func GetWindow "GetWindow" sptr,sptr
#const GW_HWNDPREV $00000003
; 指定したウィンドウより Z オーダーが 1 つ上のウィンドウのハンドルを取得します。
; 指定したウィンドウが最前面ウィンドウの場合は、1 つ上の最前面ウィンドウのハンドルが返ります。
; 指定したウィンドウがトップレベルウィンドウの場合は、1 つ上のトップレベルウィンドウのハンドルが返ります。
; 指定したウィンドウが子ウィンドウの場合は、1 つ上の兄弟ウィンドウのハンドルが返ります。
#cfunc IsWindowVisible "IsWindowVisible" sptr ; WS_VISIBLE スタイルを持つ場合は、0 以外の値が返ります。
;---------------------------------------------------------------
; 指定した複数のウィンドウのどれが最前面か調べる
; フォーカスを失っているウィンドウでも最善面かどうか判定できる
; 指定された兄弟ウィンドウを総当りして、自分よりZOrder上のウィンドウが存在しないかないか調べている
;---------------------------------------------------------------
#defcfunc chk_topwin_sel array v ; 新関数「chk_topwin_sel」を生成
; array v : 前面かどうか調べるウィンドウを先頭にして兄弟ウィンドウをセット
; 戻り値 : 1 最前面
hwmd_tmp=v(0)
ret=0
if hwmd_tmp == GetForegroundWindow() {
; 最前面ウィンドウである
ret=1
}else{
if IsWindowVisible(hwmd_tmp) {
; 表示されているがフォーカスを失っているばあい
ret=1
dim list_hws,8 : list_hws=v(1),v(2),v(3),v(4),v(5),v(6),v(7)
repeat
GetWindow hwmd_tmp,GW_HWNDPREV ; ZOrderがひとつ上のウィンドウを調べる
hwnd_prev=stat
if hwnd_prev {
if IsWindowVisible(hwnd_prev) {
; 手前に可視のウィンドウが存在する
repeat 8,0
hwnd_cnt=list_hws(cnt)
if hwnd_cnt == 0 : break
if hwnd_prev == hwnd_cnt {
; 手前の可視のウィンドウは引数リストの2番目以降のいずれかのウィンドウである
ret=0
break
}
loop
; 手前のウィンドウは可視ウィンドウであっても引数リストの2番目以降のいずれかのウィンドウではない
}
hwmd_tmp=hwnd_prev ; ZOrderがもうひとつ上のウィンドウを調べる
}else{
; ZOrderがひとつ上のウィンドウがもう存在しなければ最前面と判断する
break
}
loop
}
}
return ret
#global
#uselib "user32"
#func SetParent "SetParent" int,int
screen 0,600,400 : hwnd0 = hwnd
screen 1,300,200,0,0,0 : hwnd1 = hwnd
SetParent hwnd1,hwnd0
screen 2,300,200,0,0,200 : hwnd2 = hwnd
SetParent hwnd2,hwnd0
title "常に上にしたい"
*mainloop
wait 1
dim v,8 : v=hwnd2,hwnd1
if chk_topwin_sel(v) == 0 : gsel 2,1
goto *mainloop
| |
|
2015/4/20(Mon) 21:43:10|NO.68675
返信ありがとうございます。
>窓月らら さん
説明不足で申し分けないです。親子関係を維持したままを考えています。
>woodfields さん
モジュール化までしていただき有難うございます。早速使ってみたのですが、
#module "_chk_topwin"
#uselib "user32.dll"
#cfunc GetForegroundWindow "GetForegroundWindow"
#func GetWindow "GetWindow" sptr,sptr
#const GW_HWNDPREV $00000003
; 指定したウィンドウより Z オーダーが 1 つ上のウィンドウのハンドルを取得します。
; 指定したウィンドウが最前面ウィンドウの場合は、1 つ上の最前面ウィンドウのハンドルが返ります。
; 指定したウィンドウがトップレベルウィンドウの場合は、1 つ上のトップレベルウィンドウのハンドルが返ります。
; 指定したウィンドウが子ウィンドウの場合は、1 つ上の兄弟ウィンドウのハンドルが返ります。
#cfunc IsWindowVisible "IsWindowVisible" sptr ; WS_VISIBLE スタイルを持つ場合は、0 以外の値が返ります。
;---------------------------------------------------------------
; 指定した複数のウィンドウのどれが最前面か調べる
; フォーカスを失っているウィンドウでも最善面かどうか判定できる
; 指定された兄弟ウィンドウを総当りして、自分よりZOrder上のウィンドウが存在しないかないか調べている
;---------------------------------------------------------------
#defcfunc chk_topwin_sel array v ; 新関数「chk_topwin_sel」を生成
; array v : 前面かどうか調べるウィンドウを先頭にして兄弟ウィンドウをセット
; 戻り値 : 1 最前面
hwmd_tmp=v(0)
ret=0
if hwmd_tmp == GetForegroundWindow() {
; 最前面ウィンドウである
ret=1
}else{
if IsWindowVisible(hwmd_tmp) {
; 表示されているがフォーカスを失っているばあい
ret=1
dim list_hws,8 : list_hws=v(1),v(2),v(3),v(4),v(5),v(6),v(7)
repeat
GetWindow hwmd_tmp,GW_HWNDPREV ; ZOrderがひとつ上のウィンドウを調べる
hwnd_prev=stat
if hwnd_prev {
if IsWindowVisible(hwnd_prev) {
; 手前に可視のウィンドウが存在する
repeat 8,0
hwnd_cnt=list_hws(cnt)
if hwnd_cnt == 0 : break
if hwnd_prev == hwnd_cnt {
; 手前の可視のウィンドウは引数リストの2番目以降のいずれかのウィンドウである
ret=0
break
}
loop
; 手前のウィンドウは可視ウィンドウであっても引数リストの2番目以降のいずれかのウィンドウではない
}
hwmd_tmp=hwnd_prev ; ZOrderがもうひとつ上のウィンドウを調べる
}else{
; ZOrderがひとつ上のウィンドウがもう存在しなければ最前面と判断する
break
}
loop
}
}
return ret
#global
#uselib "user32"
#func SetParent "SetParent" int,int
screen 0,600,400 : hwnd0 = hwnd
screen 1,550,300,0,0,0 : hwnd1 = hwnd
SetParent hwnd1,hwnd0
x = "ここに文字を入力したい"
input x,200,20
screen 2,550,300,0,0,100 : hwnd2 = hwnd
SetParent hwnd2,hwnd0
y = "ここに文字を入力したい"
input x,200,20
screen 3,250,300,0,300,0 : hwnd3 = hwnd
SetParent hwnd3,hwnd0
title "常に上にしたい"
*mainloop
wait 1
dim v,8 : v=hwnd3,hwnd1,hwnd2
if chk_topwin_sel(v) == 0 : gsel 3,1
goto *mainloop
この方法だと最前面のウィンドウが常にアクティブとなりほかの兄弟が操作できません。
非アクティブのまま前面にすることは不可能でしょうか...
| |
|
2015/4/21(Tue) 10:05:50|NO.68682
兄弟ではどちらかしか入力できませんので、
#uselib "user32"
#func SetParent "SetParent" int,int
#func GetWindowLong "GetWindowLongA" sptr,sptr
#func SetWindowLong "SetWindowLongA" sptr,sptr,sptr
#const GWL_STYLE $FFFFFFF0 ; -16 ウィンドウスタイル
#const WS_POPUP $80000000 ; ポップアップウィンドウを作成します。このスタイルは、WS_CHILD スタイルと一緒には使えません。
#const WS_CHILD $40000000 ; 子ウィンドウを作成します。このスタイルは、WS_POPUP スタイルと一緒には使えません。
screen 0,600,400 : hwnd0=hwnd
bgscr 10,600,400 : hwnd10=hwnd
GetWindowLong hwnd10, GWL_STYLE : SetWindowLong hwnd10, GWL_STYLE, stat ^ WS_POPUP | WS_CHILD
SetParent hwnd10,hwnd0
w = "ここに文字を入力したい"
input w,200,20
pos 200,0 : button gosub "button",*lb_btn
screen 1,550,200,0,0,50 : hwnd1=hwnd
SetParent hwnd1,hwnd10
x = "ここに文字を入力したい"
input x,200,20
pos 200,0 : button gosub "button",*lb_btn
screen 2,550,200,0,0,100 : hwnd2=hwnd
SetParent hwnd2,hwnd10
y = "ここに文字を入力したい"
input x,200,20
pos 200,0 : button gosub "button",*lb_btn
screen 3,300,300,0,300,50 : hwnd3=hwnd
SetParent hwnd3,hwnd0
title "常に上にしたい"
z = "ここに文字を入力したい"
input z,200,20
pos 200,0 : button gosub "button",*lb_btn
stop
*lb_btn
dialog "ボタン押したヨ"
return
| |
|
2015/4/21(Tue) 20:36:56|NO.68690
woodfields さん有難うございます。
無事私のイメージしていたとおりの動作をしました。
|
|