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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0830
るっちぃ二つのウィンドウ(bgscr)を同時に動かす16解決


るっちぃ

リンク

2012/8/30(Thu) 06:10:42|NO.48918

今回難問に直面し、いろいろなワードで検索をかけていましたが・・・
当方初心者ということもあって、一向に問題が解決いたしません。
そこでこちらの掲示板に、はじめて質問させていただきます。

問題は、bgscrで枠のないウィンドウを二つ作成し、「ドラッグで二つ同時に移動させる(連動させる)」ということです。

最終的に何がやりたいのかというと、
http://d.hatena.ne.jp/satosystems/20100108/1262947730
こちらのような"背景が半透明の黒のウィンドウに、不透明なオブジェクトを表示"し、ウィンドウをドラッグすることです!

半透明の黒のウィンドウに不透明なオブジェクトを表示させるだけでしたら成功したのですが、
そこからドラッグするという操作を付け加えることができず、苦戦しております・・・。

どなたかお詳しい方がいらっしゃいましたら、どうか、お力をお貸しいただけないでしょうか?
皆様のご回答お待ちしております。



この記事に返信する


mamo

リンク

2012/8/30(Thu) 08:07:56|NO.48919

googleで「hsp bgscr 移動」を検索すれば参考になるページがたくさん見つかると思うよ。



るっちぃ

リンク

2012/8/30(Thu) 08:51:29|NO.48920

ご回答ありがとうございます。
当方そのワードで検索済でございます。
3ページ4ページにわたり検索はしておりませんが、なにぶん初心者なものでそれらしい解答に行きつきませんでした・・・。
もう少しヒントをいただけないでしょうか?



mamo

リンク

2012/8/30(Thu) 11:27:15|NO.48925

一つのウィンドウならクリック&移動が出来ている状態だということ?



fortunehill

リンク

2012/8/30(Thu) 13:46:01|NO.48929

/*こんな感じかな?(SetParentで簡単じゃんと思ったら透過フォームは動かないのね)*/

#include "user32.as" bgscr 1,320,240 :h1 = hwnd :boxf :SetWindowLongA h1,-20,$80000 :SetLayeredWindowAttributes h1,0,128,2 ;透過ウインドウ :oncmd gosub *label,$201 ;ドラック割り込み bgscr 2,320,240 :h2 = hwnd :color 255 :boxf 10,10,310,230 ; :color 255,255 :boxf 100,80,200,180 :pos 90,90 :picload dirinfo(1)+"/hsptv/onibtn.gif",1 ;(hsp3.3 RC1) :SetWindowLongA h2,-20, $80000 :SetLayeredWindowAttributes h2,255,0,1 ;透過色ウインドウ(赤) :dim nn,4 :SetTimer h2,100,10,0 ;タイマー :oncmd gosub *label_1,$113 gsel 0 :onexit *label_2 stop *label :sendmsg h1,$A1,2 return *label_1 :GetWindowRect h1,varptr(nn) :SetWindowPos h2,0,nn,nn(1),0,0,1 return *label_2 :KillTimer h2,100 end



るっちぃ

リンク

2012/8/30(Thu) 14:07:28|NO.48930

>mamo様
おっしゃるとおり、一つのウィンドウでしたら移動させることに成功しております。
例えばAとBのウィンドウがありまして、Aのウィンドウをドラッグで右に10移動させると、Bのウィンドウも動きに合わせて10移動する、といった具合に動作させたいのです。

>fortunehill様
長いプログラムを開発いただきまして、誠にありがとうございます。
fortunehill様のプログラムを拝借し、実行してみたのですが・・・(画像部分はエラったので代用しました)
画像部分および背景が半透明の黒の部分をドラッグしても反応はありませんでした・・・。
また、API、というのですかね、私は最近知ったばかりなので本プログラムを詳細に解読できませんでした。
(わかったのはSetWindowPosのところで設定しているのかな?くらいです・・)

おふたりともありがとうございます。
初心者に上級なことを教えるのはさぞかし難しいかもしれませんが、これができることによってできるツールの幅が広がるのです><
何卒、よろしくお願い申し上げます!



@key

リンク

2012/8/30(Thu) 19:08:40|NO.48939

