A2dの32bitビットマップデータをHSPの実ウインドウに直接描くことで黒い文字も透けないオシャンティなデザインが可能。
Vistaのころから何回も挑戦してついに理想の動作を手に入れたというのにWin8でグラスウインドウが廃止されてしまったKANASHIMI
A2dの32bitビットマップデータをHSPの実ウインドウに直接描くことで黒い文字も透けないオシャンティなデザインが可能。
Vistaのころから何回も挑戦してついに理想の動作を手に入れたというのにWin8でグラスウインドウが廃止されてしまったKANASHIMI
#include "a2d.hsp"#module#uselib "user32"#func GetDC "GetDC" int#func ReleaseDC "ReleaseDC" int,int#deffunc alSetAeroGlassalReleaseAeroGlasswid=ginfo_selGetDC hwnddc=statreturn dc#deffunc alReleaseAeroGlass onexitold_wid=ginfo_selif dc:gsel wid:ReleaseDC hwnd,dc:gsel old_widreturn 0#deffunc _alCopyImageToAeroGlass int p1, int x, int y, int w, int hif imgValidArr@a2d(p1) {; 実スクリーンの Graphics 作成gsel widGdipCreateFromHDC@a2d dc, varptr(tmpGraphics)if tmpGraphics {GdipSetCompositingMode@a2d tmpGraphics, 1GdipDrawImageRectRectI@a2d tmpGraphics, imgImageArr@a2d(p1), x, y, w,h, x, y, w,h, UnitPixel@a2d, pImageAttr@a2d, 0, 0GdipDeleteGraphics@a2d tmpGraphics ; tmpGraphics を削除tmpGraphics = 0return 0}}return -1#global#define alCopyImageToAeroGlass(%1,%2=ginfo_cx,%3=ginfo_cy,%4=ginfo_winx,%5=ginfo_winy) _alCopyImageToAeroGlass %1,%2,%3,%4,%5#uselib "dwmapi"#func DwmIsCompositionEnabled "DwmIsCompositionEnabled" int#func DwmExtendFrameIntoClientArea "DwmExtendFrameIntoClientArea" int,intaerorect=-1,0,0,0wx=640 : wy=480screen 0,wx,wy,2cls 4 : gsel 0,1gosub *lAeroChkoncmd gosub *lAeroChk,0x031E ;Aeroの状態が変わった時oncmd gosub *lWRedraw,0x3 ;画面外に行った時に消えるので描画しなおす(高負荷なので工夫して)alSetAeroGlassalCreateImage 0,wx,wyrepeat 10_y=cntrepeat 10_x=cntalHsvColor ((_y*10+_x)*2)\192,255,100+_y*15,200-_x*15alFillRect _x*(wx/10)+1,_y*(wy/10)+1,(wx/10)-1,(wy/10)-1looploopalFont "meiryo",60 : alColor 0,0,0,255alDrawText "そしてこの\n黒文字である\n透けていないでしょ?",0,0,wx,wy,1,1repeatgosub *lWRedrawwait 5 ;最小化からの復帰時の再描画がうまくいかないのでとりあえずループ監視loopstop*lWRedraw// 再描画(Aero環境の場合、画面外にウインドウが行くと再描画が必要)if aero{alCopyImageToAeroGlass 0}else{alCopyImageToScreen 0,0redraw}return*lAeroChkDwmIsCompositionEnabled varptr(aero)if aero!0{color 0,0,0 : boxfDwmExtendFrameIntoClientArea hwnd,varptr(aerorect)wait 1 ;何故かgselでウインドウ表示後ウエイトを入れないと中身が表示されない;(生成時のアニメーション中だとだめ?最小化から復帰アニメーション中もだめっぽい)}else{color 0,0,0 : boxf}gosub *lWRedrawreturn