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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0420
 子ウィンドウの最前面表示5解決


 

リンク

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



woodfields

リンク

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

この方法だと最前面のウィンドウが常にアクティブとなりほかの兄弟が操作できません。
非アクティブのまま前面にすることは不可能でしょうか...



woodfields

リンク

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 さん有難うございます。
無事私のイメージしていたとおりの動作をしました。



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