waitを入れる前の座標をそれぞれのウィンドウごとに別の変数に記録しておいて、
各ウィンドウごとに、別のウィンドウの前と後の座標の差(xとy)をxとyに加算すれば
連動して動くように見えるはずです
説明下手ですいません

サンプル

screen 1,200,200,0,10,10 screen 2,200,200,0,50,50 repeat gsel 1 : x1=ginfo(4) : y1=ginfo(5) gsel 2 : x2=ginfo(4) : y2=ginfo(5) wait 1 gsel 1 : x11=ginfo(4) : y11=ginfo(5) gsel 2 : x22=ginfo(4) : y22=ginfo(5) gsel 1 : width ,,ginfo(4)+(x22-x2),ginfo(5)+(y22-y2) gsel 2 : width ,,ginfo(4)+(x11-x1),ginfo(5)+(y11-y1) loop



DW

リンク

2012/8/30(Thu) 19:09:51|NO.48940

こんなのでどうでしょうか...。半透明にもなっています。 見当違いでしたらすみません。


#define WM_LBUTTONDOWN 0x0201 ;マウス左ボタンを押し下げ ;(ウィンドウの透明度設定用) #uselib "user32.dll" #func SetWindowLongA "SetWindowLongA" int,int,int #func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int,int,int,int #const LWA_COLORKEY 1 ;透明色を指定 #const LWA_ALPHA 2 ;アルファー値を指定 #const GWL_EXSTYLE -20 ;拡張ウィンドウスタイル #const WS_EX_LAYERED $00080000 ;透明なウィンドウ属性 #const WS_EX_LEFT 0x00000000 ;一般的なウィンドウ属性 *start bgscr 0,400,400,0 SetWindowLongA hwnd,GWL_EXSTYLE,WS_EX_LAYERED;透明なウィンドウ属性を付加 SetLayeredWindowAttributes hwnd,0,140,LWA_ALPHA;透明度を100に設定 color 255,0,0 : boxf font msgothic,40,1+16 color 0,0,0 : mes "ウィンドウ0\n\n\n\nマウスでドラックで\nきます" oncmd gosub *移動 ,WM_LBUTTONDOWN;ウィンドウメッセージ登録。発動したら「*移動」へ。 width , ,100,100 num1(0) = ginfo(4),ginfo(5) bgscr 1,200,200,0 SetWindowLongA hwnd,GWL_EXSTYLE,WS_EX_LAYERED;透明なウィンドウ属性を付加 SetLayeredWindowAttributes hwnd,0,200,LWA_ALPHA;透明度を200に設定 color 0,0,255 : boxf font msgothic,30,1+16 color 0,0,0 : mes "ウィンドウ1" width , ,num1(0) + 400,num1(1) + 400 stop *移動 gsel 0,0 num2(0) = mousex,mousey repeat gsel 0,0 width , ,ginfo(0) - num2(0),ginfo(1) - num2(1);ウインドウ0の移動 gsel 1,0 width , ,ginfo(0) - num2(0) + 400,ginfo(1) - num2(1) + 400;ウインドウ1の移動 getkey num3,1 if num3 = 0 : break;マウスの左クリックが終わっていたらループを抜けて帰る。 await 10 loop return



cats

リンク

2012/8/30(Thu) 19:18:20|NO.48941

考えていたら凄い雑になってしまった気がします・・・

#uselib "winmm.dll" #cfunc timegettime "timeGetTime" #define mmtime (timegettime()-t@mtime) #define resetmmtime(%1=0) t@mtime=timegettime()-%1 bgscr 0,200,200,4,0,0:color 255:boxf bgscr 1,200,200,4,200,0:color ,,255:boxf resetmmtime *main stick key,256 if key=256{ count++ gsel 1,1:color ,,255:boxf:width ,,px+ginfo_mx+200, py+ginfo_my pos 0,0:color:mes ""+count gsel 0,1:color 255:boxf:width ,,px+ginfo_mx, py+ginfo_my } await 10 goto *main



るっちぃ

リンク

2012/8/30(Thu) 20:57:07|NO.48944

