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

Last Update : 2009/04/xx

◇ ボタン (button命令) / チェックボックス (chkbox命令)

 button命令とchkbox命令。見た目はぜんぜん違いますが、どちらも「ボタンコントロール」に分類されてます。ボタンの見た目を変えただけなのがチェックボックスであり、他にもラジオボタンやグループボックスがこのグループに含まれてます。

 このオブジェクトに関する基礎的な情報は、button命令の解説chkbox命令の解説のページを参照してください。

↑TOP↑

ボタンのウィンドウスタイル変更

 Win32 API関数を利用して、button命令で設置できるボタンオブジェクトの見た目(=ウィンドウスタイル)を変更してみるサンプルです。通常は、ボタンの中央にある文字列の表示位置を変更したり、文字列を複数行で表示することが可能です。(ウィンドウスタイルについては、ちょくとさんのページを参照)

 現在のボタンのウィンドウスタイルをGetWindowLong関数で取得し、それにプラスした新たなウィンドウスタイルを SetWindowLong関数で指定してやります。ボタンのウィンドウハンドルを取得するのにobjinfo関数を利用します。

//	太枠ボタン

#include "user32.as"

	objsize 200, 40

	button "枠強調ボタン", *jump
	hButton = objinfo(stat, 2)

;	ウィンドウスタイルの取得と変更
	GetWindowLong hButton, -16
	SetWindowLong hButton, -16, stat | $1

*jump

 さて、厳密にやると上のようになりますが、HSPに登場するボタンのウィンドウスタイルは、あらかじめ「WS_CHILD + WS_VISIBLE = $50000000」と分かっているので、GetWindowLong関数の部分は省略しても問題ないでしょう。

//	ボタンのウィンドウスタイル変更サンプル (by Kpan)

#include "user32.as"

	objsize 200, 40, 50

;	これは標準のボタン
	button "ふつーのボタン", *jump

;	太枠ボタン (BS_DEFPUSHBUTTON)
	button "枠強調ボタン (SetWindowLong)", *jump
	SetWindowLong objinfo(stat, 2), -16, $50000000 | $1

;	太枠はsendmsg命令だけで実現可
	button "枠強調ボタン (sendmsg)", *jump
	sendmsg objinfo(stat, 2), $F4 , $1

;	テキスト表示位置の変更 (BS_LEFT/BS_RIGHT/BS_TOP/BS_BOTTOM)
;	$100=左寄り、$200=右寄り、$400=上寄り、$800=下寄り
;	複数個組み合わせれば「左下」に表示
	button "テキスト位置変更ボタン", *jump
	SetWindowLong objinfo(stat, 2), -16, $50000000 | $100 | $800

;	複数行テキスト・縦書き表示風にも (BS_MULTILINE)
;	ボタンに収まるよう文字列を自動改行 (「\n」で手動改行)
	button "複数行\nボタン", *jump
	SetWindowLong objinfo(stat, 2), -16, $50000000 | $2000

;	フラットスタイルのボタン (BS_FLAT)
;	Windows XP以降のビジュアルスタイル時は変化なし
	button "フラットボタン", *jump
	SetWindowLong objinfo(stat, 2), -16, $50000000 | $8000

	stop

