実行結果: http://twitpic.com/dmdz2s
http://codetter.com/?p=1007 のオブジェクト版。
やっていることはこちらのブログとほぼ同じ→ http://d.hatena.ne.jp/setuna-kanata/20090112/1231777971
ちょくとさん作のコールバック関数実装プラグインhscallbk.dllを使用してボタンの描画部分をのっとってます。
ちなみにボタンアニメーション(カーソル載せるとふわりと色が変わるアレ)が機能していないけど
BeginBufferedPaintの代わりにBeginBufferedAnimation使えばいけるっぽい。
実行結果: http://twitpic.com/dmdz2s
http://codetter.com/?p=1007 のオブジェクト版。
やっていることはこちらのブログとほぼ同じ→ http://d.hatena.ne.jp/setuna-kanata/20090112/1231777971
ちょくとさん作のコールバック関数実装プラグインhscallbk.dllを使用してボタンの描画部分をのっとってます。
ちなみにボタンアニメーション(カーソル載せるとふわりと色が変わるアレ)が機能していないけど
BeginBufferedPaintの代わりにBeginBufferedAnimation使えばいけるっぽい。
#include "user32.as"
#define GWL_WNDPROC -4
#define WM_CREATE 0x1
#define WM_DESTROY 0x2
#uselib "uxtheme"
#cfunc BeginBufferedPaint "BeginBufferedPaint" int,int,int,int,int
#func EndBufferedPaint "EndBufferedPaint" int,int
#func BufferedPaintSetAlpha "BufferedPaintSetAlpha" int,int,int
#func BufferedPaintRenderAnimation "BufferedPaintRenderAnimation" int,int
#define BPBF_TOPDOWNDIB 2
#uselib "dwmapi"
#func DwmExtendFrameIntoClientArea "DwmExtendFrameIntoClientArea" int,int
#include "hscallbk.as"
#uselib ""
#func CallNew "" int,int,int,int
;-- いつもの
screen 0,580,160
r=0,0,80,0
DwmExtendFrameIntoClientArea hwnd,varptr(r)
cls 4
;-- コールバック関数
setcallbk ProcNew, CallNew, *lCallNewWindowProc
objx=200
objy=50
objsize objx,objy
objmode 2,1 : font "meiryo",24,1+16 ;-- みんな大好きメイリオ
pos 10,10 : button gosub "透けるボタン",*lButton
;-- ボタンのサブクラス化
pos 310,10 : button gosub "透けないボタン",*lButton
hButton=objinfo(stat,2)
GetWindowLong hButton,GWL_WNDPROC
dButtonProc=stat
SetWindowLong hButton,GWL_WNDPROC,varptr(ProcNew)
stop
*lButton
dialog "Push"
return
*lCallNewWindowProc
if callbkarg(0)=hButton{ ;--該当ボタン
;-- WM_PAINT以外は通常通りの動作をする
CallWindowProc dButtonProc,callbkarg(0),callbkarg(1),callbkarg(2),callbkarg(3)
ret=stat
if callbkarg(1)=0xf{ ;--WM_PAINT
r=5,5,objx-5,objy-5 ;-- ボタンの角が円いので少し小さめにしておかないと余計な部分まで不透明になる
; ……はずなのだが、HSPのボタンはなぜか下地が見えちゃってるので意味なし
pp=16,0,0,0
mhdc=0
GetWindowDC hButton
dcButton=stat
pb=BeginBufferedPaint(dcButton,varptr(r),BPBF_TOPDOWNDIB,varptr(pp),varptr(mhdc))
if pb!0{
CallWindowProc dButtonProc,callbkarg(0),callbkarg(1),mhdc,callbkarg(3)
ret=stat
BufferedPaintSetAlpha pb,varptr(r),255
EndBufferedPaint pb,1
}
ReleaseDC hButton,dcButton
}
}
return ret