|
|
|
2015/9/13(Sun) 22:30:04|NO.71654
数分で作ったので手抜き。
レイヤーモジュール
[ placeark ]
by natade
url http://www.placeark.com/
明日モジュール化します。
#ifndef LayeredWindowModule_destructor
#module LayeredWindowModule
;┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━
;┃ [ レイヤーウィンドウモジュール2 ]
;┃
;┃現在の描画指定先のウィンドウを、簡単に半透明なウィンドウに切り替えます。
;┃レイヤーウィンドウモジュール1を最適化して使いやすくなっています。
;┃レイヤーウィンドウモジュール1と命令の互換性はありません。
;┃このモジュールは、NYSLです。
;┃Windows 2000/XP以上の環境で動作します。
;┃
;┃
;┃命令はシンプル!
;┃
;┃
;┃アルファブレンド系命令 3種類
;┃
;┃・enableAlphaBlendWindow p1
;┃p1 … アルファ値を示したウィンドウID
;┃p1 のウィンドウのRの値が、ウィンドウのブレンド率となります。
;┃
;┃・enableAlphaBlendWindowRGB p1
;┃p1 … アルファ値を示したウィンドウID
;┃p1 のウィンドウの各色の値が、ウィンドウのブレンド率となります。
;┃
;┃・disableAlphaBlendWindow
;┃現在のウィンドウのレイヤードウィンドウを解除する
;┃
;┃現在のウィンドウを、アルファ値を利用したウィンドウに変更します。
;┃2回目から前回と同じ大きさのウィンドウに実行すると、メモリの再確保を行わないため高速化します。
;┃なおウィンドウにした場合、mesboxなどオブジェクト系は一般に利用できなくなります。
;┃p1はメインウィンドウと同じ大きさのウィンドウを用意してください。
;┃
;┃
;┃
;┃クロマキー系命令 2種類
;┃
;┃・enableChromaKey p1
;┃p1 … クロマキーに指定する色
;┃
;┃・disableChromaKey
;┃現在のウィンドウのレイヤードウィンドウを解除する
;┃
;┃
;┃
;┃ 2008 3/20 レイヤーウィンドウモジュール1 公開
;┃ 2013 4/28 レイヤーウィンドウモジュール2 公開
;┃
;┃[ placeark ]
;┃ by natade
;┃ url http://www.placeark.com/
;┃
;┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#uselib "kernel32.dll"
#func VirtualAllocLayeredWindowModule "VirtualAlloc" int, int, int, int
#func VirtualFreeLayeredWindowModule "VirtualFree" int, int, int
#define NULL 0x00000000
#define PAGE_EXECUTE_READWRITE 0x00000040
#define MEM_COMMIT 0x00001000
#define MEM_RESERVE 0x00002000
#define MEM_DECOMMIT 0x00004000
#define MEM_RELEASE 0x00008000
#deffunc LayeredWindowModule_destructor onexit
if(NULL != make32bitdib_ptr) {
VirtualFreeLayeredWindowModule make32bitdib_ptr, 424, MEM_DECOMMIT
VirtualFreeLayeredWindowModule make32bitdib_ptr, 0, MEM_RELEASE
make32bitdib_ptr = NULL
}
if(NULL != make32bitdib_fast_ptr) {
VirtualFreeLayeredWindowModule make32bitdib_fast_ptr, 348, MEM_DECOMMIT
VirtualFreeLayeredWindowModule make32bitdib_fast_ptr, 0, MEM_RELEASE
make32bitdib_fast_ptr = NULL
}
return
#deffunc LayeredWindowModule_constructor
VirtualAllocLayeredWindowModule NULL, 424, MEM_RESERVE, PAGE_EXECUTE_READWRITE
VirtualAllocLayeredWindowModule stat, 424, MEM_COMMIT, PAGE_EXECUTE_READWRITE
make32bitdib_ptr = stat
dupptr make32bitdib_bin, stat, 424, vartype("int")
make32bitdib_bin( 0) = $0824548B, $8320EC83, $840F003A, $0000018E, $2C244C8B, $0F003983, $00018184, $7A8B5700
make32bitdib_bin( 8) = $247C8904, $04793B18, $0166850F, $428B0000, $08413B08, $015A850F, $7A830000, $850F000C
make32bitdib_bin( 16) = $00000146, $000C7983, $013C850F, $8B550000, $518B146A, $748D5614, $E683037F, $246C89FC
make32bitdib_bin( 24) = $24548910, $24748928, $0FC08524, $0001108E, $5C8B5300, $C9333424, $1C244C89, $38245C89
make32bitdib_bin( 32) = $20244489, $FF85D98B, $00D78E0F, $748B0000, $C58B3824, $C22BCA03, $10244489, $18247C89
make32bitdib_bin( 40) = $0241B60F, $0151B60F, $0339B60F, $3DC703C2, $000002FD, $448B2675, $B60F1024, $16890814
make32bitdib_bin( 48) = $2B44B60F, $08E0C101, $0689C20B, $2B54B60F, $00CA8102, $C1FFFFFF, $62EB10E2, $0475C085
make32bitdib_bin( 56) = $5EEB0689, $027DFA3B, $B60FFA8B, $F83B0241, $F88B027D, $1024448B, $0814B60F, $0F01B60F
make32bitdib_bin( 64) = $FAC1D0AF, $0F168908, $012B44B6, $0169B60F, $25C5AF0F, $0000FF00, $548BC20B, $06891424
make32bitdib_bin( 72) = $1354B60F, $69B60F02, $D5AF0F02, $14246C8B, $FF00E281, $E7C10000, $C1D70B10, $D00B08E2
make32bitdib_bin( 80) = $C6831689, $03C38304, $FF03C183, $0F18244C, $FFFF4B85, $247C8BFF, $24748B24, $24548B28
make32bitdib_bin( 88) = $244C8B2C, $BD048D1C, $00000000, $38244401, $4CFFCE03, $4C892024, $850F1C24, $FFFFFF04
make32bitdib_bin( 96) = $335D5E5B, $C4835FC0, $03B8C320, $5F000000, $C320C483, $000002B8, $C4835F00, $01B8C320
make32bitdib_bin(104) = $83000000, $00C320C4
VirtualAllocLayeredWindowModule NULL, 348, MEM_RESERVE, PAGE_EXECUTE_READWRITE
VirtualAllocLayeredWindowModule stat, 348, MEM_COMMIT, PAGE_EXECUTE_READWRITE
make32bitdib_fast_ptr = stat
dupptr make32bitdib_fast_bin, stat, 348, vartype("int")
make32bitdib_fast_bin( 0) = $08244C8B, $8310EC83, $840F0039, $00000140, $1C24548B, $0F003A83, $00013384, $598B5300
make32bitdib_fast_bin( 8) = $045A3B04, $011C850F, $418B0000, $08423B08, $0110850F, $79830000, $850F000C, $000000FC
make32bitdib_fast_bin(16) = $000C7A83, $00F2850F, $498B0000, $14528B14, $5B6C8D55, $FCE58303, $14246C89, $8E0FC085
make32bitdib_fast_bin(24) = $000000D0, $24748B56, $24748920, $02728D24, $244C8957, $24748910, $24448914, $00498D18
make32bitdib_fast_bin(32) = $8E0FDB85, $00000081, $2824448B, $FF8BFB8B, $8316B60F, $FA8103C6, $000000FF, $B60F2275
make32bitdib_fast_bin(40) = $0F108911, $C10151B6, $100908E2, $0251B60F, $0910E2C1, $03C18310, $00000881, $43EBFF00
make32bitdib_fast_bin(48) = $0775D285, $C1831089, $0F38EB03, $AF0F29B6, $08FDC1EA, $B60F2889, $AF0F0169, $00E581EA
make32bitdib_fast_bin(56) = $090000FF, $69B60F28, $EAAF0F02, $FF00E581, $E5C10000, $8B280908, $C11C246C, $C18318E2
make32bitdib_fast_bin(64) = $83100903, $754F04C0, $244C8B87, $24748B10, $9D048D14, $00000000, $28244401, $F503CD03
make32bitdib_fast_bin(72) = $18244CFF, $10244C89, $14247489, $FF4E850F, $5E5FFFFF, $5BC0335D, $C310C483, $000003B8
make32bitdib_fast_bin(80) = $C4835B00, $02B8C310, $5B000000, $C310C483, $000001B8, $10C48300, $000000C3
return
#define make32bitdib(%1, %2, %3) \
prm@LayeredWindowModule = varptr(%1), varptr(%2), varptr(%3):\
mref value@LayeredWindowModule, 64:\
value@LayeredWindowModule = callfunc(prm@LayeredWindowModule, make32bitdib_ptr@LayeredWindowModule, 3)
#define make32bitdib_fast(%1, %2, %3) \
prm@LayeredWindowModule = varptr(%1), varptr(%2), varptr(%3):\
mref value@LayeredWindowModule, 64:\
value@LayeredWindowModule = callfunc(prm@LayeredWindowModule, make32bitdib_fast_ptr@LayeredWindowModule, 3)
#uselib "USER32.dll"
#func ReleaseDC "ReleaseDC" sptr,sptr
#cfunc GetDC "GetDC" sptr
#func GetWindowLong "GetWindowLongA" int,int
#func SetWindowLong "SetWindowLongA" int,int,int
#func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int,int,int,int
#func UpdateLayeredWindow "UpdateLayeredWindow" int,int,int,int,int,int,int,int,int
#define LWA_COLORKEY 0x00000001
#define LWA_ALPHA 0x00000002
#define WS_EX_LAYERED 0x00080000
#define ULW_COLORKEY 0x00000001
#define ULW_ALPHA 0x00000002
#define ULW_OPAQUE 0x00000004
#define AC_SRC_OVER 0x00000000
#define AC_SRC_ALPHA 0x00000001
#uselib "GDI32.dll"
#cfunc CreateCompatibleDC "CreateCompatibleDC" sptr
#cfunc CreateCompatibleBitmap "CreateCompatibleBitmap" sptr,sptr,sptr
#func SelectObject "SelectObject" sptr,sptr
#func DeleteObject "DeleteObject" sptr
#func DeleteDC "DeleteDC" sptr
#func StretchDIBits "StretchDIBits" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr
#define DIB_RGB_COLORS 0x0
#define SRCCOPY 0x00CC0020
#deffunc disableAlphaBlendWindow
GetWindowLong hwnd, -20
if (stat & WS_EX_LAYERED){
SetWindowLong hwnd,-20,stat^WS_EX_LAYERED
}
return
#deffunc _enableAlphaBlendWindowRGB int lwaAlpha, int type,local ColorBMSCR,local AlphaBMSCR,local hdc_,local hMemDC,local hBitmap
GetWindowLong hwnd, -20
if((stat & WS_EX_LAYERED) == 0) {
SetWindowLong hwnd,-20, stat | WS_EX_LAYERED
}
if((biWidth != ginfo_sx)||(biHeight != ginfo_sy)) {
biWidth = ginfo_sx
biHeight = ginfo_sy
// BITMAPINFOHEADER構造体
dim BITMAPINFOHEADER, 10
BITMAPINFOHEADER(0) = 40 // biSize
BITMAPINFOHEADER(1) = biWidth // biWidth
BITMAPINFOHEADER(2) = biHeight // biHeight
BITMAPINFOHEADER(3) = 1 | (32 << 16) // biPlanes & biBitCount
BITMAPINFOHEADER(4) = BI_RGB // biCompression
// BITMAPINFO構造体
dim BITMAPINFO, 2
BITMAPINFO(0) = varptr(BITMAPINFOHEADER) //メンバをもつ
// 32bitDIBの準備
dim lpPixel, biWidth * biHeight
// psize
dim psize,2
psize(0) = ginfo(26)
psize(1) = ginfo(27)
// pptSrc
dim pptSrc,2
pptSrc(0) = 0
pptSrc(1) = 0
// pblend
sdim pblend, 4
poke pblend, 0, AC_SRC_OVER
poke pblend, 1, 0
poke pblend, 2, 255
poke pblend, 3, AC_SRC_ALPHA
}
;32bitDIBの準備
mref ColorBMSCR, 67
mref AlphaBMSCR, 96 + lwaAlpha
if(type == 0) {
make32bitdib lpPixel, ColorBMSCR, AlphaBMSCR
} else {
make32bitdib_fast lpPixel, ColorBMSCR, AlphaBMSCR
}
if(stat){
return
}
hdc_ = GetDC(hWnd)
hMemDC = CreateCompatibleDC(hdc_)
hBitmap = CreateCompatibleBitmap(hdc_, biWidth, biHeight)
ReleaseDC hWnd,hdc_
SelectObject hMemDC,hBitmap
StretchDIBits hMemDC, 0, 0, biWidth, biHeight, 0, 0, biWidth, biHeight, varptr(lpPixel), BITMAPINFO, DIB_RGB_COLORS, SRCCOPY
UpdateLayeredWindow hwnd, hdc, 0, varptr(psize), hMemDC, varptr(pptSrc), 0, varptr(pblend), ULW_ALPHA
DeleteObject hBitmap
DeleteDC hMemDC
return
#define global enableAlphaBlendWindowRGB(%1) _enableAlphaBlendWindowRGB %1, 0
#define global enableAlphaBlendWindow(%1) _enableAlphaBlendWindowRGB %1, 1
#define global disableChromaKey disableAlphaBlendWindow
#deffunc _enableChromaKey int lwkColor,double lwkAlpha
GetWindowLong hwnd,-20
if((stat&WS_EX_LAYERED)=0){
SetWindowLong hwnd,-20,stat|WS_EX_LAYERED
}
if(lwkAlpha==0){
if(lwkColor==0xFFFFFFFF){
disableChromaKey
}else{
SetLayeredWindowAttributes hwnd,lwkColor,0,LWA_COLORKEY
}
}else{
if(lwkColor==0xFFFFFFFF){
SetLayeredWindowAttributes hwnd,0,int(255.0*(100.0-lwkAlpha)/100),LWA_ALPHA
}else{
SetLayeredWindowAttributes hwnd,lwkColor,int(255.0*(100.0-lwkAlpha)/100),LWA_COLORKEY|LWA_ALPHA
}
}
return
#define global enableChromaKey(%1=0xFFFFFFFF,%2=0) _enableChromaKey %1,limitf(%2,0,100)
#global
LayeredWindowModule_constructor
#endif
#uselib "user32.dll"
#func SetTimer "SetTimer" int,int,int,sptr
#func KillTimer "KillTimer" int,int
#func MoveWindow "MoveWindow" int,int,int,int,int,int
#define WM_TIMER 0x0113
#define timerID 100
#define WM_NCLBUTTONDOWN $000000A1
#define HTCAPTION 2
x = 600
y = 300
//メインウィンドウ(メイン)
buffer 0,x,y
gsel 0,2
color $FF,$00,$00 //赤色
boxf
//白色の文字が入ったウィンドウ
buffer 2,x,y
color
boxf
color $FF,$FF,$FF
lu_x = 0 ;左上x
lu_y = 0;左上y
rd_x = ginfo_winx;右下x
rd_y = ginfo_winy ;右下y
color 255,,
repeat 5
lu_x++
lu_y++
rd_x--
rd_y--
line lu_x, lu_y, rd_x, lu_y
line lu_x, lu_y, lu_x, rd_y
line rd_x, lu_y, rd_x, rd_y
line lu_x, rd_y, rd_x, rd_y
loop
R=255
R1=R
//グラデーション用のウィンドウ
buffer 3,600,300
lu_x = 0 ;左上x
lu_y = 0;左上y
rd_x = ginfo_winx;右下x
rd_y = ginfo_winy ;右下y
repeat 5
color R,255,255
lu_x++
lu_y++
rd_x--
rd_y--
line lu_x, lu_y, rd_x, lu_y
line lu_x, lu_y, lu_x, rd_y
line rd_x, lu_y, rd_x, rd_y
line lu_x, rd_y, rd_x, rd_y
r-15
loop
buffer 4,x,y
i+=30
//アルファブレンド用の画像を作成
gsel 4
redraw 0
gmode 0,x,y
pos 0,0
gcopy 2 //さっき作った文字をコピー
gmode 6,x,y,255
pos 0,0
gcopy 3 //グラデーション用ウィンドウを減算
redraw 1
//メインウィンドウ
gsel 0
// 各RGBのブレンド率が入ったウィンドウIDを指定する
// ウィンドウは同じ大きさのウィンドウを用意しておく
enableAlphaBlendWindow 4
hw=hwnd
bgscr 10,x-11,y-11
MoveWindow hw,ginfo_mx-omx-6,ginfo_my-omy-6,x+6,y+6
MoveWindow hwnd,ginfo_mx-omx,ginfo_my-omy,ginfo_winx,ginfo_winy
lu_x = 0 ;左上x
lu_y = 0;左上y
rd_x = ginfo_winx-1;右下x
rd_y = ginfo_winy-1 ;右下y
color 200,0,0
line lu_x, lu_y, rd_x, lu_y
line lu_x, lu_y, lu_x, rd_y
line rd_x, lu_y, rd_x, rd_y
line lu_x, rd_y, rd_x, rd_y
repeat
getkey click,1
if(clicko==0 && click==1){
omx=mousex
omy=mousey
}
if(click==1){
MoveWindow hw,ginfo_mx-omx-6,ginfo_my-omy-6,x+6,y+6
MoveWindow hwnd,ginfo_mx-omx,ginfo_my-omy,ginfo_winx,ginfo_winy
}
clicko=click
await
loop
stop
| |
|
2015/9/13(Sun) 22:34:36|NO.71655
面白いプログラムですね。
ただ、ウィンドウの移動はginfo_actで自ウィンドウがアクティブか否かを判定してから、
移動処理に入ったほうが良いと思います。
|
|
2015/9/15(Tue) 21:49:30|NO.71712
モジュール化
手抜きですがやってることは簡単なので...
#ifndef LayeredWindowModule_destructor
#module LayeredWindowModule
;┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━
;┃ [ レイヤーウィンドウモジュール2 引用 ]
;┃ [ placeark ]
;┃ by natade
;┃ url http://www.placeark.com/
;┃
;┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#uselib "kernel32.dll"
#func VirtualAllocLayeredWindowModule "VirtualAlloc" int, int, int, int
#define NULL 0x00000000
#define PAGE_EXECUTE_READWRITE 0x00000040
#define MEM_COMMIT 0x00001000
#define MEM_RESERVE 0x00002000
#define MEM_DECOMMIT 0x00004000
#define MEM_RELEASE 0x00008000
#deffunc LayeredWindowModule_constructor
VirtualAllocLayeredWindowModule NULL, 424, MEM_RESERVE, PAGE_EXECUTE_READWRITE
VirtualAllocLayeredWindowModule stat, 424, MEM_COMMIT, PAGE_EXECUTE_READWRITE
make32bitdib_ptr = stat
dupptr make32bitdib_bin, stat, 424, vartype("int")
make32bitdib_bin( 0) = $0824548B, $8320EC83, $840F003A, $0000018E, $2C244C8B, $0F003983, $00018184, $7A8B5700
make32bitdib_bin( 8) = $247C8904, $04793B18, $0166850F, $428B0000, $08413B08, $015A850F, $7A830000, $850F000C
make32bitdib_bin( 16) = $00000146, $000C7983, $013C850F, $8B550000, $518B146A, $748D5614, $E683037F, $246C89FC
make32bitdib_bin( 24) = $24548910, $24748928, $0FC08524, $0001108E, $5C8B5300, $C9333424, $1C244C89, $38245C89
make32bitdib_bin( 32) = $20244489, $FF85D98B, $00D78E0F, $748B0000, $C58B3824, $C22BCA03, $10244489, $18247C89
make32bitdib_bin( 40) = $0241B60F, $0151B60F, $0339B60F, $3DC703C2, $000002FD, $448B2675, $B60F1024, $16890814
make32bitdib_bin( 48) = $2B44B60F, $08E0C101, $0689C20B, $2B54B60F, $00CA8102, $C1FFFFFF, $62EB10E2, $0475C085
make32bitdib_bin( 56) = $5EEB0689, $027DFA3B, $B60FFA8B, $F83B0241, $F88B027D, $1024448B, $0814B60F, $0F01B60F
make32bitdib_bin( 64) = $FAC1D0AF, $0F168908, $012B44B6, $0169B60F, $25C5AF0F, $0000FF00, $548BC20B, $06891424
make32bitdib_bin( 72) = $1354B60F, $69B60F02, $D5AF0F02, $14246C8B, $FF00E281, $E7C10000, $C1D70B10, $D00B08E2
make32bitdib_bin( 80) = $C6831689, $03C38304, $FF03C183, $0F18244C, $FFFF4B85, $247C8BFF, $24748B24, $24548B28
make32bitdib_bin( 88) = $244C8B2C, $BD048D1C, $00000000, $38244401, $4CFFCE03, $4C892024, $850F1C24, $FFFFFF04
make32bitdib_bin( 96) = $335D5E5B, $C4835FC0, $03B8C320, $5F000000, $C320C483, $000002B8, $C4835F00, $01B8C320
make32bitdib_bin(104) = $83000000, $00C320C4
VirtualAllocLayeredWindowModule NULL, 348, MEM_RESERVE, PAGE_EXECUTE_READWRITE
VirtualAllocLayeredWindowModule stat, 348, MEM_COMMIT, PAGE_EXECUTE_READWRITE
make32bitdib_fast_ptr = stat
dupptr make32bitdib_fast_bin, stat, 348, vartype("int")
make32bitdib_fast_bin( 0) = $08244C8B, $8310EC83, $840F0039, $00000140, $1C24548B, $0F003A83, $00013384, $598B5300
make32bitdib_fast_bin( 8) = $045A3B04, $011C850F, $418B0000, $08423B08, $0110850F, $79830000, $850F000C, $000000FC
make32bitdib_fast_bin(16) = $000C7A83, $00F2850F, $498B0000, $14528B14, $5B6C8D55, $FCE58303, $14246C89, $8E0FC085
make32bitdib_fast_bin(24) = $000000D0, $24748B56, $24748920, $02728D24, $244C8957, $24748910, $24448914, $00498D18
make32bitdib_fast_bin(32) = $8E0FDB85, $00000081, $2824448B, $FF8BFB8B, $8316B60F, $FA8103C6, $000000FF, $B60F2275
make32bitdib_fast_bin(40) = $0F108911, $C10151B6, $100908E2, $0251B60F, $0910E2C1, $03C18310, $00000881, $43EBFF00
make32bitdib_fast_bin(48) = $0775D285, $C1831089, $0F38EB03, $AF0F29B6, $08FDC1EA, $B60F2889, $AF0F0169, $00E581EA
make32bitdib_fast_bin(56) = $090000FF, $69B60F28, $EAAF0F02, $FF00E581, $E5C10000, $8B280908, $C11C246C, $C18318E2
make32bitdib_fast_bin(64) = $83100903, $754F04C0, $244C8B87, $24748B10, $9D048D14, $00000000, $28244401, $F503CD03
make32bitdib_fast_bin(72) = $18244CFF, $10244C89, $14247489, $FF4E850F, $5E5FFFFF, $5BC0335D, $C310C483, $000003B8
make32bitdib_fast_bin(80) = $C4835B00, $02B8C310, $5B000000, $C310C483, $000001B8, $10C48300, $000000C3
return
#define make32bitdib(%1, %2, %3) \
prm@LayeredWindowModule = varptr(%1), varptr(%2), varptr(%3):\
mref value@LayeredWindowModule, 64:\
value@LayeredWindowModule = callfunc(prm@LayeredWindowModule, make32bitdib_ptr@LayeredWindowModule, 3)
#define make32bitdib_fast(%1, %2, %3) \
prm@LayeredWindowModule = varptr(%1), varptr(%2), varptr(%3):\
mref value@LayeredWindowModule, 64:\
value@LayeredWindowModule = callfunc(prm@LayeredWindowModule, make32bitdib_fast_ptr@LayeredWindowModule, 3)
#uselib "USER32.dll"
#func ReleaseDC "ReleaseDC" sptr,sptr
#cfunc GetDC "GetDC" sptr
#func GetWindowLong "GetWindowLongA" int,int
#func SetWindowLong "SetWindowLongA" int,int,int
#func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int,int,int,int
#func UpdateLayeredWindow "UpdateLayeredWindow" int,int,int,int,int,int,int,int,int
#define WS_EX_LAYERED 0x00080000
#define ULW_ALPHA 0x00000002
#define AC_SRC_ALPHA 0x00000001
#uselib "GDI32.dll"
#cfunc CreateCompatibleDC "CreateCompatibleDC" sptr
#cfunc CreateCompatibleBitmap "CreateCompatibleBitmap" sptr,sptr,sptr
#func SelectObject "SelectObject" sptr,sptr
#func DeleteObject "DeleteObject" sptr
#func DeleteDC "DeleteDC" sptr
#func StretchDIBits "StretchDIBits" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr
#define SRCCOPY 0x00CC0020
#deffunc disableAlphaBlendWindow
GetWindowLong hwnd, -20
if (stat & WS_EX_LAYERED){
SetWindowLong hwnd,-20,stat^WS_EX_LAYERED
}
return
#deffunc _enableAlphaBlendWindowRGB int lwaAlpha, int type,local ColorBMSCR,local AlphaBMSCR,local hdc_,local hMemDC,local hBitmap
GetWindowLong hwnd, -20
if((stat & WS_EX_LAYERED) == 0) {
SetWindowLong hwnd,-20, stat | WS_EX_LAYERED
}
if((biWidth != ginfo_sx)||(biHeight != ginfo_sy)) {
biWidth = ginfo_sx
biHeight = ginfo_sy
dim BITMAPINFOHEADER, 10
BITMAPINFOHEADER(0) = 40 // biSize
BITMAPINFOHEADER(1) = biWidth // biWidth
BITMAPINFOHEADER(2) = biHeight // biHeight
BITMAPINFOHEADER(3) = 1 | (32 << 16) // biPlanes & biBitCount
BITMAPINFOHEADER(4) = BI_RGB // biCompression
dim BITMAPINFO, 2
BITMAPINFO(0) = varptr(BITMAPINFOHEADER) //メンバをもつ
dim lpPixel, biWidth * biHeight
dim psize,2
psize(0) = ginfo(26)
psize(1) = ginfo(27)
dim pptSrc,2
pptSrc(0) = 0
pptSrc(1) = 0
sdim pblend, 4
poke pblend, 0, AC_SRC_OVER
poke pblend, 1, 0
poke pblend, 2, 255
poke pblend, 3, AC_SRC_ALPHA
}
mref ColorBMSCR, 67
mref AlphaBMSCR, 96 + lwaAlpha
if(type == 0) {
make32bitdib lpPixel, ColorBMSCR, AlphaBMSCR
} else {
make32bitdib_fast lpPixel, ColorBMSCR, AlphaBMSCR
}
if(stat){
return
}
hdc_ = GetDC(hWnd)
hMemDC = CreateCompatibleDC(hdc_)
hBitmap = CreateCompatibleBitmap(hdc_, biWidth, biHeight)
ReleaseDC hWnd,hdc_
SelectObject hMemDC,hBitmap
StretchDIBits hMemDC, 0, 0, biWidth, biHeight, 0, 0, biWidth, biHeight, varptr(lpPixel), BITMAPINFO, DIB_RGB_COLORS, SRCCOPY
UpdateLayeredWindow hwnd, hdc, 0, varptr(psize), hMemDC, varptr(pptSrc), 0, varptr(pblend), ULW_ALPHA
DeleteObject hBitmap
DeleteDC hMemDC
return
#define global enableAlphaBlendWindow(%1) _enableAlphaBlendWindowRGB %1, 1
#global
LayeredWindowModule_constructor
#endif
//┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//┃ [ウインドウ影光 表示モジュール]
//┃ by B(NEPI)
//┃ 前提Module:natedeさん作成 「レイヤーウィンドウモジュール2」
//┃
//┃ 標準命令:
//┃ SetWindowGlow (背景の色R,背景の色G,背景の色B)
//┃ この時のcolor設定値がウインドウの光影になります。
//┃ この命令使用時のgsel選択されているウインドウに適用されます。
//┃ 要注意!!:適用されるWindowID(gsel選択されているウインドウ)より+1,+2されたIDも使用されます。
//┃ 要注意!!2:適用されるWindowID+1の値が0以上の場合 ""screen"" で一度初期化ないと見た目消えたようになります。
//┃ 詳細命令:
//┃ _SetWindowGlow 描画されるWindowID,描画元WindowID,一時WindowID,ウインドウの大きさX, ウインドウの大きさY, 周りの色R, 周りの色G ,周りの色B,背景の色R,背景の色G,背景の色B
//┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#module GlowWindowModule
#define global InitGlowWindow(%1,%2,%3,%4,%5) _InitGlowWindow %1,ginfo_r,ginfo_g,ginfo_b,%2,%3,%4,ginfo_winx,ginfo_winy,%5
#deffunc _InitGlowWindow int DrawID,int RR,int GG,int BB,int R, int G ,int B,int x1,int y1,int MainID
x=x1
y=y1
buffer MainID,x,y
buffer DrawID,x,y
gsel DrawID,2
color R,G,B
boxf
color rr,gg,bb
boxf 7,7,x-7,y-7
return
#deffunc SetWindowGlow int DrawWindow,int MainWindow,int TempWindow
RA=255
buffer TempWindow,x,y
lu_x = 0 ;左上x
lu_y = 0;左上y
rd_x = x;右下x
rd_y = y ;右下y
repeat 6
color RA,255,255
lu_x++
lu_y++
rd_x--
rd_y--
line lu_x-1, lu_y, rd_x, lu_y
line lu_x, lu_y, lu_x, rd_y
line rd_x, lu_y, rd_x, rd_y
line lu_x, rd_y, rd_x, rd_y
color
boxf 7,7,x-7,y-7
RA-15
loop
line lu_x-1, lu_y, rd_x, lu_y
line lu_x, lu_y, lu_x, rd_y
line rd_x, lu_y, rd_x, rd_y
line lu_x, rd_y, rd_x, rd_y
buffer MainWindow,x,y
gsel MainWindow
redraw 0
gmode 6,x,y,255
pos 0,0
gcopy TempWindow
redraw 1
gsel DrawWindow
enableAlphaBlendWindow MainWindow
return
#global
/*--------------ここまでモジュール---------------------*/
/*--------------ここからメイン---------------------*/
color 0,0,0
// colorで設定した色が背景色になる。
//InitGlowWindow 作業用BufferID,フチ色R,フチ色G,フチ色B,適用BufferID
InitGlowWindow 0,75,0,130,2
//指定した作業用BufferIDの中に描画します。
color 255,255,255
pos 100,100
mes "フチが光ります。"
//
//SetWindowGlow InitGlowWindowで指定した作業用ID,指定した適用ID,一時BufferID
SetWindowGlow 0,2,1
| |
|
2015/9/15(Tue) 22:23:15|NO.71714
すごい!
けどメニューあるウィンドウには使えないっぽい?
|
|
2015/9/16(Wed) 08:07:55|NO.71726
本当にすごい!!モジュール化楽しみにしています!
早速、自作のソフトに使わせて頂きたいと思います。
なたで様は本当に良い、痒い所に手が届く様なモジュールを作ってくれるのですね。
心から感謝しています。これからも楽しみにしています。
因みに、フチを7色に光らせてみたいのですが・・・重くなってしまうでしょうか?
PCのスペックに応じて使えるようにしたいと思っています。
|
|
2015/9/16(Wed) 16:48:59|NO.71733
フチを七色・・・
/*--------------モジュールはコピペしてください。---------------------*/
/*--------------メイン---------------------*/
color 0,0,0
InitGlowWindow 0,75,0,130,2
SetWindowGlow 0,2,1
repeat
gsel 0
hsvcolor h,255,255
boxf
boxf
color 0,0,0
boxf 7,7,ginfo_winx-7,ginfo_winy-7
gsel 2
redraw 0
gmode 6,x,y,255
pos 0,0
gcopy 1
redraw 1
gsel 0
enableAlphaBlendWindow 2
wait 1
if(h<255){
h++
}else{
h=0
}
loop
|
|
2015/9/17(Thu) 12:57:30|NO.71760
あ、あ、ありがとうございます!!
美しいですね・・・感激です。
わたしもWindowsAPIを勉強中ですが・・・まだまだ、気が遠くなりそうです。
なたで様のモジュールは_huematrix_(色変換モジュール)、module_lwm.hsp
(レ イヤードウィンドウ総合モジュール)、
コア別にCPU使用率を取得する、2次元メタボー ルを描写する等々・・・
使わせて頂いております。
しょぼいソフトなのにこんな高度なモジュールを使わせて頂いて申し訳ありませんが、
頑張ります!!
ところで、PNGファイルをそのまま表示する(フチナシのレイヤードウインドウで)
方法なんですが、色々調べて自分のソフトに使える様に編集したものですが・・・
//レイヤードウィンドウモジュール Ver.1.01
//Created by Akicansoft
//HP:http://d.hatena.ne.jp/As_hsp/
#module
#uselib "gdi32.dll"
#cfunc CreateDIBSection "CreateDIBSection" sptr,sptr,sptr,sptr,sptr,sptr
#cfunc GetPixel "GetPixel" sptr,sptr,sptr
#define BI_RGB $00000000
#define DIB_RGB_COLORS $00000000
//lbgscr用の_flagが0の場合,画像があるHSPウィンドウID _flagが1の場合,32bitビットマップオブジェクトハンドルを作成
//_hspwinid 画像があるHSPウィンドウID
//_width 画像の横の長さ
//_height 画像の縦の長さ
//_posx 画像の左上位置X
//_posy 画像の左上位置Y
//戻り値:32bitビットマップオブジェクト
#defcfunc lbgscr_CreateImage int _hspwinid, int _width, int _height, int _posx, int _posy, local bmi, local hbmp, local lpBits, local imagesize, local bmpdata, local lgsel, local cx, local cy
//DIBのサイズ
imagesize = _width*_height*4
//ビットマップオブジェクトの作成
dim bmi, 124/4
bmi(0)=40
bmi(1)=_width
bmi(2)=_height
bmi(3)=1|(32<<16)
bmi(4)=BI_RGB
bmi(5)=imagesize
hbmp = CreateDIBSection(0, varptr(bmi), DIB_RGB_COLORS, varptr(lpBits), 0, 0)
dupptr bmpdata, lpBits, imagesize, 4
//ビットマップに描画
lgsel = ginfo_sel
gsel _hspwinid
cx = 0
cy = _height-1
repeat imagesize/4
l2 = GetPixel(hdc, _posx+cx, _posy+cy) //色データ
l3 = GetPixel(hdc, _posx+_width+cx, _posy+cy) //アルファブレンドデータ(赤しか見てないけど)
//画像から色取得
if cx == _width-1{
cx = 0
cy--
} else {
cx++
}
//アルファブレンドDIBへ書き込み
lpoke bmpdata, cnt*4, (peek(l2, 0) << 16) | (peek(l2, 1) << 8) | (peek(l2, 2)<< 0) | (peek(l3, 0) << 24) //RGBAの順
loop
gsel lgsel //元に戻す
return hbmp
#global
#module
#uselib "gdi32.dll"
#func DeleteObject "DeleteObject" sptr
//ビットマップオブジェクトを削除
#deffunc lbgscr_DeleteImage int _hbmp
DeleteObject _hbmp
return
#global
#module
#define GWL_EXSTYLE $FFFFFFEC
#define WS_EX_LAYERED $00080000
#define AC_SRC_OVER $00000000
#define AC_SRC_ALPHA $00000001
#define ULW_ALPHA $00000002
#define SRCCOPY $00CC0020
#define x 0
#define y 1
#uselib "user32.dll"
#func GetWindowLong "GetWindowLongA" sptr,sptr
#func SetWindowLong "SetWindowLongA" sptr,sptr,sptr
#func UpdateLayeredWindow "UpdateLayeredWindow" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr
#cfunc GetDC "GetDC" sptr
#func ReleaseDC "ReleaseDC" sptr,sptr
#uselib "gdi32.dll"
#cfunc CreateCompatibleDC "CreateCompatibleDC" sptr
#func DeleteDC "DeleteDC" sptr
#func SelectObject "SelectObject" sptr,sptr
//レイヤードウィンドウの更新
//_hspwinid レイヤードウィンドウにするためのHSPウィンドウID
//_width ウィンドウの横の長さ
//_height ウィンドウの縦の長さ
//_inum _flagが0の場合,画像があるHSPウィンドウID _flagが1の場合,32bitビットマップオブジェクトハンドル
//_iposx 画像の左上位置X
//_iposy 画像の左上位置Y
//_flag _inumの動作を変更するためのフラグ
#define global lbgscr_Update(%1, %2, %3, %4, %5, %6, %7=0) lbgscr %1, %2, %3, -1, 0, 0, %4, %5, %6, %7
//レイヤードウィンドウの作成
//_hspwinid レイヤードウィンドウにするためのHSPウィンドウID
//_width ウィンドウの横の長さ
//_height ウィンドウの縦の長さ
//_type ウィンドウタイプ (ウィンドウタイプが -1 の場合ウィンドウを更新するだけになる。_posx,_posyは無効)
//_posx ウィンドウの左上からの表示位置X
//_posy ウィンドウの左上からの表示位置Y
//_inum _flagが0の場合,画像があるHSPウィンドウID _flagが1の場合,32bitビットマップオブジェクトハンドル
//_iposx 画像の左上位置X
//_iposy 画像の左上位置Y
//_flag _inumの動作を変更するためのフラグ
#deffunc lbgscr int _hspwinid, int _width, int _height, int _type, int _posx, int _posy, int _inum, int _iposx, int _iposy, int _flag, local hbmp, local hdc_, local size, local pptSrc, local pblend, local hMemDC
//0以上指定
if _type > -1 {
//ウィンドウを作成
bgscr _hspwinid, _width, _height, 6, _posx, _posy
} else {
gsel _hspwinid
}
//レイヤードウィンドウにする
GetWindowLong hwnd, GWL_EXSTYLE
SetWindowLong hwnd, GWL_EXSTYLE, stat|WS_EX_LAYERED
//ビットマップオブジェクトを作成するか既存のビットマップオブジェクトを使用するかどうかのフラグ
if _flag == 0 {
hbmp = lbgscr_CreateImage(_inum, _width, _height, _iposx, _iposy)
} else {
hbmp = _inum //既存の32bitビットマップオブジェクトを指定
}
//DCにBMPを適用
hdc_ = GetDC(hWnd)
hMemDC = CreateCompatibleDC(hdc_)
SelectObject hMemDC, hbmp //ウィンドウに適用
//ウィンドウサイズ
size(x) = _width
size(y) = _height
//デバイスコンテキストにおけるレイヤの位置
pptSrc(x) = 0
pptSrc(y) = 0
//レイヤードウィンドウを構成するときに使う透明度の値
sdim pblend,4
poke pblend,0,AC_SRC_OVER
poke pblend,1,0
poke pblend,2,255
poke pblend,3,AC_SRC_ALPHA
//レイヤードウィンドウにする
UpdateLayeredWindow hwnd, hdc, 0, varptr(size), hMemDC, varptr(pptSrc), 0, varptr(pblend), ULW_ALPHA
//削除
ReleaseDC hWnd,hdc_
if _flag == 0 : lbgscr_DeleteImage hbmp //既存ビットマップオブジェクトを使用していた場合削除しない
DeleteDC hMemDC
//アクティブ判定
if (_type!=2)&(_type!=3)&(_type!=6)&(_type!=10)&(_type!=18)&(_type!=-1){
gsel _hspwinid, 1
}
return 0
#global
//--------------------------------------------------------------------
//サンプルソース(#if 1 で実行)
#if 1
#module
;--------------------------------
; dragwindow x,y,x2,y2
; x = ドラッグウィンドウの範囲 x
; y = ドラッグウィンドウの範囲 y
; x2 = ドラッグウィンドウの範囲 x2
; y2 = ドラッグウィンドウの範囲 y2
;--------------------------------
#deffunc dragwindow int p1,int p2,int p3,int p4
if (p1<mousex)&(p2<mousey)&(p3>mousex)&(p4>mousey){
repeat:if mb=0{mb=1:aa=ginfo(0)-ginfo(4):bb=ginfo(1)-ginfo(5)}
width ,,ginfo(0)-aa,ginfo(1)-bb:getkey key,1:wait 1:if key=0{break}loop:mb=0}return
#global
xxx=100
yyy=100
Bgscr 2, 2*xxx, yyy, 6, 0, 0
onexit *e
pos 5, 5
mes "左クリック:移動\n右クリック:終了"
gsel 2, 2
//画像
bgscr 1, ginfo_dispx, ginfo_dispy,2
dialog "bmp;*.png;*.jpg;*.gif",16,""
picload ""+refstr
xxx=int (0.5*ginfo(10))
yyy=ginfo(11)
if ginfo(10)<=ginfo(11){
xxx=ginfo(10)
width 2*xxx,yyy
pos 0,0
picload ""+refstr,1
pos xxx,0
picload ""+refstr,1
bmpsave "aichan.bmp"
}
//レイヤードウィンドウ用画像の作成
repeat 4
hbmp(cnt) = lbgscr_CreateImage(1, xxx,yyy, 0, yyy*cnt)
loop
//レイヤードウィンドウの作成(これ単体でレイヤードウィンドウ用画像の作成も含む)
lbgscr 0, xxx, yyy, 6, ginfo_dispx-xxx>>1, ginfo_dispy-yyy>>1, 1, 0, 0
//lbgscr 0, 150, 150, 6, ginfo_dispx-150>>1, ginfo_dispy-150>>1, hbmp(0), 0, 0, 1
//↑こうやってもOK!
gsel 0,2
onclick gosub *click
repeat
//レイヤードウィンドウの更新(予め作成したレイヤードウィンドウ用の画像を使用する (_flag = 1))
lbgscr_Update 0, xxx, yyy, hbmp(count), 0, 0, 1
count++
if count == 1 : count = 0
wait 1
loop
stop
*m
if iparam = 1 : goto *e
dragwindow 0, 0, xxx, yyy
return
*e
repeat 1
lbgscr_DeleteImage hbmp(cnt) //ビットマップオブジェクトの削除
loop
end
#endif
*click
mousebutton=wparam
switch mousebutton
case 2
gosub *RBUTTONDOWN
swbreak
case 1
gosub *LBUTTONDOWN
swbreak
swend
return
*RBUTTONDOWN;
end
return
*LBUTTONDOWN;
gsel 0
sendmsg hwnd,$00A1,2,0
return
画像は黒の背景で画像の2倍の幅で、元のPNG画像を並べたもので、
左の画像はそのままPNG画像を貼り付けて、
右の画像にはPNG画像を反転してグレースケールにしたものを貼り付けた画像を読み込ませれば
半透明なPNG画像を表示出来ます。
出来れば、もうちょっとシンプルに出来ないものでしょうか?
お手隙の時にでも御一考頂ければ幸いです。
| |
|
2015/9/17(Thu) 21:44:29|NO.71771
普通のウインドウと同じようにつかるようにしました。
#ifndef LayeredWindowModule_destructor
#module LayeredWindowModule
;┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━
;┃ [ レイヤーウィンドウモジュール2 引用 ]
;┃ [ placeark ]
;┃ by natade
;┃ url http://www.placeark.com/
;┃
;┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#uselib "kernel32.dll"
#func VirtualAllocLayeredWindowModule "VirtualAlloc" int, int, int, int
#define NULL 0x00000000
#define PAGE_EXECUTE_READWRITE 0x00000040
#define MEM_COMMIT 0x00001000
#define MEM_RESERVE 0x00002000
#define MEM_DECOMMIT 0x00004000
#define MEM_RELEASE 0x00008000
#deffunc LayeredWindowModule_constructor
VirtualAllocLayeredWindowModule NULL, 424, MEM_RESERVE, PAGE_EXECUTE_READWRITE
VirtualAllocLayeredWindowModule stat, 424, MEM_COMMIT, PAGE_EXECUTE_READWRITE
make32bitdib_ptr = stat
dupptr make32bitdib_bin, stat, 424, vartype("int")
make32bitdib_bin( 0) = $0824548B, $8320EC83, $840F003A, $0000018E, $2C244C8B, $0F003983, $00018184, $7A8B5700
make32bitdib_bin( 8) = $247C8904, $04793B18, $0166850F, $428B0000, $08413B08, $015A850F, $7A830000, $850F000C
make32bitdib_bin( 16) = $00000146, $000C7983, $013C850F, $8B550000, $518B146A, $748D5614, $E683037F, $246C89FC
make32bitdib_bin( 24) = $24548910, $24748928, $0FC08524, $0001108E, $5C8B5300, $C9333424, $1C244C89, $38245C89
make32bitdib_bin( 32) = $20244489, $FF85D98B, $00D78E0F, $748B0000, $C58B3824, $C22BCA03, $10244489, $18247C89
make32bitdib_bin( 40) = $0241B60F, $0151B60F, $0339B60F, $3DC703C2, $000002FD, $448B2675, $B60F1024, $16890814
make32bitdib_bin( 48) = $2B44B60F, $08E0C101, $0689C20B, $2B54B60F, $00CA8102, $C1FFFFFF, $62EB10E2, $0475C085
make32bitdib_bin( 56) = $5EEB0689, $027DFA3B, $B60FFA8B, $F83B0241, $F88B027D, $1024448B, $0814B60F, $0F01B60F
make32bitdib_bin( 64) = $FAC1D0AF, $0F168908, $012B44B6, $0169B60F, $25C5AF0F, $0000FF00, $548BC20B, $06891424
make32bitdib_bin( 72) = $1354B60F, $69B60F02, $D5AF0F02, $14246C8B, $FF00E281, $E7C10000, $C1D70B10, $D00B08E2
make32bitdib_bin( 80) = $C6831689, $03C38304, $FF03C183, $0F18244C, $FFFF4B85, $247C8BFF, $24748B24, $24548B28
make32bitdib_bin( 88) = $244C8B2C, $BD048D1C, $00000000, $38244401, $4CFFCE03, $4C892024, $850F1C24, $FFFFFF04
make32bitdib_bin( 96) = $335D5E5B, $C4835FC0, $03B8C320, $5F000000, $C320C483, $000002B8, $C4835F00, $01B8C320
make32bitdib_bin(104) = $83000000, $00C320C4
VirtualAllocLayeredWindowModule NULL, 348, MEM_RESERVE, PAGE_EXECUTE_READWRITE
VirtualAllocLayeredWindowModule stat, 348, MEM_COMMIT, PAGE_EXECUTE_READWRITE
make32bitdib_fast_ptr = stat
dupptr make32bitdib_fast_bin, stat, 348, vartype("int")
make32bitdib_fast_bin( 0) = $08244C8B, $8310EC83, $840F0039, $00000140, $1C24548B, $0F003A83, $00013384, $598B5300
make32bitdib_fast_bin( 8) = $045A3B04, $011C850F, $418B0000, $08423B08, $0110850F, $79830000, $850F000C, $000000FC
make32bitdib_fast_bin(16) = $000C7A83, $00F2850F, $498B0000, $14528B14, $5B6C8D55, $FCE58303, $14246C89, $8E0FC085
make32bitdib_fast_bin(24) = $000000D0, $24748B56, $24748920, $02728D24, $244C8957, $24748910, $24448914, $00498D18
make32bitdib_fast_bin(32) = $8E0FDB85, $00000081, $2824448B, $FF8BFB8B, $8316B60F, $FA8103C6, $000000FF, $B60F2275
make32bitdib_fast_bin(40) = $0F108911, $C10151B6, $100908E2, $0251B60F, $0910E2C1, $03C18310, $00000881, $43EBFF00
make32bitdib_fast_bin(48) = $0775D285, $C1831089, $0F38EB03, $AF0F29B6, $08FDC1EA, $B60F2889, $AF0F0169, $00E581EA
make32bitdib_fast_bin(56) = $090000FF, $69B60F28, $EAAF0F02, $FF00E581, $E5C10000, $8B280908, $C11C246C, $C18318E2
make32bitdib_fast_bin(64) = $83100903, $754F04C0, $244C8B87, $24748B10, $9D048D14, $00000000, $28244401, $F503CD03
make32bitdib_fast_bin(72) = $18244CFF, $10244C89, $14247489, $FF4E850F, $5E5FFFFF, $5BC0335D, $C310C483, $000003B8
make32bitdib_fast_bin(80) = $C4835B00, $02B8C310, $5B000000, $C310C483, $000001B8, $10C48300, $000000C3
return
#define make32bitdib(%1, %2, %3) \
prm@LayeredWindowModule = varptr(%1), varptr(%2), varptr(%3):\
mref value@LayeredWindowModule, 64:\
value@LayeredWindowModule = callfunc(prm@LayeredWindowModule, make32bitdib_ptr@LayeredWindowModule, 3)
#define make32bitdib_fast(%1, %2, %3) \
prm@LayeredWindowModule = varptr(%1), varptr(%2), varptr(%3):\
mref value@LayeredWindowModule, 64:\
value@LayeredWindowModule = callfunc(prm@LayeredWindowModule, make32bitdib_fast_ptr@LayeredWindowModule, 3)
#uselib "USER32.dll"
#func ReleaseDC "ReleaseDC" sptr,sptr
#cfunc GetDC "GetDC" sptr
#func GetWindowLong "GetWindowLongA" int,int
#func SetWindowLong "SetWindowLongA" int,int,int
#func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int,int,int,int
#func UpdateLayeredWindow "UpdateLayeredWindow" int,int,int,int,int,int,int,int,int
#define WS_EX_LAYERED 0x00080000
#define ULW_ALPHA 0x00000002
#define AC_SRC_ALPHA 0x00000001
#const WS_EX_TRANSPARENT $00000020
#uselib "GDI32.dll"
#cfunc CreateCompatibleDC "CreateCompatibleDC" sptr
#cfunc CreateCompatibleBitmap "CreateCompatibleBitmap" sptr,sptr,sptr
#func SelectObject "SelectObject" sptr,sptr
#func DeleteObject "DeleteObject" sptr
#func DeleteDC "DeleteDC" sptr
#func StretchDIBits "StretchDIBits" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr
#define SRCCOPY 0x00CC0020
#deffunc disableAlphaBlendWindow
GetWindowLong hwnd, -20
if (stat & WS_EX_LAYERED){
SetWindowLong hwnd,-20,stat^WS_EX_LAYERED
}
return
#deffunc _enableAlphaBlendWindowRGB int lwaAlpha, int type,local ColorBMSCR,local AlphaBMSCR,local hdc_,local hMemDC,local hBitmap
GetWindowLong hwnd, -20
if((stat & WS_EX_LAYERED & WS_EX_TRANSPARENT) == 0) {
SetWindowLong hwnd,-20, stat | WS_EX_LAYERED | WS_EX_TRANSPARENT
}
if((biWidth != ginfo_sx)||(biHeight != ginfo_sy)) {
biWidth = ginfo_sx
biHeight = ginfo_sy
dim BITMAPINFOHEADER, 10
BITMAPINFOHEADER(0) = 40 // biSize
BITMAPINFOHEADER(1) = biWidth // biWidth
BITMAPINFOHEADER(2) = biHeight // biHeight
BITMAPINFOHEADER(3) = 1 | (32 << 16) // biPlanes & biBitCount
BITMAPINFOHEADER(4) = BI_RGB // biCompression
dim BITMAPINFO, 2
BITMAPINFO(0) = varptr(BITMAPINFOHEADER) //メンバをもつ
dim lpPixel, biWidth * biHeight
dim psize,2
psize(0) = ginfo(26)
psize(1) = ginfo(27)
dim pptSrc,2
pptSrc(0) = 0
pptSrc(1) = 0
sdim pblend, 4
poke pblend, 0, AC_SRC_OVER
poke pblend, 1, 0
poke pblend, 2, 255
poke pblend, 3, AC_SRC_ALPHA
}
mref ColorBMSCR, 67
mref AlphaBMSCR, 96 + lwaAlpha
if(type == 0) {
make32bitdib lpPixel, ColorBMSCR, AlphaBMSCR
} else {
make32bitdib_fast lpPixel, ColorBMSCR, AlphaBMSCR
}
if(stat){
return
}
hdc_ = GetDC(hWnd)
hMemDC = CreateCompatibleDC(hdc_)
hBitmap = CreateCompatibleBitmap(hdc_, biWidth, biHeight)
ReleaseDC hWnd,hdc_
SelectObject hMemDC,hBitmap
StretchDIBits hMemDC, 0, 0, biWidth, biHeight, 0, 0, biWidth, biHeight, varptr(lpPixel), BITMAPINFO, DIB_RGB_COLORS, SRCCOPY
UpdateLayeredWindow hwnd, hdc, 0, varptr(psize), hMemDC, varptr(pptSrc), 0, varptr(pblend), ULW_ALPHA
DeleteObject hBitmap
DeleteDC hMemDC
return
#define global enableAlphaBlendWindow(%1) _enableAlphaBlendWindowRGB %1, 1
#global
LayeredWindowModule_constructor
#endif
//┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//┃ [ウインドウ影光 表示モジュール]
//┃ by B(NEPI)
//┃ 前提Module:natedeさん作成 「レイヤーウィンドウモジュール2」
//┃
//┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#module GlowWindowModule
#uselib "user32.dll"
#func MoveWindow "MoveWindow" int,int,int,int,int,int
#deffunc SetWindowGlow int DrawWindow,int MainWindow,int TempWindow,int ScreenWindow,int x1,int y1,int RR,int GG,int BB
x=x1
y=y1
buffer DrawID,x,y
gsel DrawID,2
color rr,gg,bb
boxf
RA=255
buffer TempWindow,x,y
lu_x = 0 ;左上x
lu_y = 0;左上y
rd_x = x;右下x
rd_y = y ;右下y
repeat 6
color RA,255,255
lu_x++
lu_y++
rd_x--
rd_y--
line lu_x-1, lu_y, rd_x, lu_y
line lu_x, lu_y, lu_x, rd_y
line rd_x, lu_y, rd_x, rd_y
line lu_x, rd_y, rd_x, rd_y
RA-15
loop
color 73,0,130
line lu_x-1, lu_y, rd_x, lu_y
line lu_x, lu_y, lu_x, rd_y
line rd_x, lu_y, rd_x, rd_y
line lu_x, rd_y, rd_x, rd_y
buffer MainWindow,x,y
gsel MainWindow
redraw 0
gmode 6,x,y,255
pos 0,0
gcopy TempWindow
redraw 1
gsel DrawWindow
enableAlphaBlendWindow MainWindow
mhw=hwnd
gsel ScreenWindow,1
MoveWindow hwnd,wpeek(lprm,0),wpeek(lprm,2),x-13,y-20,1
gosub *WM_MOVE
oncmd gosub *WM_MOVE ,0x0003
gsel ScreenWindow,2
hw=hwnd
return
*WM_MOVE
lprm=lParam
MoveWindow mhw,wpeek(lprm,0)-7,wpeek(lprm,2)-7,x,y,1
return
#global
/*--------------ここまでモジュール---------------------*/
/*--------------以下サンプル---------------------*/
#define WM_NCLBUTTONDOWN $000000A1
#define HTCAPTION 2
bgscr 3
//SetWindowGlow 仮Buffer、仮Buffer,仮Buffer,メインScreen,R,G,b
SetWindowGlow 0,2,1,3,600,500,75,0,130
gsel 3
color 0,0,0
boxf
pos 100,200
color 255,255,255
mes "普通のウインドウと同じように使える"
button gosub "RED",*RED
button gosub "Purple",*Purple
button gosub "Orange",*Orange
button gosub "ColorPick",*Cp
button gosub "HSV",*HSV
pos 0,0
color 255,255,255
mes "光ります。 Ver2"
onclick gosub *OClick
stop
*RED
SetWindowGlow 0,2,1,3,600,500,255,0,55
return
*Purple
SetWindowGlow 0,2,1,3,600,500,75,0,130
return
*Orange
SetWindowGlow 0,2,1,3,600,500,250,122,0
return
*CP
dialog "",33
SetWindowGlow 0,2,1,3,600,500,ginfo_R,ginfo_G,Ginfo_B
return
*HSV
repeat
hsvcolor h,255,255
SetWindowGlow 0,2,1,3,600,500,ginfo_R,ginfo_G,Ginfo_B
h++
if(h==255){
h=0
}
await 100
loop
return
*OClick
if(wparam == 1 && mousex >=0 && mousex <=ginfo_winx && mousey >= 0 && mousey <=ginfo_winy/7){ //右クリ&& タイトルバー
sendmsg hwnd,WM_NCLBUTTONDOWN,HTCAPTION,0 //ウインドウ移動
}
return
| |
|
2015/9/18(Fri) 08:21:54|NO.71775
いいですね。素敵です。
ありがとうございます!!
|
|