>@key様
プログラムを開発してくださり、ありがとうございます!
@key様が開発くださったプログラムを実行したところ、「ウィンドウを移動した”後”にもう一つのウィンドウの座標が決定」されるようですが、
私がしたいのは「ウィンドウを移動している”最中”もリアルタイムにもう一つウィンドウがついてくる」ことです!
しかしながらこちらのプログラムも参考にさせていただきますね!

!!新たな疑問!!
>DW様
プログラムを開発してくださり、ありがとうございます!
おお、これこそが私が求めていた「やりたいこと」です!!
なるほど、マウスクリックのループ中にwidthを作り、座標を更新・・・ですか!
素晴らしい出来栄えでした。

ただ一つ、疑問点がございます。
DW様が開発してくださったプログラムを少し改造しました。
というのは青いウィンドウ(ウィンドウ1)を不透明にし、赤いウィンドウ(ウィンドウ0)の上にのせ、
gsel 1,2
で常に青いウィンドウを手前表示させた状態で、
「赤い部分をつまんでもウィンドウを移動できる」
且つ
「赤い部分を選択してしまってもウィンドウをちらつかせない(選択すると一瞬赤いウィンドウが手前になり、青い部分が紫っぽくなってしまいます)」
ということはできますでしょうか?

やりたいことにぐんと近づいたと思います。DW様、本当にありがとうございました!

>cats様
プログラムを開発してくださり、ありがとうございます!
cats様のプログラムも素晴らしい出来栄えでした。
本当にありがとうございます。
ただ、先ほどDW様にも申し上げましたとおり、私はウィンドウ2つを重ねた状態で使用します。
そうなるとやはりドラッグするときに、ウィンドウ同士がちらついてしまいます。
どうにかしてチラツキを抑えることはできませんでしょうか?
cats様のプログラムでいうと、赤いウィンドウ、青いウィンドウどちらをつまんでも移動でき、青いウィンドウがちらつくことなく常に手前に表示する、ということです!

皆様、本当にありがとうございます。
皆様の知識のおかげでHSP上にてできることが増えました!
本当にありがとうございます。

ウィンドウのチラツキ、任意のウィンドウを常に手前表示についてですが、
redrawで一つの画面上のみのチラツキを抑えることは知っておりましたが、ウィンドウ同士のチラツキはどうやって抑えるか検討がつきません・・・。
どうか、もうしばらくお付き合いをお願い申し上げます。



cats

リンク

2012/8/30(Thu) 21:47:00|NO.48950

無理やりですが・・・
細かいところは修正してください

#uselib "winmm.dll" #cfunc timegettime "timeGetTime" #define mmtime (timegettime()-t@mtime) #define resetmmtime(%1=0) t@mtime=timegettime()-%1 bgscr 0,200,200,4,0,0:color 255:boxf bgscr 1,200,200,4,100,0:color ,,255:boxf resetmmtime *main stick key,256 if key=256{ count++ gsel 1,1:color ,,255:boxf:width ,,ginfo_mx+100,ginfo_my gsel 0,2:color 255:boxf:width ,,ginfo_mx,ginfo_my } if key=0:gsel 0,1 await 10 goto *main



DW

リンク

2012/8/30(Thu) 23:41:59|NO.48952

>ただ一つ、疑問点がございます。
> DW様が開発してくださったプログラムを少し改造しました。
> というのは青いウィンドウ(ウィンドウ1)を不透明にし、赤いウィンドウ(ウィンドウ0)の上にのせ、
> gsel 1,2
> で常に青いウィンドウを手前表示させた状態で、
> 「赤い部分をつまんでもウィンドウを移動できる」
> 且つ
> 「赤い部分を選択してしまってもウィンドウをちらつかせない(選択すると一瞬赤いウィンドウが手前になり、青い部分が紫っぽくなってしまいます)」
> ということはできますでしょうか?


ウインドウに前後関係についての序列をつけるということでしょうか?

今の私には出来ませんが、WinAPIを使えばできると思います。HSP製ではありませんが、世の中に
出回っているソフトの中にはどうやらそのような仕組みになっているんじゃないか、と思われる
ものがよくあります。
私も過去にウインドウの前後関係についての序列を設定できたらいいなぁと思って挑戦し、いろ
いろと探したWinAPIで「Zオーダー」なるものをいじってみましたが、クリックすると元に
戻ってしまいました。(結局ただの gsel みたいになってしまったということです。)

