|
|
2013/5/25(Sat) 18:31:19|NO.54280
かっこいいツールを作る為・・・影をつけとうとしましたが
メイン本体と影はできたのですが
メイン本体をクリックすると動いてしまいます。。
メイン本体を動かすと影はついてくるようにしたいです。
ただ、ウィンドウをクリックすると動いてしまうのを改善したいのですが
以下ソースコード、何が悪いのでしょうか><
/////////////////窓に影を作成////////////////////
#include "user32.as"
w_width = 320
w_height = 240
bgscr 0,w_width,w_height,0
color 255,255,255 : boxf
bgscr 1,w_width,w_height,0
color 0,0,0 : boxf
GetWindowLong hwnd,-20
SetWindowLong hwnd,-20,stat|$80000
SetLayeredWindowAttributes hwnd,0xffffff,128,3
z=7
gsel 0
gosub *ON_WINDOW_MOVE
*MAIN_ROUTINE
ps=s
stick s,256 : ts=ps^s : rs=ts&ps : ts&=s
if(s&512):end
gsel 0
if(ts&256):mx=ginfo_mx:my=ginfo_my:wx=ginfo_wx1-8:wy=ginfo_wy1-8:z=24
if(s&256):width ,,wx-mx+ginfo_mx,wy-my+ginfo_my:gosub *ON_WINDOW_MOVE
if(rs&256):z=8:width ,,ginfo_wx1+8,ginfo_wy1+8 :gosub *ON_WINDOW_MOVE
await 1
goto *MAIN_ROUTINE
*ON_WINDOW_MOVE
w_x=ginfo_wx1:w_y=ginfo_wy1
gsel 1
width ,,w_x+z,w_y+z
gsel 0,1
return
その他、かっこいいツールってどんなものを作ったらおもしろいですか!?
みなさんの意見なども聞きたいです^^
|
|
2013/5/25(Sat) 21:52:18|NO.54289
少しバグが有るかもですが、下のスクリプトで、ウィンドウズデフォルトの影をつけることが出来ます。
(hspの仕様上、自アプリケーションの全てのウィンドウに影がついてしまう)
#include "user32.as"
#define GCL_STYLE $FFFFFFE6
#define CS_DROPSHADOW 0x00020000
#define SWP_NOSIZE $00000001
#define SWP_NOMOVE $00000002
#define SWP_FRAMECHANGED $00000020
bgscr 1,,,2
GetClassLong hwnd,GCL_STYLE
SetClassLong hwnd,GCL_style,stat | CS_DROPSHADOW
SetWindowPos hwnd,0,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_FRAMECHANGED
gsel 1,1
|
|
2013/5/26(Sun) 00:47:53|NO.54294
ツノンさん
なるほど。確かにそれも影ですが
独自の方法でかっこいいツールを作りたいので自分で影を作ってみて
最小化ボタンもシステムを使わずに命令で行ってます。
そこでまた問題が二つ発生しました^^;
1つめ:
影はつけることできたんですが、最小化を押すと影が残ってしまいます。。
これはどう改善したらいいですかね。。
2つめ
これを起動して他のウィンドウを移動すると一緒に動いてしまいます・・・。
これも改善方法がわかりません。。
だれかご教授頂けたら嬉しいです!
ソース、めちゃくちゃ汚いですが・・・w
サンプルソース載せておきます^^
#uselib "kernel32.dll"
#include "hsp3util.as" ; テキスト表示
#include "kernel32.as"
#define ERROR_ALREADY_EXISTS $B7
#define PBS_MARQUEE 0x08
#define PBST_NORMAL 0x0001
#define PBST_ERROR 0x0002
#define PBST_PAUSED 0x0003
#define PBM_SETSTATE 0x0410
#define PBM_GETSTATE 0x0411
#define PBM_SETMARQUEE 0x040A
#uselib "user32.dll"
#func SetWindowLong "SetWindowLongA" int,int,int
#func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int,int,int,int
#func GetWindowLongA "GetWindowLongA" int , int
#func SetWindowLongA "SetWindowLongA" int , int , int
#func SetLayered "SetLayeredWindowAttributes" int , int , int , int
#func keybd_event "keybd_event" int, nullptr, int
bgscr 0,683,379,0,x,y : cls 1 ;BGScreenの値を1にする
objsize 18,18
pos 665,0
button gosub "─" ,*mini
w_width = 683
w_height = 379
bgscr 1,w_width,w_height,0
color 0,0,0 : boxf
GetWindowLongA hwnd,-20
SetWindowLongA hwnd,-20,stat|$80000
SetLayeredWindowAttributes hwnd,0xffffff,218,3
z=4
gsel 0
gosub *ON_WINDOW_MOVE
*MAIN_ROUTINE
ps=s
stick s,256 : ts=ps^s : rs=ts&ps : ts&=s
if(s&512):end
gsel 0
if(ts&256):mx=ginfo_mx:my=ginfo_my:wx=ginfo_wx1-0:wy=ginfo_wy1-0:z=4
if(s&256):width ,,wx-mx+ginfo_mx,wy-my+ginfo_my:gosub *ON_WINDOW_MOVE
if(rs&256):z=4:width ,,ginfo_wx1+0,ginfo_wy1+0 :gosub *ON_WINDOW_MOVE
await
goto *MAIN_ROUTINE
*ON_WINDOW_MOVE
w_x=ginfo_wx1:w_y=ginfo_wy1
gsel 1
width ,,w_x+z,w_y+z
gsel 0,1
return
*mini
; SC_MINIMIZE 最小化
sendmsg hwnd, $112, $F020
wait 200
; ウィンドウを元の位置に戻す(SC_RESTORE)
sendmsg hwnd, $112, $F120
stop
| |
|
2013/5/26(Sun) 01:55:11|NO.54296
/*ご参考(半透明の影で無くても良いのなら)*/
#include "gdi32.as"
#include "user32.as"
bgscr 0
_hwnd = hwnd
pos 640-64-10-2,2
button "x",*label_2
boxf 10,470,640,480
boxf 630, 10,640,480
;リージョンウインドウ
#if 0
CreateRectRgn 0, 0,630,470
_hRgn = stat
CreateRectRgn 10,10,640,480
_hRgn(1)= stat
CombineRgn _hRgn(0),_hRgn(0),_hRgn(1),2
SetWindowRgn hwnd ,_hRgn(0),1
#endif
;レイヤードウインドウ
#if 1
GetWindowLongA hwnd,-20
SetWindowLongA hwnd,-20,stat | $80000
SetLayeredWindowAttributes hwnd,$fe00fe,0,1
color $fe,$00,$fe
boxf 630, 0,640, 10
boxf 0,470, 10,480
#endif
onclick *label_1
stop
*label_1
sendmsg _hwnd,$A1,2
stop
*label_2
end
|
|
2013/5/26(Sun) 02:09:33|NO.54297
> 1つめ:
> 影はつけることできたんですが、最小化を押すと影が残ってしまいます。。
> これはどう改善したらいいですかね。。
これは簡単でしょう。
2つのウインドウのうち1つしか最小化してません。
次のように2つに対して最小化すれば良いでしょう。
*mini
; SC_MINIMIZE 最小化
gsel 1:sendmsg hwnd, $112, $F020
gsel 0:sendmsg hwnd, $112, $F020
wait 200
; ウィンドウを元の位置に戻す(SC_RESTORE)
gsel 1:sendmsg hwnd, $112, $F120
gsel 0:sendmsg hwnd, $112, $F120
stop
あとHSPソースの先頭行に<pre>を挿入したり、
最終行に</pre>を付ければタブ文字が表示されます。
(全部小文字で入力すること)
|
|
2013/5/26(Sun) 02:23:49|NO.54298
>>fortunehillさん
なかなかいい影ですねw
その影も使ってみます^^
>>ぴょぴょ
うほw
そんな簡単な事だったのか。。。
初心者なのでやっと仕組みが理解できました^^ありがとうございます
2つめ
これを起動して他のウィンドウを移動すると一緒に動いてしまいます・・・。
これも改善方法がわかりません。。
あとはこれですね・・・難しいです・・・;;
|
|
2013/5/26(Sun) 15:28:50|NO.54314
>if(rs&256):z=4:width ,,ginfo_wx1+0,ginfo_wy1+0 :gosub *ON_WINDOW_MOVE
これは必要ないんじゃないの?
|
|