|
 |
|
2011/2/12(Sat) 00:14:58|NO.37020
背景を透過させてPNGファイルを表示したいのですが・・・
透明部分が白になってしまって上手く行きません。
#include "mod_img.as"
bgscr 0,400,400,,
dialog "png", 16
if stat = 0 : stop
imgload refstr
stop
そこで不定形リージョンのサンプルを使って、
; ※888さん作成の2.6x版をHSP3用に移植したものです。
#include "mod_img.as"
#uselib "user32.dll"
#func SetWindowLong "SetWindowLongA" int,int,int
hwnd_=hwnd
screen 3,,,10
SetWindowLong hwnd_,-8,hwnd
buffer 3,1,1,2
#uselib "user32.dll"
#func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int,int,int,int
#const LWA_COLORKEY 1
#const LWA_ALPHA 2
#const GWL_EXSTYLE -20
#const WS_EX_LAYERED $00080000
#module
#uselib "kernel32.dll"
#cfunc LoadLibrary "LoadLibraryA" sptr
#cfunc GetProcAddress "GetProcAddress" int,sptr
#func FreeLibrary "FreeLibrary" int
#deffunc dllload str prm1
pdll=LoadLibrary(prm1)
if pdll==0 : return -1
return pdll
#deffunc funcprocadr var prm1,int prm2,str prm3
funcptr=GetProcAddress(prm2,prm3)
if funcptr==0 : return -1
prm1=funcptr
return 0
#deffunc funcproc var prm1,array prm2,int prm3,int prm4
prm1=callfunc (prm2,prm3,prm4)
return 0
#deffunc dllfree int prm1
FreeLibrary prm1
return
#global
#uselib "kernel32.dll"
#func VirtualProtect "VirtualProtect" var,int,int,var
#define xdim(%1,%2)dim %1,%2 : VirtualProtect %1,(%2)*4,$40,AZSD
#define obj_wmnclbtndown sendmsg hwnd,$00A1,2,0
gsel 0,-1
*load
bgscr 2,,,2
dialog " *",16: if stat!1 : end
picload refstr
alpha = 255 ; 0〜255
SetWindowLong hwnd,-20,WS_EX_LAYERED
SetLayeredWindowAttributes hwnd,0,alpha,LWA_ALPHA
pget 0,0
color ginfo(16),ginfo(17),ginfo(18)
xdim code,153
code(0) =$83EC8B55,$5653B8C4,$C458B57,$508B188B,$E0558904,$8908488B,$508BDC4D,$D855890C
code(8) =$8910488B,$508BD44D,$D0558914,$8918488B,$408BCC4D,$C845891C,$8B08458B,$55891450
code(16) =$84D8BC4,$890C418B,$558BC045,$44A8B08,$8BBC4D89,$508B0845,$B8558908,$8B084D8B
code(24) =$A081,$FC458900,$C07D83,$45C70974,$01EC,$C707EB00,$3EC45,$558B0000
code(32) =$55AF0FBC,$E85589EC,$81E84D8B,$03E1,$49057980,$41FCC983,$04B8,$25C12B00
code(40) =$80000003,$83480579,$8940FCC8,$45C7E845,$64F8,$F8558B00,$8304E2C1,$6A5220C2
code(48) =$89D3FF02,$4D8BE445,$55FF51E4,$33F88BDC,$2007C7C0,$8D000000,$47C71057,$0104
code(56) =$C478900,$6A084789,$6A006A00,$52006A00,$33D055FF,$F44D89C9,$3BF4458B,$8D0FB845
code(64) =$0131,$48B8458B,$8BF4452B,$AF0FE855,$FD88BD0,$FBC5DAF,$3EC5DAF,$DA03C45D
code(72) =$753BF633,$FB8D0FBC,$83000000,$7400C07D,$8AC03306,$3318EB03,$8AD233C0,$38A0153
code(80) =$3308E2C1,$10E0C1C9,$B024B8A,$3BC10BC2,$840FFC45,$00C1,$46F07589,$7DBC753B
code(88) =$EC5D0332,$C07D83,$C0330674,$18EB038A,$D233C033,$8A01538A,$8E2C103,$E0C1C933
code(96) =$24B8A10,$C10BC20B,$74FC453B,$753B4606,$8BCE7CBC,$453B0847,$8B2A72F8,$FF52E455
code(104)=$4583D855,$26A64F8,$C1F84D8B,$C18304E1,$458B5120,$55FF50E4,$E44589E0,$52E4558B
code(112)=$8BDC55FF,$20478DF8,$42F4558B,$4D8B5652,$558B51F4,$4F8B52F0,$4E1C108,$FF50C103
code(120)=$478BD055,$F0453B10,$458B067E,$104789F0,$3B14578B,$67EF455,$89F44D8B,$773B144F
code(128)=$89037E18,$458B1877,$473B40F4,$8B077E1C,$8942F455,$47FF1C57,$EC5D0308,$BC753B46
code(136)=$FF058C0F,$45FFFFFF,$F44D8BF4,$FB84D3B,$FFFECF8C,$458B57FF,$4E0C1F8,$5020C083
code(144)=$55FF006A,$6AD88BCC,$458B5301,$34508B08,$C855FF52,$51E44D8B,$8BD455FF,$5B5E5FC3
code(152)=$C25DE58B,0
;▼呼び出す関数のアドレスを格納
dllload "kernel32.dll" : D_KERNEL=stat
dllload "user32.dll" : D_USER=stat
dllload "gdi32.dll" : D_GDI=stat
funcprocadr func(0),D_KERNEL,"GlobalAlloc"
funcprocadr func(1),D_KERNEL,"GlobalReAlloc"
funcprocadr func(2),D_KERNEL,"GlobalLock"
funcprocadr func(3),D_KERNEL,"GlobalUnlock"
funcprocadr func(4),D_KERNEL,"GlobalFree"
funcprocadr func(5),D_USER, "SetRect"
funcprocadr func(6),D_GDI, "ExtCreateRegion"
funcprocadr func(7),D_USER, "SetWindowRgn"
pfunc=varptr(code)
mref bmscr,67
;▼関数パラメータを指定
prm=varptr(bmscr),varptr(func)
;▼関数実行
funcproc dllret,prm,pfunc,2
if dllret=0:dialog "作成に失敗しました":end
gsel 2,1
redraw 1
onclick *move
stop
*move
if wparam==2 {
dllfree D_KERNEL : dllfree D_USER : dllfree D_GDI
end
}
if wparam == 1 { obj_wmnclbtndown } : stop
stop
表示したいのですが、"picload refstr "を"imgload refstr"に変えたら上手く行きません。
できればこのスクリプトを使った形で(そうでなくても良いのですが・・・)
枠なしPNGファイルを表示したいのですが・・・。