...アドバイスになっているかどうか分からなくなってしまいました。ごめんなさい。
正直私も質問したいぐらいです(笑)



DW

リンク

2012/8/31(Fri) 00:18:17|NO.48953

眠いです(笑)
根性で書きました。これでどうでしょう?
かなり強引な方法でウインドウの上下関係を固定しています。
先ほど私が述べた「Zオーダー」を"ひっきりなし"に再設定しています。
例えが変ですが、「相手が身動きがとれないくらい高速で連続パンチを食わす」というところでしょうか。



#define WM_LBUTTONDOWN 0x0201 ;マウス左ボタンを押し下げ ;(ウィンドウの透明度設定用) #uselib "user32.dll" #func SetWindowLongA "SetWindowLongA" int,int,int #func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int,int,int,int #const LWA_COLORKEY 1 ;透明色を指定 #const LWA_ALPHA 2 ;アルファー値を指定 #const GWL_EXSTYLE -20 ;拡張ウィンドウスタイル #const WS_EX_LAYERED $00080000 ;透明なウィンドウ属性 #const WS_EX_LEFT 0x00000000 ;一般的なウィンドウ属性 ;(Zオーダー変更用) #define SWP_NOMOVE 0x0002 ;位置値無視 #define SWP_NOSIZE 0x0001 ;サイズ値無視 ;#define HWND_TOP 0 ;最前面 ;#define HWND_TOPMOST -1 ;究極の最前面 #func SetWindowPos "SetWindowPos" int ,int ,int ,int ,int ,int ,int *start bgscr 0,400,400,0 hwnd0 = hwnd SetWindowLongA hwnd,GWL_EXSTYLE,WS_EX_LAYERED;透明なウィンドウ属性を付加 SetLayeredWindowAttributes hwnd,0,140,LWA_ALPHA;透明度を100に設定 color 255,0,0 : boxf font msgothic,40,1+16 color 0,0,0 : mes "ウィンドウ0\n\n\n\nマウスでドラックで\nきます" oncmd gosub *移動 ,WM_LBUTTONDOWN;ウィンドウメッセージ登録。発動したら「*移動」へ。 width , ,100,100 num1(0) = ginfo(4),ginfo(5) bgscr 1,200,200,0 hwnd1 = hwnd color 0,0,255 : boxf font msgothic,30,1+16 color 0,0,0 : mes "ウィンドウ1" width , ,num1(0) + 100,num1(1) + 100 gsel 0,1 : SetWindowPos hwnd0 ,hwnd1 ,0 ,0 ,0 ,0 ,SWP_NOSIZE |SWP_NOMOVE;まず一回だけ叩く。先頭の「gsel 0,1」が何であるかっていうと、「SetWindowPos」はアクティブなウィンドウに対してのみ効力を有するから。(合ってる筈...) stop *移動 SetWindowPos hwnd0 ,hwnd1 ,0 ,0 ,0 ,0 ,SWP_NOSIZE |SWP_NOMOVE;最初のパンチ gsel 0,0 num2(0) = mousex,mousey repeat SetWindowPos hwnd0 ,hwnd1 ,0 ,0 ,0 ,0 ,SWP_NOSIZE |SWP_NOMOVE;連続パンチ gsel 0,0 width , ,ginfo(0) - num2(0),ginfo(1) - num2(1);ウインドウ0の移動 gsel 1,0 width , ,ginfo(0) - num2(0) + 100,ginfo(1) - num2(1) + 100;ウインドウ1の移動 getkey num3,1 if num3 = 0 : break;マウスの左クリックが終わっていたらループを抜けて帰る。 await 10 loop return



774

リンク

2012/8/31(Fri) 00:53:00|NO.48954

NO.48918の参照先にあるように、不透明ウィンドウを子ウィンドウとして
マウスメッセージを丸投げしてしまってはどうでしょうか?

