←HSPハック トップへ

Aero グラスを拡張する

最終更新:2017/11/22

初版:2017/11/22




はじめに


Aero グラスを下の画像のようにクライアント領域に拡張させます。拡張させることによって、タイトルバーに文字列を描いている風なウィンドウを作ることができます。

Aero グラスを拡張する


dwmapi.dllのDwmExtendFrameIntoClientArea 関数を使用します。
HRESULT WINAPI DwmExtendFrameIntoClientArea(
             HWND    hWnd,
  _In_ const MARGINS *pMarInset
);
hWnd に、Aero グラスを拡張するウィンドウのハンドルを指定します。
pMarInset に、拡張する大きさが入ったMARGINS構造体へのポインタを指定します。

pMarInset で指定するMARGINS構造体は次のように定義されています。
typedef struct _MARGINS {
  int cxLeftWidth;
  int cxRightWidth;
  int cyTopHeight;
  int cyBottomHeight;
} MARGINS, *PMARGINS;
cxLeftWidth に、左枠の幅を指定します。
cxRightWidth に、右枠の幅を指定します。
cyTopHeight に、上端の高さを指定します。
cyBottomHeight に、下端の高さを指定します。

MARGINSのどれかのメンバに-1を指定すると、下の画像のような「ガラスシート」と呼ばれる、ウィンドウの境界線がないエフェクトが適用されます。
ガラスシート

Aero グラスにしたクライアント領域は黒(0, 0, 0)で塗りつぶさないと透明になりません。
それ以外の色にすると色つきのグラス効果になります。
※図形などを描画するときはGDI+などを使用しないと色が変になります。

DwmExtendFrameIntoClientAreaで指定した拡張した領域のサイズはDWMが無効になると元に戻ってしまいますので、DWMの状態が変更されたときに呼び出される WM_DWMCOMPOSITIONCHANGED メッセージを捕まえてDwmExtendFrameIntoClientArea 関数をまた呼び出す必要があります。

スクリプト


上端のAero グラスの領域を拡張して、そこに文字列を描画するサンプルです。
#uselib "dwmapi.dll"
#func DwmExtendFrameIntoClientArea "DwmExtendFrameIntoClientArea" int, var
#define WM_DWMCOMPOSITIONCHANGED 0x031E

screen 0, 200, 200
title "Aero Glass"
cls 4 //背景を黒で塗りつぶす
color 255,255,255:font "MS UI Gothic",48:mes "HSP"

gosub *OnDwmCompositionChanged
oncmd gosub *OnDwmCompositionChanged, WM_DWMCOMPOSITIONCHANGED

stop

*OnDwmCompositionChanged //DWMの状態が変更された
	margins = 0, 0, 48, 0
	DwmExtendFrameIntoClientArea hwnd, margins //ウィンドウ枠を拡張
return




[前へ] [戻る] [次へ]

(C)2019 inonote / 無断転載禁止