スイッチの画像を自前で作るという方法で無理矢理やってみました。
なんちゃってトグルスイッチです。
参考:
https://s-kita.hatenablog.com/entry/20120408/1333895565
https://grabacr1.rssing.com/chan-23253605/latest.php
#include "advapi32.as"
#uselib "dwmapi.dll"
#func DwmGetColorizationColor "DwmGetColorizationColor" int,int
#define global circle2(%1,%2,%3,%4) circle %1,%2,(%1)+(%3),(%2)+(%4),1 //(%1,%2)の位置に%3×%4の円を描く
#define global boxf2(%1,%2,%3,%4) boxf %1,%2,(%1)+(%3)-1,(%2)+(%4)-1 //(%1,%2)の位置に%3×%4の長方形を描く
//テーマ(DARK/LIGHT)の取得
theme=1 //0の場合はダーク、1の場合はライト。取得に失敗した場合はライトにする。
hkey=0
RegOpenKeyEx 0x80000001,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize",0,1,varptr(hkey)
//HKEY_CURRENT_USER=0x80000001 KEY_QUERY_VALUE=1
if stat=0 {
data=0 : cbdata=4
RegQueryValueEx hkey,"AppsUseLightTheme",0,0,varptr(data),varptr(cbdata)
if stat=0 {
theme=(data!=0)
}
RegCloseKey hkey
}
back_c=theme*255 //背景の色
line_c=(theme=0)*255 //線の色
//アクセントカラーの取得
rgb=0x8888FF : blend=0 //取得に失敗した場合は「薄めの青」にする
DwmGetColorizationColor varptr(rgb),varptr(blend)
r=(rgb>>16)&0xFF : g=(rgb>>8)&0xFF : b=rgb&0xFF
//スイッチ画像の作成
//最初は2倍サイズで作成し、その後縮小する
d1=40 //スイッチの外周部の直径
l=4 //スイッチの縁の幅
d2=20 //スイッチの直線部分の長さ
s=48 //スイッチの左右に動く部分の直径
buffer 2,d1+s,d1*2,0 : gsel 2 : color back_c,back_c,back_c : boxf
//OFF状態
color line_c,line_c,line_c
circle2 0,0,d1,d1 : boxf2 d1/2,0,s,d1 : circle2 s,0,d1,d1
d3=d1-l*2 : s2=d1+s-l*2-d3 : color back_c,back_c,back_c
circle2 l,l,d3,d3 : boxf2 l+d3/2,l,s2,d3 : circle2 l+s2,l,d3,d3
x=(d1-d2)/2
color line_c,line_c,line_c
circle2 x,x,d2,d2
//ON状態
color r,g,b
circle2 0,d1,d1,d1 : boxf2 d1/2,d1,s,d1 : circle2 s,d1,d1,d1
color 255,255,255
circle2 d1+s-x-d2,d1+x,d2,d2
//縮小
w=(d1+s)/2 : h=d1/2 //スイッチの横幅と縦幅
buffer 1,w,h*2,0 : gsel 1 : pos 0,0
gzoom w,h*2,2,0,0,d1+s,d1*2,1
buffer 2,1,1,0 //不要になったバッファを消去
gsel 0
celdiv 1,w,h
//メイン
color back_c,back_c,back_c : boxf
prm=0 //ON・OFF状態
x=100 : y=100 //スイッチの表示座標
gosub *draw_switch
onclick gosub *click
stop
*click
mx=mousex : my=mousey
if (mx>=x)&(mx<x+w)&(my>=y)&(my<y+h) {
prm=(prm=0)
gosub *draw_switch
}
return
*draw_switch
//スイッチの描画
pos x,y
celput 1,prm
return