| |
|
2011/2/12(Sat) 00:42:59|NO.37021
あくまで推測ですが、このプログラムではx座標0,y座標0(左上)の位置の色を
背景色にしているので左上の色が背景色になっていないとうまくいかないかもしれません。
/*
#include "mod_img.as"
bgscr 0,400,400,,
dialog "png", 16
if stat = 0 : stop
imgload refstr
stop
そこで不定形リージョンのサンプルを使って、
*/
; ※888さん作成の2.6x版をHSP3用に移植したものです。
#include "mod_img.as"
#uselib "user32.dll"
#func SetWindowLong "SetWindowLongA" int,int,int
hwnd_=hwnd
screen 3,,,10
SetWindowLong hwnd_,-8,hwnd
buffer 3,1,1,2
#uselib "user32.dll"
#func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int,int,int,int
#const LWA_COLORKEY 1
#const LWA_ALPHA 2
#const GWL_EXSTYLE -20
#const WS_EX_LAYERED $00080000
#module
#uselib "kernel32.dll"
#cfunc LoadLibrary "LoadLibraryA" sptr
#cfunc GetProcAddress "GetProcAddress" int,sptr
#func FreeLibrary "FreeLibrary" int
#deffunc dllload str prm1
pdll=LoadLibrary(prm1)
if pdll==0 : return -1
return pdll
#deffunc funcprocadr var prm1,int prm2,str prm3
funcptr=GetProcAddress(prm2,prm3)
if funcptr==0 : return -1
prm1=funcptr
return 0
#deffunc funcproc var prm1,array prm2,int prm3,int prm4
prm1=callfunc (prm2,prm3,prm4)
return 0
#deffunc dllfree int prm1
FreeLibrary prm1
return
#global
#uselib "kernel32.dll"
#func VirtualProtect "VirtualProtect" var,int,int,var
#define xdim(%1,%2)dim %1,%2 : VirtualProtect %1,(%2)*4,$40,AZSD
#define obj_wmnclbtndown sendmsg hwnd,$00A1,2,0
gsel 0,-1
*load
bgscr 2,,,2
dialog "png",16: if stat!1 : end
hr = 255 : hg = 255 : hb = 255// 画像に使われていない色を代入する
color hr, hg, hb
boxf
imgload refstr
alpha = 255 ; 0〜255
SetWindowLong hwnd,-20,WS_EX_LAYERED
SetLayeredWindowAttributes hwnd,0,alpha,LWA_ALPHA
color hr, hg, hb
xdim code,153
code(0) =$83EC8B55,$5653B8C4,$C458B57,$508B188B,$E0558904,$8908488B,$508BDC4D,$D855890C
code(8) =$8910488B,$508BD44D,$D0558914,$8918488B,$408BCC4D,$C845891C,$8B08458B,$55891450
code(16) =$84D8BC4,$890C418B,$558BC045,$44A8B08,$8BBC4D89,$508B0845,$B8558908,$8B084D8B
code(24) =$A081,$FC458900,$C07D83,$45C70974,$01EC,$C707EB00,$3EC45,$558B0000
code(32) =$55AF0FBC,$E85589EC,$81E84D8B,$03E1,$49057980,$41FCC983,$04B8,$25C12B00
code(40) =$80000003,$83480579,$8940FCC8,$45C7E845,$64F8,$F8558B00,$8304E2C1,$6A5220C2
code(48) =$89D3FF02,$4D8BE445,$55FF51E4,$33F88BDC,$2007C7C0,$8D000000,$47C71057,$0104
code(56) =$C478900,$6A084789,$6A006A00,$52006A00,$33D055FF,$F44D89C9,$3BF4458B,$8D0FB845
code(64) =$0131,$48B8458B,$8BF4452B,$AF0FE855,$FD88BD0,$FBC5DAF,$3EC5DAF,$DA03C45D
code(72) =$753BF633,$FB8D0FBC,$83000000,$7400C07D,$8AC03306,$3318EB03,$8AD233C0,$38A0153
code(80) =$3308E2C1,$10E0C1C9,$B024B8A,$3BC10BC2,$840FFC45,$00C1,$46F07589,$7DBC753B
code(88) =$EC5D0332,$C07D83,$C0330674,$18EB038A,$D233C033,$8A01538A,$8E2C103,$E0C1C933
code(96) =$24B8A10,$C10BC20B,$74FC453B,$753B4606,$8BCE7CBC,$453B0847,$8B2A72F8,$FF52E455
code(104)=$4583D855,$26A64F8,$C1F84D8B,$C18304E1,$458B5120,$55FF50E4,$E44589E0,$52E4558B
code(112)=$8BDC55FF,$20478DF8,$42F4558B,$4D8B5652,$558B51F4,$4F8B52F0,$4E1C108,$FF50C103
code(120)=$478BD055,$F0453B10,$458B067E,$104789F0,$3B14578B,$67EF455,$89F44D8B,$773B144F
code(128)=$89037E18,$458B1877,$473B40F4,$8B077E1C,$8942F455,$47FF1C57,$EC5D0308,$BC753B46
code(136)=$FF058C0F,$45FFFFFF,$F44D8BF4,$FB84D3B,$FFFECF8C,$458B57FF,$4E0C1F8,$5020C083
code(144)=$55FF006A,$6AD88BCC,$458B5301,$34508B08,$C855FF52,$51E44D8B,$8BD455FF,$5B5E5FC3
code(152)=$C25DE58B,0
;▼呼び出す関数のアドレスを格納
dllload "kernel32.dll" : D_KERNEL=stat
dllload "user32.dll" : D_USER=stat
dllload "gdi32.dll" : D_GDI=stat
funcprocadr func(0),D_KERNEL,"GlobalAlloc"
funcprocadr func(1),D_KERNEL,"GlobalReAlloc"
funcprocadr func(2),D_KERNEL,"GlobalLock"
funcprocadr func(3),D_KERNEL,"GlobalUnlock"
funcprocadr func(4),D_KERNEL,"GlobalFree"
funcprocadr func(5),D_USER, "SetRect"
funcprocadr func(6),D_GDI, "ExtCreateRegion"
funcprocadr func(7),D_USER, "SetWindowRgn"
pfunc=varptr(code)
mref bmscr,67
;▼関数パラメータを指定
prm=varptr(bmscr),varptr(func)
;▼関数実行
funcproc dllret,prm,pfunc,2
if dllret=0:dialog "作成に失敗しました":end
gsel 2,1
redraw 1
onclick *move
stop
*move
if wparam==2 {
dllfree D_KERNEL : dllfree D_USER : dllfree D_GDI
end
}
if wparam == 1 { obj_wmnclbtndown } : stop
stop

