UWSCの標準ダイアログをカスタマイズする

公式掲示板に「ボックスをフォームの中央に表示させたい」というのがあったので、考えてみた。


やはり、、、一旦画面外に表示して、スレッドで操作でしょう。



まずは回答スクリプト

Dlg.uws

OPTION EXPLICIT

IFB REPLACE(REPLACE(GET_UWSC_NAME, ".EXE", ""), ".UWS", "") = "Dlg" THEN
	DIM msg = "マウスポインターのあるウインドウの中央に表示。<#CR>または相対位置"
	DIM id, mode = -1
	WHILE msg <> EMPTY
		IF mode = -1 THEN id = GETID(GET_FROMPOINT_WIN)
		Dlg.MessageBox(msg, id)
		IF mode = -1 THEN id = GETID(GET_FROMPOINT_WIN)
		msg = Dlg.InputBox("表示させるメッセージをどうぞ", id)
		IFB msg = EMPTY THEN
			IF mode = -1 THEN id = GETID(GET_FROMPOINT_WIN)
			SELECT Dlg.SelectBox(SLCT_BTN, 0, "現在ポインターが指すWindowに固定する?", "はい,いいえ,終了", id)
			CASE SLCT_1
				mode = GETID(GET_FROMPOINT_WIN)
				msg = "固定モード"
			CASE SLCT_2
				mode = -1
				msg = "マウスポインターに従う"
			SELEND
		ENDIF
	WEND
ENDIF


MODULE Dlg
	PROCEDURE _moveThread(x, y, baseId, title, class)
		IF baseId < 0 THEN baseId = GETID(GET_ACTIVE_WIN)
		SLEEP(0.1)
		DIM wid = GETID(title, class)
		IFB wid > -1 THEN
			DIM bx = STATUS(baseId, ST_X), by = STATUS(baseId, ST_Y)
			DIM bw = STATUS(baseId, ST_WIDTH), bh = STATUS(baseId, ST_HEIGHT)
			DIM mw = STATUS(wid, ST_WIDTH), mh = STATUS(wid, ST_HEIGHT)
			IFB x = ERR_VALUE THEN
				x = bx + (bw - mw) / 2
			ELSE
				x = x + bx
			ENDIF
			IFB y = ERR_VALUE THEN
				y = by + (bh - mh) / 2
			ELSE
				y = y + by
			ENDIF
			ACW(wid, x, y)
		ENDIF
	FEND

	FUNCTION MessageBox(msg, baseId=ERR_VALUE, btn=BTN_OK, x=ERR_VALUE, y=ERR_VALUE, fcs=BTN_OK)
		THREAD _moveThread(x, y, baseId, REPLACE(GET_UWSC_NAME, ".EXE", ""), "TFmsgDlg.UnicodeClass")
		RESULT = MSGBOX(msg, btn, -ERR_VALUE, -ERR_VALUE, fcs)
	FEND

	FUNCTION InputBox(msg, baseId=ERR_VALUE, def="", pass=FALSE, x=ERR_VALUE, y=ERR_VALUE)
		THREAD _moveThread(x, y, baseId, REPLACE(GET_UWSC_NAME, ".EXE", ""), "TFInpBox.UnicodeClass")
		RESULT = INPUT(msg, def, pass, -ERR_VALUE, -ERR_VALUE)
	FEND

	FUNCTION SelectBox(type, time, msg, sels, baseId=ERR_VALUE, x=ERR_VALUE, y=ERR_VALUE)
		THREAD _moveThread(x, y, baseId, REPLACE(GET_UWSC_NAME, ".EXE", ""), "TFSectBox.UnicodeClass")
		RESULT = SLCTBOX(type, time, -ERR_VALUE, -ERR_VALUE, msg, SPLIT(sels, ","))
	FEND
ENDMODULE

なるべく標準関数と同じ引数にして、baseIdを追加。
スレッドを起動しておき、標準関数による表示の後、スレッドが座標計算して表示。


ま、いろいろカスタマイズする必要はあるかもしれません。


あとは、以下を参考にすると、半透明とか右寄せとかもできたりします。
UWSCでウインドウスタイルを変更する - じゅんじゅんのきまぐれ

追記 20120606

EXE化対応で、微修正。
具体的には、サンプルコードの実行判定と、_moveThreadの第四引数をスクリプトでもEXEでも良いようにした。