ステータスバーを使う



WinAPIを使えば自分でステータスバーを作成する事も出来ます。ステータスバーのようなコントロールはコモンコントロールと呼ばれています。 comctl32.dllより呼び出します。ステータスバーはほとんどの場合メッセージを使用する事も無いと思うので、比較的簡単に作成する事が出来ます。

;ステータスバーを使う

#include "llmod.as"

#module

#deffunc setstb int,int
	mref mode,0
	mref idstat,1
	if idstat=0 : idstat=1000	;ステータスバーのID(複数使う場合は必ず指定)
	mref bmscr,67
	mref ret,64

	icc=8,0x0004	;0x0004はICC_BAR_CLASSESスタイル
	getptr picc,icc
	dllproc "InitCommonControlsEx",picc,1,D_COMCTL	;コモンコントロールの準備
	if dllret@=0 : ret=0 : return

	prm=0x40000000|0x10000000|0x0000003,0,bmscr.13,idstat
	;0x40000000はWS_CHILD、0x10000000はWS_VISIBLE、0x0000003はCCS_BOTTOMスタイル
	if mode=1 : prm.0=prm.0|0x0100	;モードが1ならばSBARS_SIZEGRIPスタイルを追加
	dllproc "CreateStatusWindowA",prm,4,D_COMCTL	;ステータスバーを作成
	if dllret@=0 : ret=0 : return

	hstat=dllret@
	ret=1
return

#deffunc setstbpart val,int
	mref long,48
	mref part,1
	getptr plong,long
	prm=hstat,0x0404,part,plong	;0x0404はSB_SETPARTSメッセージ
	dllproc "SendMessageA",prm,4,D_USER
return

#deffunc setstbtext str,int
	mref stxt,32
	txt=stxt
	mref partno,1
	getptr ptxt,txt
	prm=hstat,0x0401,partno,ptxt	;0x0401はSB_SETTEXTメッセージ
	dllproc "SendMessageA",prm,4,D_USER
return

#deffunc getstbheight val
	mref height,16
	getptr pclient,client
	prm=hstat,pclient
	dllproc "GetClientRect",prm,2,D_USER	;ステータスバーが使用しているクライアントエリアを取得
	height=client.3-client.1
return

#deffunc setstbsize
	prm=hstat,0x0005,winx,winy	;0x0005はWM_SIZEメッセージ
	dllproc "SendMessageA",prm,4,D_USER
return

#global

	setstb
	long=200,400,-1
	setstbpart long,3
	setstbtext "あいうえお",0
	setstbtext "かきくけこ",1
	setstbtext "さしすせそ",2
	getstbheight height
	mes "ステータスバーの高さ:"+height
	stop

なんだかActiveBasicをはじめてから作る命令が関数名みたいになってきてる…。
定義した命令は、

setstb サイズグリップの有無,ステータスバーのID
ウィンドウにステータスバーを設置します。
第一引数のサイズグリップの有無は0で無し、1で有りになります。
ステータスバーのIDは省略すると1000となるようになっていますが、複数のステータスバーを使う場合(たぶんないけど…)は別々のIDを指定してください。

setstbpart 各区画の右側座標が格納された数値型配列変数,区画の個数
第一引数は必ず配列にしてください。第二引数の個数分に区画分けされます。配列の内容を-1にするとステータスバーの右端までを指定するのと同じになります。

setstbtext ステータスバーに表示する文字列,区画No
区画Noで指定された区画に文字列を表示させます。

getstbheight 高さを格納する変数
ステータスバーの高さを取得します。

setstbsize
ステータスバーの大きさを再設定します。

サンプルを見れば大体わかると思いますが、手順はsetstb→setstbpart→setstbtextだけで出来ます。getstbheightは、ここでは無意味に使っていますが、 ステータスバーが作成されたからといってウィンドウのクライアント領域(実際に描画できる場所)が狭くなったわけではないので、その部分をなくすためにこの高さを使用する事も有るので一応つけました。
後使われていないものがsetstbsize、これはステータスバーの大きさを再設定します。ウィンドウの大きさが可変状態のとき、ステータスバーはウィンドウの大きさが変わっても位置や大きさもそのままなので、 再設定してやる必要が有るので作りました。
各関数は、

InitCommonControlsEx INITCOMMONCONTROLSEX構造体ポインタ
コモンコントロールを使う準備をします。ライブラリがロードされた事を保証するらしいです。
INITCOMMONCONTROLSEX構造体
.0 構造体サイズ(=8)
.1 コントロールのクラス

CreateStatusWindowA ステータスバーのスタイル,デフォルトで表示する文字列ポインタ,親ウィンドウハンドル,ステータスバーID
ステータスバーを作成します。

SendMessageA メッセージを送るウィンドウのハンドル,メッセージコード,付加情報(wparam),付加情報(lparam)
ウィンドウにメッセージを送ります。付加情報はメッセージコードにより異なります。

GetClientRect ウィンドウハンドル,RECT構造体ポインタ
ウィンドウのクライアントエリアのサイズを取得します。
RECT構造体
.0 左上のx座標
.1 左上のy座標
.2 右下のx座標
.3 右下のx座標

関数はこのぐらいですが、次にここで使用したスタイルとメッセージの説明をしますと、

WS_CHILD … ウィンドウを子ウィンドウとします
WS_VISIBLE … ウィンドウを可視状態にします
CCS_BOTTOM … ウィンドウを親ウィンドウの下端に配置します
SBARS_SIZEGRIP … ステータスバーの右下にサイズグリップをつけます

SB_SETPARTS … ステータスバーの区画分け情報を送ります
SB_SETTEXT … ステータスバーの区画に文字列を送ります
WM_SIZE … ウィンドウに大きさの情報を送ります

少しがんばればステータスバーにアイコンを表示させたりする事も出来るんですが、面倒なのでやりません。
一応ステータスバーもメッセージを発していますが多分使わないと思うのでここではメッセージ取得は行っていません。


戻る