| |
|
2011/2/12(Sat) 01:11:29|NO.37024
ん、不定形リージョン?しまったそういうこと…なのかな。
PNGの表示じゃなくて画像を使った不定形リージョンをやりたかったんでしょうか。
おそらく、PNGで手軽に出来るんじゃないかと思ったってことですか。
もしそうならこちらがお役に立つかと思います。
http://d.hatena.ne.jp/As_hsp/20091213/1260714763
あ、半透明部分も反映させたいってことなら私は分からないので他の方お願いします。
|
|
2011/2/12(Sat) 02:49:31|NO.37027
hexa.hemiさま、GENKIさまレスありがとうございます。
何時もながら、説明が不十分で申し訳ありません。
部分的に透明度が違う画像を使ったデスクトップマスコットみたいなモノを作りたいのです。
たとえば金魚のヒレやシャボン玉をデスクトップ上で動かしたいのです。
普通不定形リージョン+半透明処理を使うと半透明のマスコットは出来るのですが、透明度が
一様になってしまって、シャボン玉や金魚のヒレとかはリアルさがイマイチなんです。
(もしかすると難し過ぎて、自分には分からないかも知れませんが・・・)
よろしくお願い致します。
|
|
2011/2/12(Sat) 17:22:51|NO.37042
GENKIさま親切丁寧なアドバイスありがとうございます。
スクリーンキャプチャとレイヤードウィンドウ
レイヤードウィンドウが使えれば何とかなりそうです!!
早速勉強してみます。
より美しくリアルなデスクトップアクセサリー頑張って作ってみます。
|
|