NO.28291で投稿したスクリプトの挙動にちょっと問題があったので修正&モジュール化。
文字等にアンチエイリアスがかかると輪郭が汚くなるので、素直にGDI+使った方がいいかも。
>inoviaさんの貼っていただいたURLのスクリプトを実行するとどのような感じになるのでしょうか?
こんな感じ
http://twitpic.com/bg0h6a
#module TransparentWindow
#uselib "dwmapi.dll"
#func DwmExtendFrameIntoClientArea "DwmExtendFrameIntoClientArea" int, var
#uselib "user32.dll"
#func ClientToScreen "ClientToScreen" int, var
#cfunc GetWindowLongA "GetWindowLongA" int, int
#func GetWindowRect "GetWindowRect" int, var
#func GetClientRect "GetClientRect" int, var
#func SetWindowLongA "SetWindowLongA" int, int, int
#func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int, int, int, int
#func SetParent "SetParent" int, int
#func SetWindowPos "SetWindowPos" int, int, int, int, int, int, int
#define WM_MOVE 0x0003
#define WM_SIZE 0x0005
#define WM_NCACTIVATE 0x0086
#define WM_ACTIVATE 0x0006
#define WS_EX_NOACTIVATE 0x08000000
#define WS_EX_LAYERED 0x00080000
#define WS_CHILD 0x40000000
#define SWP_NOSIZE 0x0001
#define SWP_NOMOVE 0x0002
#define SWP_NOACTIVATE 0x0010
#define GWL_STYLE (-16)
#define GWL_HWNDPARENT (-8)
#define GWL_EX_STYLE (-20)
#define ctype RGB(%1,%2,%3) (%1 | %2 << 8 | %3 << 16)
#define global screen_ex(%1=0,%2=640,%3=480,%4=0,%5=-1,%6=-1,%7=-1,%8=-1) _screen_ex %1, %2, %3, %4, %5, %6, %7, %8
#deffunc tcolor int _r, int _g, int _b
r = _r : g = _g : b = _b
return
#deffunc _screen_ex int _id, int _width, int _height, int _mode, int _posx, int _posy, int _sizex, int _sizey
// 外側用のウィンドウ作成
if _sizex == -1 : sizex = _width
if _sizey == -1 : sizey = _height
screen _id + 1, _width, _height, _mode, _posx, _posy, sizex, sizey : hParent = hwnd
// クライアント座標からスクリーン座標に変換
dim point, 4 : ClientToScreen hParent, point
// 内側用のウィンドウ作成(描画先)
bgscr _id, _width, _height, _mode, point(0), point(1), sizex, sizey : hChild = hwnd
SetWindowLongA hChild, GWL_HWNDPARENT, hParent
SetWindowLongA hChild, GWL_EX_STYLE, GetWindowLongA(hChild, GWL_EX_STYLE) | WS_EX_LAYERED
SetLayeredWindowAttributes hChild, RGB(r, g, b), 0, 1
gsel _id + 1, 0
oncmd gosub *MOVE, WM_MOVE
oncmd gosub *SIZE, WM_SIZE
oncmd gosub *NCACTIVATE, WM_NCACTIVATE
oncmd gosub *ACTIVATE, WM_ACTIVATE
// -1 を指定するとウィンドウ全体
margins = -1, 0, 0, 0
DwmExtendFrameIntoClientArea hParent, margins
boxf
gsel _id, 0
oncmd gosub *NCACTIVATE, WM_NCACTIVATE
color r, g, b : boxf
return
*SIZE
// リサイズ時の処理
rect = 0, 0, 0, 0
GetClientRect hParent, rect
SetWindowPos hChild, 0, 0, 0, rect.2, rect.3, SWP_NOMOVE | SWP_NOACTIVATE
return
*MOVE
// 移動したときに ID 0 の位置に ID 1のウィンドウを移動させる
xPos = (lParam & 0xFFFF) : yPos = (lParam>>16) & 0xFFFF
if xPos > (0xFFFF/2) : xPos = xPos - 0xFFFF
SetWindowPos hChild, 0, xPos, yPos, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE
return
*NCACTIVATE
fActive = wParam & 0xFFFF
// 非アクティブ化されようとしているときは、ウィンドウをチェック
if fActive == 0{
if lParam == hChild : return 1
}
return
*ACTIVATE
fActive = wParam & 0xFFFF
if fActive == 0{
SetWindowPos hParent, hChild, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE
logmes "OFF"
}else{
SetWindowPos hParent, hChild, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE
logmes "ON"
}
return
#global
// 透明にする色を指定します
tcolor 254, 254, 254
// Aeroな半透明ウィンドウ化命令
// screen命令と引数が同一ですが、ウィンドウが2つ分消費されます
// 第1引数に0を指定した場合は、ID:0とID:1のウィンドウが作成されます
// (指定したID+1が使用される)
screen_ex 0
// 文字を書いてみる(ID:0)
gsel 0, 0
color 255
font "FixedSys", 14
mes "Aeroな半透明ウィンドウ!"
color 255
font "メイリオ", 32, 16
mes "アンチエイリアスが有効だと汚くなる\n(GDI+を使った方が良い)"
button gosub "ボタン", *btn
// title命令を使用する場合は gsel で変更する必要があります(ID:1)
gsel 1, 0 : title "Aeroな半透明ウィンドウ"
stop
*btn
dialog "ボタン"
return