UWSCでウインドウスタイルを変更する

UWSCのSLCTBOXを左詰に出来ないか、というのを見たので書いてみた。
一瞬、センタリングの表示が見えるのは、ご愛嬌。
ついでに、Windowの変更を汎用的に行うモジュールにしてみた。


追記。半透明機能もつけて、スクリプトを修正。




WindowLong.uws

OPTION EXPLICIT

IFB GET_UWSC_NAME = "WindowLong.uws" THEN
	THREAD TestSlctBox()
	PRINT SLCTBOX(SLCT_BTN OR SLCT_STR, 0, "メッセージ", "項目1", "項目2", "項目3", "...")
ENDIF

PROCEDURE TestSlctBox()
	DIM hnd, style, i, id = GETID("UWSC - " + GET_UWSC_NAME, "TFSectBox.UnicodeClass")
	WindowLong.SetTransparent(IDTOHND(id), 0)
	FOR i = 0 TO GETALLWIN(id) - 1
		hnd = IDTOHND(ALL_WIN_ID[i])
		style = WindowLong.Get(hnd, WindowLong.GWL_STYLE)
		WindowLong.Set(hnd, WindowLong.GWL_STYLE, style OR $100)	// BS_LEFT = $100
	NEXT
	WindowLong.SetTransparent(IDTOHND(id), 150, 0)
FEND


MODULE WindowLong
	DEF_DLL GetWindowLongA(dword, int): long: user32
	DEF_DLL SetWindowLongA(dword, int, long): long: user32
	DEF_DLL InvalidateRect(dword, dword, bool): bool: user32
	DEF_DLL SetLayeredWindowAttributes(dword, dword, byte, dword): bool: user32

	//CONST GWL_WNDPROC = -4
	CONST GWL_HINSTANCE = -6
	CONST GWL_HWNDPARENT = -8
	CONST GWL_STYLE = -16
	CONST GWL_EXSTYLE = -20
	CONST GWL_USERDATA = -21
	CONST GWL_ID = -12
	CONST DWL_MSGRESULT = 0
	//CONST DWL_DLGPROC = 4
	CONST DWL_USER = 8

	CONST WSEX_LAYERED = $00080000
	CONST NOT_WSEX_LAYERED = $FFF7FFFF
	CONST LWA_COLORKEY = $1
	CONST LWA_ALPHAKEY = $2

	FUNCTION Get(hnd, style)
		RESULT = GetWindowLongA(hnd, style)
	FEND

	FUNCTION Set(hnd, style, val, up=TRUE)
		RESULT = SetWindowLongA(hnd, style, val)
		IF up THEN InvalidateRect(hnd, 0, TRUE)
	FEND

	FUNCTION SetTransparent(hnd, al=-1, cl=-1)
		DIM style = GetWindowLongA(hnd, GWL_EXSTYLE)
		DIM key = 0
		IF cl > -1 THEN key = key OR LWA_COLORKEY
		IF al > -1 THEN key = key OR LWA_ALPHAKEY
		IFB key > 0 THEN
			RESULT = SetWindowLongA(hnd, GWL_EXSTYLE, style OR WSEX_LAYERED)
			IF RESULT THEN RESULT = SetLayeredWindowAttributes(hnd, cl, al, key)
		ELSE
			RESULT = SetWindowLongA(hnd, GWL_EXSTYLE, style AND NOT_WSEX_LAYERED)
		ENDIF
	FEND

ENDMODULE


なお、右詰にしたい場合は、BS_RIGHT=$200。