HSPでAeroGlassに描画してみる(オブジェクト編)

実行結果: 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