HSP3 あれこれ <オブジェクト 6>

Last Update : 2007/04/xx

◇ その他のオブジェクト

 HSPの標準命令では用意されていない各種オブジェクト(コントロール)のサンプルコード&モジュールスクリプトを掲載しています。細かい解説は、ほとんど用意してません。以下のオブジェクトは、別ページです〜。

 ⇒ プログレスバー、ステータスバー、アニメーションコントロール
 ⇒ トラックバー、アップダウンコントロール
 ⇒ 月間カレンダーコントロール、日時指定コントロール

↑TOP↑

タブコントロールの作成

 タブコントロールというは、1範囲内に複数個の表示領域が含まれているコントロールで、タブつまみの選択で任意の領域を表示できます。このコントロールの設置については、ちょくとさんのページを参照してください。それぞれの項目には、bgscr命令で作成したウィンドウを貼り付ける形になります。

 以下は、あくまで自前用に作成したモジュールを、公開向けに少々改良したものです。手抜きからくる関係上、いろいろと制約があり、タブコントロールは1つしか設置できない、タブのつまみは1段表示のみで多段タブ不可、といったところ。純粋にタブコントロールを設置する以外の処理は全く用意していません。

;	超低機能なタブコントロール作成モジュール (by Kpan)

#module

#uselib "user32"
#func GetClientRect "GetClientRect" int, int
#func SetWindowLong "SetWindowLongA" int, int, int
#func SetParent "SetParent" int, int

#uselib "gdi32"
#cfunc GetStockObject "GetStockObject" int

;	CreateTab p1, p2, p3, p4
;	タブコントロールを設置します。statにタブコントロールのハンドルが
;	返ります。
;	p1〜p2=タブコントロールのX/Y方向のサイズ
;	p3(1)=タブの項目として貼り付けるbgscr命令の初回ウィンドウID値
;	p4=タブコントロールの追加ウィンドウスタイル
#deffunc CreateTab int p1, int p2, int p3, int p4
	winobj "systabcontrol32", "", , $52000000 | p4, p1, p2
	hTab = objinfo(stat, 2)
	sendmsg hTab, $30, GetStockObject(17)

	TabID = p3
	if TabID = 0 : TabID = 1

	dim rect, 4

	return hTab

;	InsertTab "タブつまみ部分の文字列"
;	タブコントロールに項目を追加します。
#deffunc InsertTab str p2
	pszText = p2 : tcitem = 1, 0, 0, varptr(pszText)
	sendmsg hTab, $1307, TabItem, varptr(tcitem)

	GetClientRect hTab, varptr(rect)
	sendmsg hTab, $1328, , varptr(rect)

bgscr TabID + TabItem, rect.2 - rect.0, rect.3 - rect.1, 2, rect.0, rect.1
	SetWindowLong hwnd, -16, $40000000
	SetParent hwnd, hTab

	TabItem++
	return

;	タブ切り替え処理用
#deffunc ChangeTab
	gsel wID + TabID, -1

	sendmsg hTab, $130B
	wID = stat
	gsel wID + TabID, 1

	return

#global

;	以下、サンプル
	screen , 400, 300

	syscolor 15 : boxf


;	タブコントロールの設置。第3パラはbgscr命令で作成するウィンドウ
;	IDの初期値です。たとえば、下のように「1」でタブの項目が4個あると
;	すると、1〜4のウィンドウが使われます。「2」でタブの項目が5個とすると、
;	2〜6が使われます。別で使用するウィンドウID値と被らないよう注意。
	pos 50, 50
	CreateTab 300, 200, 1
;	タブつまみ切り替え時に利用するタブコントロールのハンドルを取得
	hTabControl = stat

;	このサンプル上ではbgscr命令で作成したウィンドウID値「1」が使われ
;	ます。
	InsertTab "AAA"
;		bgscr命令上にオブジェクトを置く感覚で処理を書きます。
		pos 50, 50 : mes "A"

	InsertTab "BBB"
		pos 50, 50 : mes "B"

	InsertTab "CCC"
		pos 50, 50 : mes "C"

;	bgscr命令ウィンドウのID値「4」が使われます。
	InsertTab "DDD"
		pos 50, 50 : mes "D"

;	タブの項目追加が終わったら、タブ内に貼り付けたbgscr命令が非表示
;	状態になっているので、表示されるようgsel命令を指定。CreateTab命令で
;	指定したウィンドウIDの初期値と同じ値を指定します。
	gsel 1, 1

;	元々のscreen命令のウィンドウID 0に描画先を戻します。
	gsel

;	タブ項目切り替え処理時のメッセージ (WM_NOTIFY)
	oncmd gosub *notify, $4E

	stop


;	タブ項目切り替え処理部分です。
*notify
	dupptr nmhdr, lparam, 12
	if nmhdr.0 = hTabControl & nmhdr.2 = -551 {
		ChangeTab
;		元々のscreen命令のウィンドウID 0に描画先を戻します。
		gsel
	}
	return

 上のサンプルでは指定していませんが、CreateTab命令の第4パラではタブコントロールの追加ウィンドウスタイルを指定できるようにしてあります。

