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。