#uselib "user32.dll" #func _SetParent "SetParent" sptr,sptr #func _ReleaseCapture "ReleaseCapture" *start bgscr 0,400,400 : wParent = hwnd : color 255 : boxf font "IMPACT",24,16 : hsvcolor ,,255 : mes " Back (Parent)\n ESC:exit" oncmd gosub *移動,$0201 /* WM_LBUTTONDOWN */ oncmd gosub *終了,$0101 /* WM_KEYUP */ bgscr 1,200,200 : wChild = hwnd : color ,,255 : boxf font "IMPACT",24,16 : hsvcolor ,,255 : mes " Front (Child)" oncmd gosub *移動,$0201 /* WM_LBUTTONDOWN */ oncmd gosub *終了,$0101 /* WM_KEYUP */ _SetParent wChild,wParent : width ,, 100, 100 stop *移動 _ReleaseCapture SendMsg wParent, $A1, $02, 0 ;hWnd,WM_NCLBUTTONDOWN,HTCAPTION,0 return *終了 if wparam=27 {end} return



fortunehill

リンク

2012/8/31(Fri) 06:24:57|NO.48957

/*WM_NCLBUTTONDOWN,HTCAPTIONのドラッグ+タイマーを辞めて(NO.48953)DW氏をパクった物*/
/*透過色フォームにも同じ割り込みを追加した*/


#include "user32.as" bgscr 1,320,240 :h1 = hwnd :boxf :SetWindowLongA h1,-20,$80000 :SetLayeredWindowAttributes h1,0,128,2 :oncmd gosub *label,$201 bgscr 2,320,240 :h2 = hwnd :color 255 :boxf 10,10,310,230 ; :color 255,255 :boxf 100,80,200,180 ;(黄色■) :pos 90,90 :picload dirinfo(1)+"/sample/demo/onibtn.gif",1 ;(hsp3.3) ;pos 90,90 :picload dirinfo(1)+"/hsptv/onibtn.gif",1 ;(hsp3.31RC1) :SetWindowLongA h2,-20, $80000 :SetLayeredWindowAttributes h2,255,0,1 :oncmd gosub *label,$201 :dim nn,5 stop *label :GetCursorPos varptr(nn) :ScreenToClient h1,varptr(nn) repeat :SetWindowPos h1,h2,0,0,0,0,3 :GetCursorPos varptr(nn)+8 :nn(2) -= nn :nn(3) -= nn(1) :SetWindowPos h1,0,nn(2),nn(3),0,0,1|20 :SetWindowPos h2,0,nn(2),nn(3),0,0,1|20 :getkey nn(4),1 :if (nn(4) == 0) {break} :await 10 loop return



るっちぃ

リンク

2012/8/31(Fri) 16:25:20|NO.48968

>cats様
ありがとうございます!
ちらつきを抑えられていますね!
これはのちに参考にさせていただきます!

>DW様
眠い目をこすりつつ開発してくださいまして、本当にありがとうございます!
大変参考になるプログラムかと存じ上げます!
赤い部分をドラッグして移動させることはできたのですが、青い部分をドラッグしても反応がありませんでした!
なのでちょっとプログラムを改造しようと思いましたが・・・
774様が開発してくださったので、774様を参考にしたいとおもいます!
本当にありがとうございました!


>774様
プログラムを開発してくださいまして、ありがとうございます!
いやはや、脱帽です。
これこそが"私のやりたかったこと"です!
しかもプログラムがとても短いことに驚きました。
さらにもう一つ、タスクバーに表示されるウィンドウが「1つ」ということにも大変ありがたく思いました。
こちらをベースにさせていただきまして、私のプログラムを開発していこうと思います!
本当にありがとうございます!

>fortunehill様
ありがとうございます!
こちらのプログラムも私のやりたかったことが実現されていました!
背景が半透明、その上に不透明なオブジェクト。
そして「どこをクリックしても移動できる」
まさにこれです!
大変すばらしいできかと存じ上げます。

皆様大変参考になるプログラムでした。
cats様、DW様、774様、fortunehill様が最後に決定打をくださいましたので、
これにて「解決」ということにさせていただきます!!
今一度、本当にありがとうございました!!



るっちぃ

リンク

2012/8/31(Fri) 16:28:15|NO.48969

-独り言-

今更ながら DW様のプログラムにあります、「パンチ」表現がかわいらしくて笑いましたw
とてもユニークですね!



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