;	タブのつまみを下部分に表示します
#define TCS_BOTTOM $2

;	TCS_BUTTONSとの組み合わせで平らなボタンを表示する
;	(TCS_BUTTONS以外の組み合わせによっては表示の挙動が変になります。
#define TCS_FLATBUTTONS $8

;	TCS_FLATBUTTONSとTCS_BUTTONSの組み合わせでマウスカーソル下の
;	ボタンをハイライト表示するようにします
#define TCS_HOTTRACK $40

;	タブのつまみをボタン形式で表示します。
#define TCS_BUTTONS $100

;	タブ項目の文字列の長さに関わらず、タブつまみの横幅をすべて同じ
;	サイズにします。(※)
#define TCS_FIXEDWIDTH $400

;	タブつまみにフォーカスを受け取らないようにします。
#define TCS_FOCUSNEVER $8000

 タブつまみをボタンタイプにして、タブボタンの横幅を均一にする場合。

;	前後の処理を端折ってますが。
	CreateTab 200, 300, 1, TCS_BUTTONS | TCS_FLATBUTTONS | TCS_FIXEDWIDTH
	hTabControl = stat

;	(※)つまみの横幅を同じにした場合の横幅サイズを指定するには
;	以下のようにsendmsg命令を使用します。第4パラ(lparam値)にサイズ。
	sendmsg hTabControl, $1329, , 64

↑TOP↑

リストビューの表示 (カスタムドロー)

 HSP3公式サイトHSPTV内の掲示板にて提示した、リストビューコントロールの表示&カスタムドローによる項目の背景色と文字色変更サンプルスクリ。細かい説明一切なし。(→カスタムドロー 備忘録メモ)

;	リストビューの表示&カスタムドロー (by Kpan)

#define LVM_INSERTITEM $1007
#define LVM_INSERTCOLUMN $101B
#define LVM_SETEXTENDEDLISTVIEWSTYLE $1036


	oncmd gosub *notify, $4E

	winobj "syslistview32", "", $200, $50000001, 300, 200
	hListview = objinfo(stat, 2)

//	選択項目の場合にフォーカス外の背景色が消える?みたいなので
//	項目全体フォーカス
	sendmsg hListview, LVM_SETEXTENDEDLISTVIEWSTYLE, , $20

	szText = "ああああ"
	LVCOLUMN = $F, 0, 200, varptr(szText), 0, 0
	sendmsg hListview, LVM_INSERTCOLUMN, 0, varptr(LVCOLUMN)

	pszText = "AAAAAA"
	LVITEM = 1, 0, 0, 0, 0, varptr(pszText)
	sendmsg hListview, LVM_INSERTITEM, , varptr(LVITEM)

	pszText = "BBBBBB"
	LVITEM = 1, 1, 0, 0, 0, varptr(pszText)
	sendmsg hListview, LVM_INSERTITEM, , varptr(LVITEM)

	stop


*notify
	dupptr NMHDR, lparam, 12
	if NMHDR.0 = hListview {
		if NMHDR.2 = -12 {
			dupptr NMLVCUSTOMDRAW, lparam, 60

			if NMLVCUSTOMDRAW.3 = $1 {
				return $20
			}

			if NMLVCUSTOMDRAW.3 = $10001 {
				if NMLVCUSTOMDRAW.9 = 0 {
					NMLVCUSTOMDRAW.12 = $FFFF00
					NMLVCUSTOMDRAW.13 = $00FFFF
					return $2
				}
				if NMLVCUSTOMDRAW.9 = 1 {
					NMLVCUSTOMDRAW.12 = $FFFFFF
					NMLVCUSTOMDRAW.13 = $0000FF
					return $2
				}
			}

		}
	}

	return

 上のカスタムドローとは別に、チェックボックス付きリストボックス風オブジェクトを作成するモジュールを配布しています。実際にリストボックスにチェックボックスを付けるには、「オーナードロー」という機能を利用して、項目内の描画処理をすべて自前で用意しないといけないので、標準でチェックボックス機能が用意されているリストビューコントロールを代用します。(ダウンロードは最下部より...

↑TOP↑

ツールチップの表示

 オブジェクト上にマウスカーソルを移動すると、説明などが書かれた小さなウィンドウ枠が表示されるツールチップコントロール。HSP2では、llmod.asモジュールによるtooltip命令が用意されていました。

= = = = =

 こちらでは、HSP3向けのツールチップ表示モジュールと、チェックボックス付きリストボックス風オブジェクト(リストビュー代用)表示モジュールの2点を配布しています。

ダウンロード (オブジェクト編 6)

↑TOP↑

<< オブジェクト 5 | HSP3 オブジェクト | オブジェクト 7 >>

Copyright © 2005-2012 . All rights reserved.