|
|
2012/8/30(Thu) 06:10:42|NO.48918
今回難問に直面し、いろいろなワードで検索をかけていましたが・・・
当方初心者ということもあって、一向に問題が解決いたしません。
そこでこちらの掲示板に、はじめて質問させていただきます。
問題は、bgscrで枠のないウィンドウを二つ作成し、「ドラッグで二つ同時に移動させる(連動させる)」ということです。
最終的に何がやりたいのかというと、
http://d.hatena.ne.jp/satosystems/20100108/1262947730
こちらのような"背景が半透明の黒のウィンドウに、不透明なオブジェクトを表示"し、ウィンドウをドラッグすることです!
半透明の黒のウィンドウに不透明なオブジェクトを表示させるだけでしたら成功したのですが、
そこからドラッグするという操作を付け加えることができず、苦戦しております・・・。
どなたかお詳しい方がいらっしゃいましたら、どうか、お力をお貸しいただけないでしょうか?
皆様のご回答お待ちしております。
|
|
2012/8/30(Thu) 08:07:56|NO.48919
googleで「hsp bgscr 移動」を検索すれば参考になるページがたくさん見つかると思うよ。
|
|
2012/8/30(Thu) 08:51:29|NO.48920
ご回答ありがとうございます。
当方そのワードで検索済でございます。
3ページ4ページにわたり検索はしておりませんが、なにぶん初心者なものでそれらしい解答に行きつきませんでした・・・。
もう少しヒントをいただけないでしょうか?
|
|
2012/8/30(Thu) 11:27:15|NO.48925
一つのウィンドウならクリック&移動が出来ている状態だということ?
|
|
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のところで設定しているのかな?くらいです・・)
おふたりともありがとうございます。
初心者に上級なことを教えるのはさぞかし難しいかもしれませんが、これができることによってできるツールの幅が広がるのです><
何卒、よろしくお願い申し上げます!
|
|
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
|
|
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
| |
|
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で一つの画面上のみのチラツキを抑えることは知っておりましたが、ウィンドウ同士のチラツキはどうやって抑えるか検討がつきません・・・。
どうか、もうしばらくお付き合いをお願い申し上げます。
| |
|
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
|
|
2012/8/30(Thu) 23:41:59|NO.48952
>ただ一つ、疑問点がございます。
> DW様が開発してくださったプログラムを少し改造しました。
> というのは青いウィンドウ(ウィンドウ1)を不透明にし、赤いウィンドウ(ウィンドウ0)の上にのせ、
> gsel 1,2
> で常に青いウィンドウを手前表示させた状態で、
> 「赤い部分をつまんでもウィンドウを移動できる」
> 且つ
> 「赤い部分を選択してしまってもウィンドウをちらつかせない(選択すると一瞬赤いウィンドウが手前になり、青い部分が紫っぽくなってしまいます)」
> ということはできますでしょうか?
ウインドウに前後関係についての序列をつけるということでしょうか?
今の私には出来ませんが、WinAPIを使えばできると思います。HSP製ではありませんが、世の中に
出回っているソフトの中にはどうやらそのような仕組みになっているんじゃないか、と思われる
ものがよくあります。
私も過去にウインドウの前後関係についての序列を設定できたらいいなぁと思って挑戦し、いろ
いろと探したWinAPIで「Zオーダー」なるものをいじってみましたが、クリックすると元に
戻ってしまいました。(結局ただの gsel みたいになってしまったということです。)
...アドバイスになっているかどうか分からなくなってしまいました。ごめんなさい。
正直私も質問したいぐらいです(笑)
|
|
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
| |
|
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
|
|
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
とてもユニークですね!
|
|