*jump

 このサンプルを元にしたボタンのウィンドウスタイルを変更するモジュールは、このページの最下部よりダウンロードできます。モジュールにしなければならないほど複雑なスクリプトではありませんが・・・ (^^;

↑TOP↑

チェックボックスのウィンドウスタイル変更

 Win32 API関数を利用して、chkbox命令で設置できるチェックボックスのウィンドウスタイルを変更してみるサンプルです。ボタンのウィンドウスタイル変更処理と同じです。

 上のボタンのウィンドウスタイル変更にもあるように、現在のチェックボックスのウィンドウスタイルを取得し、それにプラスした新たなウィンドウスタイルを適用してやるわけですが、HSPに登場するチェックボックスのウィンドウスタイルは、「WS_CHILD + WS_VISIBLE + BS_AUTOCHECKBOX = $50000003」となっているので、GetWindowLong関数は省略します。

//	チェックボックスのウィンドウスタイル変更サンプル (by Kpan)

#include "user32.as"

	objsize 150, 40, 50

	chkbox "ふつーのチェックボックス", x

	chkbox "右側にチェック項目", x
	SetWindowLong objinfo(stat, 2), -16, $50000003 | $20

;	$100=左寄り、$200=右寄り、$400=上寄り、$800=下寄り。
;	複数個組み合わせて「右上」に。
	chkbox "表示位置変更", x
	SetWindowLong objinfo(stat, 2), -16, $50000003 | $200 | $400

;	チェックボックスに収まるよう文字列を自動改行 (「\n」で手動改行)
	chkbox "複数行\nチェックボックスですー", x
	SetWindowLong objinfo(stat, 2), -16, $50000003 | $2000

;	フラットスタイル (Windows XP以降のビジュアルスタイル適用時は変化なし)
	chkbox "フラットチェックボックス", x
	SetWindowLong objinfo(stat, 2), -16, $50000003 | $8000

 このサンプルを元にしたチェックボックスのウィンドウスタイルを変更するモジュールは、このページの最下部よりダウンロードできます。モジュールにしなければならないほど複雑なスクリプトではありませんが・・・ (^^;

↑TOP↑

チェックボックスの監視

 チェックボックスというのは、内部的にはボタンオブジェクトです。HSPのbutton命令は、押した時にラベルにジャンプする機能を持っています。これをうまく利用して、チェックボックスのチェックの有無をリアルタイムで監視してみることにします。

 下のサンプルは、チェックボックスにチェックが入っているとオブジェクトが使用可能な状態(有効化)になり、入っていないとグレー表示の使用不可な状態(無効)となるスイッチ処理が行われます。

 オブジェクトの有効/無効の切り替えは、Win32 API関数のEnableWindow関数を使います。HSP2のllmod.as+obj.asで「objgray命令」というのが用意されてましたが、この関数をモジュール内で呼び出してただけです。HSP3でも「common\obj.as」に同じモジュール命令が用意されてます。

//	チェックボックス監視サンプル (by Kpan)

#include "user32.as"

;	普通にボタンを作成
	button "切り替え", *check
	hButton = objinfo(stat, 2)

;	ボタンのウィンドウスタイルを変更してチェックボックス化
	sendmsg hButton, $F4, $3

;	チェックボックスにチェックを入れる (BM_SETCHECK)
;	第3パラに 0=チェックあり、1=チェックなし
;	(標準のobjprm命令では制御できないため)
	sendmsg hButton, $F1, 1

	pos , 50
	objsize 100, 22

	input x
	hInput = objinfo(stat, 2)

	combox y, , "HSP\n講座\nプログラミング\nサンプル"
	hCombox = objinfo(stat, 2)

	chkbox "チェックボックス", z
	hChkbox = objinfo(stat, 2)

	stop

*check
;	チェックボックスの状態を取得 (BM_GETCHECK)
;	statに 0=チェックなし、1=チェックありが返る
	sendmsg hButton, $F0
	value = stat

	title ""+value

;	オブジェクトの使用可/使用不可の切り替え
;	第2パラが1だと有効化、0だと無効化
	EnableWindow hInput, value
	EnableWindow hCombox, value
	EnableWindow hChkbox, value

 ちなみに、入力ボックスとメッセージボックスについては、EnableWindow関数を使わず、sendmsg命令だけで有効無効の切り替えが可能です。(→入力ボックスの編集無効 を参照)

↑TOP↑

3ステートチェックボックス の設置

 chkbox命令には、「チェックあり」と「チェックなし」の2つの状態が存在しますが、ここにもう1つ「不確定」の状態を加えた3つの状態を持つチェックボックスの設置です。sendmsg命令でウィンドウスタイルを変更してやります。

 3つ目の状態は、チェックありのグレー表示(Windows XP以降のビジュアルスタイル適用時は四角いチェックマーク)で表現されます。注意点として、チェックボックスのデフォルト状態を指定するのに、通常ではあらかじめchkbox命令の状態保持変数に1を指定しておきますが、グレー表示の状態は指定できないのでsendmsg命令を使います。

//	3ステートチェックボックス作成サンプルソース (by Kpan)

;	a = 1 ; チェックあり、になります
;	a = 2 ; グレー表示チェックありになりません

	chkbox "3ステート", a

;	3ステートチェックボックス化
	sendmsg objinfo(stat, 2), $F4, $6

;	objprm 0, 1 ; OK
;	objprm 0, 2 ; ×
;	なので、グレー表示に変更したい場合 (BM_SETCHECK)
//	sendmsg objinfo(0, 2), $F1, 2
//	a = 2 ; これも必要

	button "チェック!", *check
	stop

*check
;	0=チェックなし、1=チェックあり、2=グレー表示チェックあり が返る
	mes a

↑TOP↑

トグルボタンの設置

 button命令で作成したボタンは、マウスをクリックするとへこんで、離すと元の状態に戻る、という一連の動きをします。ここでは、押した直後にへこんだまま、それを押すと元の状態に戻る、という2段階の動きをするトグルボタンを作成してみます。

 で、実際使うのはボタンではなく、チェックボックス(chkbox命令)をうまく利用します。チェックボックスに「チェックが入っている=ボタンがへこんでいる」、「チェックが入っていない=ボタンが膨らんでいる」という考え方です。

 Win32 API関数のSetWindowLong関数を利用して、チェックボックスのウィンドウスタイルを変更(BS_PUSHLIKE)してやります。

//	トグルボタン作成サンプルソース1 (by Kpan)
//	chkbox命令を利用した手法

#include "user32.as"

;	チェックボックスの状態保持変数に1を入れるとチェックが入る、つまり
;	へこみボタンになります。設置後のオン/オフ制御は普通にobjprm命令を利用。
	c2 = 1

	chkbox "第壱番", c1
	SetWindowLong objinfo(stat, 2), -16, $50000003 | $1000

	chkbox "第弐番", c2
	SetWindowLong objinfo(stat, 2), -16, $50000003 | $1000

	pos , 100

	button "御確認", *check
	stop

;	状態の確認。普通にチェックボックスの状態保持変数を確認しませう。
;	0=チェックなし(膨らんでいる)、1=チェックあり(へこんでいる)
*check
	title ""+c1+" / "+c2

 このサンプルを元にしたトグルボタンの設置モジュールは、このページの最下部よりダウンロードできます。モジュールにしなければならないほど複雑な処理は必要ありませんが。(^ー^;

 ついでに、chkbox命令ではなく、button命令のウィンドウスタイルを変更する方法です。この手法の場合だと、HSPのボタンラベルジャンプ機能を利用して、トグルの状態をリアルタイムで監視できます。

//	トグルボタン作成サンプルソース2 (by Kpan)
//	button命令を利用した手法

#include "user32.as"

	button "OFF", *jump
	SetWindowLong objinfo(stat, 2), -16, $50000003 | $1000

;	切り替え時のボタン表示文字列用
	string = "ON", "OFF"

	stop

*jump
	objprm 0, string.value

	value ^ 1

	title ""+value

↑TOP↑

画像ボタン(イメージボタン) の設置

 画像ボタン(イメージボタン)の作成です。「llmod.as」モジュールを利用してビットマップを貼り付けるbtnimg命令を利用する、あるいはマウスの動きを監視しながら標準命令を利用してボタン風処理を自前で用意する方法があります。(→参照、HSP開発wiki

 HSP3.2以降は、objimage命令という命令もサポートしてます。(下の文字色変更を参照)

 ここでは、ボタンに貼り付けるビットマップファイルを実行ファイル内にリソースとして埋め込む、というHSP的には特殊な手法を行います。かなりめんどくさいです。リソースエディタ「Resource Hacker」を別途用意してください。

  1. 後に実行ファイルとなる hsprt、または runtime フォルダの *.hrt をリソースエディタで読み込みます。[アクション]メニューの[新しいリソースを追加する]を選択し、ビットマップファイル(*.bmp)を1つ選択します。
  2. [リソースの種類]には自動的に「BITMAP」が入ります。[リソース名]は適当な任意の数値(例として1)を、[リソースの言語]は適当に「1033」と入力します。そして、[リソースを追加する]ボタンを押します。
  3. [ファイル]メニューの[名前を付けて保存する]で、必ず任意のファイル名で保存します。拡張子は *.hrt で、例として hogehoge.hrt とします。このファイルは runtimeフォルダ に置いておいてください。

 これで下準備が完了。1つのボタン用に1つのビットマップファイルを用意することになります。HSPのPACKFILE機能は利用しません。下が埋め込んだ画像を利用するためのコードです。モジュール+サンプルの形式になっています。

//	ボタンにビットマップを貼り付けるモジュール (by Kpan)

#module

#uselib "user32"
#cfunc LoadImage "LoadImageA" int, int, int, int, int, int
#func SetWindowLong "SetWindowLongA" int, int, int

#uselib "gdi32"
#func DeleteObject "DeleteObject" int

;	SetBitmap p1, p2
;		p1=ボタンのオブジェクトID
;		p2=[リソース名]で指定した任意の数値
#deffunc SetBitmap int p1, int p2
	hButton = objinfo (p1, 2)
	SetWindowLong hButton, -16, $50000000 | $80

	hBitmap.i = LoadImage (hinstance, p2, , , , )
	if hBitmap.i = 0 : return
	sendmsg hButton, $F7, , hBitmap.i

	i++
	return

;	ビットマップの開放
;		(※自動的に行われるので呼び出し不要)
#deffunc DelBitmap onexit
	repeat i
		DeleteObject hBitmap.cnt
	loop
	return

#global

;	以下、サンプル

;	画像を埋め込んだランタイムファイルをパックオプションで指定
#packopt runtime "hogehoge.hrt"

	objsize 200, 100

;	表示文字列は指定しても意味ないので無指定
	button "", *dummy

;	貼り付け。ボタンのオブジェクトID、「リソース名」の数値を指定。
	SetBitmap stat, 1

	stop

*dummy

 で、これをスクリプトエディタ上でコンパイル実行しても、ボタンに何の変化も現れません。これは実行ファイルにならないと効果を確認できない代物です。また、ビットマップの貼り付けに失敗しても別にエラーはでません。[実行ファイル自動作成]で実行ファイルを出力して、動作確認してください。

※注意: ビットマップを貼り付けたボタンは、Windows XP環境のビジュアルスタイル適用下でも必ずクラシックスタイルで表示される仕様になっています。

↑TOP↑

ボタンの文字色変更 (HSP 3.2〜)

 ボタンオブジェクト上の文字の色のみ変更します。ただ、純粋に文字色だけを変更できる機能(Win32 API関数)というのは存在しません。ボタンのデザインそのものを自前でぜんぶ描画する必要があります。通常の膨らんでる状態と、押されてへこんでる状態の2パターンのイメージを用意して交互に表示する形です。HSP 3.2以降で対応したobjimage命令はこの処理を支援する命令です。

 まずはWin32 API関数のDrawFrameControl関数を利用してクラシックスタイルのボタンデザインを描画するサンプルです。文字の描画処理はHSPの標準命令で行うようにしてるので、文字色以外にも文字のフォント、表示サイズ、表示位置なんかを自分で指定します。DrawFrameControl関数の第2パラメータにあるRECT構造体は、HSPにはない概念ですがboxf命令のパラメータを想像してください。

//	ボタンの文字色変更 (クラシックスタイルボタン) by Kpan
//	 HSP 3.2以降

#include "user32.as"

#define DFC_BUTTON $0004
#define DFCS_BUTTONPUSH	$0010 ; プッシュボタン
#define DFCS_PUSHED $0200 ; 押された状態

;	仮想画面 (実際にはbuffer命令を利用)
	screen 1

;	フォントと文字色指定
	moji = "押!"
	font "MS UI Gothic", 70, 1 | 16
	color $FF

;	通常のボタンデザインを描画
	RECT = 0, 0, 100, 100
	DrawFrameControl hdc, varptr(RECT), DFC_BUTTON, DFCS_BUTTONPUSH

	pos 6, 14
	mes moji

;	押された状態のボタンデザインを描画
	RECT = 0, 100, 100, 200
	DrawFrameControl hdc, varptr(RECT), DFC_BUTTON, DFCS_BUTTONPUSH | DFCS_PUSHED

	pos 7, 115 ; 1ドットずらしてる
	mes moji

;	メインウィンドウ
	screen 0
	title "クラシックスタイルなボタン by Kpan"

	objsize 100, 100
	objimage 1, 0, 0, 0, 100

	pos 100, 100
	button "", *jump

*jump

 Windows XPからコントロール(オブジェクト)のデザインインターフェイスとして新たにビジュアルスタイル(Windows XPは「Luna」、Vista/7は「Aero」)が採用され、上のサンプルにあるような無機質な灰色風デザインから、グラデーションがかったグラフィカルなデザインになってます。Windows XP以降には、ビジュアルスタイルの描画処理を担当する「UxTheme.dll」というライブラリがシステムに用意されてるので、これを呼んでビジュアルスタイルなボタンデザインを描画するサンプルです。

//	ボタンの文字色変更 (ビジュアルスタイルボタン) by Kpan
//	 HSP 3.2以降 & Windows XP以降

#uselib "UxTheme"
#func OpenThemeData "OpenThemeData" int, wstr
#func DrawThemeBackground "DrawThemeBackground" int, int, int, int, int, int
#func CloseThemeData "CloseThemeData" int

#define BP_PUSHBUTTON 1
#define PBS_NORMAL 1 ; 通常状態
#define PBS_HOT 2 ; マウスカーソルが上にある状態
#define PBS_PRESSED 3 ; 押された状態

;	Windows OS簡易チェック
	if varptr(OpenThemeData) = 0 {
		dialog "Windows XP以前の環境なのでダメ"
		stop
	}

;	仮想画面 (実際にはbuffer命令を利用)
	screen 1

;	ビジュアルスタイルのテーマハンドルを開く
	OpenThemeData hwnd, "BUTTON"
	if stat = 0 {
		dialog "ビジュアルスタイルが無効状態なのでダメ"
		stop
	}
	hTheme = stat

	moji = "ボタンだよーん"
	font "MS UI Gothic", 12, 1

;	通常のボタンデザインを描画
	RECT = 0, 0, 100, 100
	DrawThemeBackground hTheme, hdc, BP_PUSHBUTTON, PBS_NORMAL, varptr(RECT)

	color $FF
	pos 15, 45
	mes moji

;	押された状態のボタンデザインを描画
	RECT = 0, 100, 100, 200
	DrawThemeBackground hTheme, hdc, BP_PUSHBUTTON, PBS_PRESSED, varptr(RECT)

	color 0, $FF
	pos 15, 145
	mes moji

;	マウスカーソルがオブジェクト上にある状態のボタンデザインを描画
	RECT = 0, 200, 100, 300
	DrawThemeBackground hTheme, hdc, BP_PUSHBUTTON, PBS_HOT, varptr(RECT)

	color $FF, $FF
	pos 15, 245
	mes moji

;	ビジュアルスタイルのテーマハンドルを解放
	CloseThemeData hTheme

;	メインウィンドウ
	screen 0
	title "ビジュアルスタイルなボタン by Kpan"

	objsize 100, 100
	objimage 1, 0, 0, 0, 100, 0, 200

	pos 100, 100
	button "",*jump

*jump

 おまけで、外枠を描画するDrawEdge関数を利用したツールバー風ボタンのサンプルです。

//	ツールバー風ボタン by Kpan
//	 HSP 3.2以降

#include "user32.as"

#define BDR_SUNKENOUTER	$0002
#define BDR_RAISEDINNER	$0004
#define BF_RECT	$000F

;	仮想画面 (実際にはbuffer命令を利用)
	screen 1

	syscolor 15
	boxf 0, 0, 150, 150

//	枠
	RECT = 0, 50, 50, 100
	DrawEdge hdc, varptr(RECT), BDR_SUNKENOUTER, BF_RECT

	RECT = 0, 100, 50, 150
	DrawEdge hdc, varptr(RECT), BDR_RAISEDINNER, BF_RECT

	pos 50, 0
	gcopy 1, 0, 0, 50, 150

	pos 100, 0
	gcopy 1, 0, 0, 50, 150

	font "MS UI Gothic", 30, 1 | 2 | 16
	gmode , 40, 40

//	赤1
	color $FF
	circle 10, 10, 40, 40

	pos 13, 9
	color $FF, $FF, $FF
	mes "1"

	pos 6, 56
	gcopy 1, 5, 5

	pos 5, 105
	gcopy 1, 5, 5

//	青2
	color 0, 0, $FF
	circle 60, 10, 90, 40

	color $FF, $FF, $FF
	pos 64, 9
	mes "2"

	pos 56, 56
	gcopy 1, 55, 5

	pos 55, 105
	gcopy 1, 55, 5

//	黄3
	color $FF, $FF
	circle 110, 10, 140, 40

	pos 113, 9
	color $FF, $FF, $FF
	mes "3"

	pos 106, 56
	gcopy 1, 105, 5

	pos 105, 105
	gcopy 1, 105, 5

;	メインウィンドウ
	screen 0
	title "ツールバー風ボタン by Kpan"

	syscolor 15
	boxf

	objsize 50, 50
	objimage 1, 0, 0, 0, 50, 0, 100

	pos 50, 50
	button "", *jump

	objimage 1, 50, 0, 50, 50, 50, 100
	pos 100, 50
	button "", *jump

	pos 150, 50
	objimage 1, 100, 0, 100, 50, 100, 100
	button "", *jump

*jump

↑TOP↑

ラジオボタンの設置

 ラジオボタン(別名、オプションボタン/ラジオボックス)の設置です。ラジオボタンというのは、複数用意されている丸い形状の項目から1つだけ選択できるものです。HSPの標準命令には存在しないオブジェクトですが、内部的にはボタンコントロールの見た目を変えたにすぎません。

 ここでは、HSPでのラジオボタン作成法としてよく紹介されていたbutton命令を使わず、chkbox命令のウィンドウスタイルを変更する新手法を紹介します。

;	状態保持変数に1を入れたチェックボックス(ラジオボタン)に
;	黒丸チェックが入ります。ここでは2番目。
	s2 = 1

	chkbox "あ", s1
	sendmsg objinfo(stat, 2), $F4, $9

	chkbox "い", s2
	sendmsg objinfo(stat, 2), $F4, $9

	chkbox "う", s3
	sendmsg objinfo(stat, 2), $F4, $9

 さて、上のようにサクっと表示できたスクリプトですが、これはウィンドウ上にラジオボタンのグループが唯一1つしか存在しない時だけ有効で、このまま同じ処理を繰り返しても、ただ単に選択肢がどんどん増えていくだけです。

 もし、ラジオボタンのグループが複数ある場合は、1つの方法として「グループ化」という処理を利用します。グループの1番最初のチェックボックスは、ラジオボタン化($50000000+$9)するついでに、グループ化宣言($20000)を行う必要があるので、SetWindowLong関数を呼びます。それ以降は、普通にsendmsg命令でラジオボタン化($9)します。

 Windowsはグループ化を宣言したオブジェクトから次にグループ化を宣言するオブジェクトの直前までを1つのグループと判断してくれます。

//	ラジオボタン表示サンプルスクリプト (by Kpan)

#include "user32.as"

;	1番目のグループ
	x1 = 1

	chkbox "あ", x1
	SetWindowLong objinfo(stat, 2), -16, $50000009 | $20000

	chkbox "い", x2
	sendmsg objinfo(stat, 2), $F4, $9

	chkbox "う", x3
	sendmsg objinfo(stat, 2), $F4, $9

;	2番目のグループ
;	これにより、上とは別動作になるのであーる
	pos , 80
	y3 = 1

	chkbox "I", y1
	SetWindowLong objinfo(stat, 2), -16, $50000009 | $20000

	chkbox "II", y2
	sendmsg objinfo(stat, 2), $F4, $9

	chkbox "III", y3
	sendmsg objinfo(stat, 2), $F4, $9

;	3番目のグループ
;	トグルボタン型($1000)ラジオボタン(チェックあり=へこみボタン)
	pos , 160
	z2 = 1

	chkbox "A", z1
	SetWindowLong objinfo(stat, 2), -16, $50000009 | $1000 | $20000

	chkbox "B", z2
	SetWindowLong objinfo(stat, 2), -16, $50000009 | $1000

	chkbox "C", z3
	SetWindowLong objinfo(stat, 2), -16, $50000009 | $1000

	pos , 250
	button "チェック!", *check

	stop

;	チェックのあるラジオボタンを取得 (もっとスマートな確認手段は・・・)
;	1つ1つのオブジェクトのチェックの有無を確認。
;	statに1が返ると「チェックあり」ということで、そのオブジェクトIDを表示。
*check
;	グループ1用
	repeat 3, 0
;		BM_SETCHECK
		sendmsg objinfo(cnt, 2), $F0
		if stat : mes cnt
	loop

;	グループ2用
	repeat 3, 3
		sendmsg objinfo(cnt, 2), $F0
		if stat : mes cnt
	loop

;	グループ3用 (トグルボタン型)
	repeat 3, 6
		sendmsg objinfo(cnt, 2), $F0
		if stat : mes cnt
	loop

 このサンプルを元にしたHSP3向けラジオボタンの設置モジュールを、このページの一番下にて公開してます。

↑TOP↑

グループボックスの設置???

 グループボックス(四角い枠)の設置です。HSPの標準命令にはありませんが、グループボックスというのはボタンの見た目を変えただけです。以下のサンプルは、あくまでグループボックス自体が表示されるだけです。HSPにはグループボックスのサンプルコード(sample\basic\groupbox.hsp)が一応用意されていますが、オブジェクト内の表示が化けるバグがあります。

※注意!
 下のサンプルは、OSやら環境やらで表示の挙動が異なり、オブジェクトが置くとおかしくなるためダメダメ。HSP2時代からグループボックスの設置はどーもこーもいかん・・・? (*_*;

//	グループボックス・・・まったく使えんよ。。。失敗例

#uselib "user32"
#cfunc GetWindowLong "GetWindowLongA" int, int
#func SetWindowLong "SetWindowLongA" int, int, int

;	ポイント!? 表示化けの原因であるウィンドウの 「WS_CLIPCHILDREN」
;	スタイル を取り除く処理を Windows API 使って行います。
	SetWindowLong hwnd, -16, GetWindowLong (hwnd, -16) ^ $2000000

;	普通にグループボックスの位置と大きさ
	pos 10, 10
	objsize 200, 100

;	ボタンではなくチェックボックスを使う。(xはダミー変数)
	chkbox "グループボックスでっせ!", x
;	グループボックスに変更。objinfo関数 の第1パラにオブジェクトID。
	sendmsg objinfo(stat, 2), $F4, $7

;	[おまけ] グループボックスの表示文字列の位置を変更したものを作成
;	したい場合は、sendmsg命令 は使えません。$200=右端、$300=中央。
	chkbox "ここの位置ね", x
	SetWindowLong objinfo(stat, 2), -16, $50000007 | $200

 というわけで、オブジェクトではないですが、グループボックス「風」の枠を描画するモジュールをこのページ最下部からダウンロードできます。(素直にline命令で、線を1本1本描画してもいいところを、わざわざWin32 API関数で・・・ ^ー^;

↑TOP↑

☆ 関連HSP用モジュール

 このページで紹介しているいくつかのサンプルスクリプトに基づいたモジュールです。ボタンとチェックボックスのウィンドウスタイル変更、トグルボタン作成、ラジオボタン作成、グループボックス「風」の枠表示、の4ファイルを含んでいます。(HSP 3.x用)

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

↑TOP↑

<< オブジェクト 9 | HSP3 オブジェクト | オブジェクト 2 >>

Copyright © 2005-2012 . All rights reserved.