|
2009/2/6(Fri) 08:19:59|NO.23239
floryさま 情報が大変助けになりました。
当初は参考URLのスクリプトを参考にGDI+で試行錯誤してたのですが、
BitBltにNOTSRCCOPYをつけるとアルファチャンネルも反転する事が分かったので
HSPバッファで用意したイメージを
ボタンにBitBltする方法する方法に落ち着きました。
オーナードローはとりあえず簡易処理でアニメ無しになってます。
どうでしょうか?
//=============================以下ソース
#uselib "gdi32"
#func BitBlt "BitBlt" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr
#uselib "dwmapi.dll"
#func DwmEnableBlurBehindWindow "DwmEnableBlurBehindWindow" int, int
#func DwmExtendFrameIntoClientArea "DwmExtendFrameIntoClientArea" int, int
#define BM_SETSTYLE 0x00F4
#define BS_OWNERDRAW 0x0000000B
#define WM_DRAWITEM 0x002B
#define ODT_BUTTON 4
;DRAWITEMSTRUCT(抜粋)
#define DIS_CtlType 0; UINT CtlType;
#define DIS_hDC 6; HDC hDC;
*main
ButtonNum=4 ;ボタンの数
size=100 ;ボタンのサイズ
dim hwndODB,ButtonNum ;ボタンハンドル
dim objectID,ButtonNum ;ボタンID
//screen #0
screen 0, 370, 500: cls 4
mainhwnd=hwnd
//buffer #1 画像
buffer 1,size,size, , 500,100 : cls 2
picName = dir_exe+"\\sample\\ssaver\\Aruface.bmp"
exist picName
if strsize!-1 {
picload picName,1
} else {
color:circle 0,0,100,100,1:color 255,255:circle 3,3,97,97,1:
color:boxf 30,20,33,40:boxf 67,20,70,40:boxf 30,57,70,60
}
hdc_pic = hdc
//buffer 黒マスク用(実際は白)
buffer 2,size,size,, 650,100:cls
hdc_bk = hdc
//ボタン描画
gsel 0
pos 10,10 : objsize size,size : font "MS UI Gothic",10
;ボタン生成
repeat ButtonNum
mes ;スペース空け
button gosub "BTN"+cnt,*BTN ;設置
objectID.cnt=stat ;ID記憶
hwndODB.cnt =objinfo(objectID.cnt, 2) ;ハンドル記憶
sendmsg hwndODB.cnt, BM_SETSTYLE, BS_OWNERDRAW, 0 ;オーナードロー
loop
//オーナードロー
oncmd gosub *DRAWITEM, WM_DRAWITEM ;WM_DRAWITEM
onexit *owari
//Glass効果
MARGINS = -1, -1, -1, -1
DwmExtendFrameIntoClientArea hwnd, varptr(MARGINS)
stop
*DRAWITEM
wp=wparam
lp=lparam
dupptr DIS, lp, 48, 4
if DIS.DIS_CtlType!ODT_BUTTON:return
//buffer #1 から画像を転送
; NOTSRCCOPY 0x330008 '色反転転送(アルファも反転) ;これで黒ベースになる
BitBlt DIS.DIS_hDC, 0, 0, size, size, hdc_bk, 0, 0, 0x330008
; SRCPAINT 0xEE0086 'OR演算転送 ;黒ベースにORで描く
BitBlt DIS.DIS_hDC, 0, 0, 100, 100, hdc_pic, 0, 0, 0xEE0086
return
*btn
btnId=stat
color : boxf : color 255,255,255 : pos 120,50+(110*btnId) : font "MS UI Gothic",30
mes "< HI ! Button "+btnId+""
return
*owari
end
| |