HSP3 あれこれ <その他>

Last Update : 2008/04/xx

XREA.COMのs206サーバー内のサイトは、Yahoo!検索からペナルティを受け、検索結果で常に下位にランク付けされてしまうので、Yahoo!経由向けに用意したHSPミニ講座内のページです。このページは「http://lhsp.s206.xrea.com/hsp_other.html」の昔のものです。

ActiveXコントロールの利用

HSP3からActiveXコントロールを標準で利用できるようになりました。axobj命令の説明にあるように、「ATL.dll」(または 「ATL71.dll」)がシステムに導入されている必要があります。Windows 98環境では含まれてない可能性があり、その場合はIE6以降が必要なようです。

Macromedia(現Adobe)のFlash「swfファイル」の単純再生。

	onexit *exit

	sdim filepath, 128

	dialog "swf", 16, "Flash ファイル"
	if stat = 0 : end
	filepath = refstr

	axobj flash, "ShockwaveFlash.ShockwaveFlash", 400, 400

	flash->"loadMovie" 0, filepath
	flash->"play"

	stop

*exit
	delcom flash
	end

アニメーションGIFファイルの単純再生。IEコンポーネント上での動作となってます。picload命令ではアニメーションとして機能しません。(→ 参照、mci命令でアニメーションGIF再生表示)

	onexit *exit

	pos 50, 50

;	Cドライブ直下にアニメーションGIFファイルがあるとして
	axobj gif, "C:\\hogehoge.gif", 200, 200
	stop

*exit
	delcom gif
	end

Microsoft Windows Media PlayerのActiveXコントロール。

;	Windows Media Player 6.4版(by Kpan)
;	かなりテキトー、WMP10以降は利用不可? 詳細はMSDNページへ

	onexit *exit

	pos 50, 50
	axobj wmp, "{22D6F312-B0F6-11D0-94AB-0080C74C7E95}", 300, 300

;	他にもたーくさんあり。以下は部品表示オン/オフ。
	wmp("ShowControls") = 1
	wmp("ShowDisplay") = 1
	wmp("ShowStatusBar") = 1
	wmp("ShowAudioControls") = 1

;	リピート数 (0は無限ループ)
	wmp("PlayCount") = 0

;	再生する音楽や動画のファイルパスやURLアドレス
	wmp("FileName") = "sample\\demo\\GX3_.MID"

	stop

*exit
	delcom wmp
	end
;	Windows Media Player 7以降(by Kpan)
;	最新WMPに相当、詳細はMSDNページへ

	onexit *exit

	pos 50, 50
	axobj wmp, "{6BF52A52-394A-11d3-B153-00C04F79FAA6}", 300, 300

;	WMPバージョン(「*.0.0.****」形式)
	mes wmp("versionInfo")

;	プレーヤー部品表示 ("none"/"mini"/"full"の3種、WMP9以降で非表示の"invisible")
	wmp("uiMode") = "full"

;	右クリックメニュー表示(0=オフ、1=オン・デフォ)
	wmp("enableContextMenu") = 0

;	Settingsオブジェクト取得
	wmpset = wmp("settings")

;	自動再生(0=オフ、1=オン・デフォ)
	wmpset("autoStart") = 0

;	ボリューム設定(0〜100)
	wmpset("volume") = 100

;	消音ミュート(0=オフ・デフォ、1=オン)
	wmpset("mute") = 0

;	再生回数 (1〜)
//	wmpset("playCount") = 1

;	無限ループ再生(0=オフ・デフォ、1=オン)
	wmpset->"setMode" "loop", 0

;	再生する音楽や動画のファイルパス、URLアドレスもOK
	wmp("URL") = "sample\\demo\\se_tyuiin.wav"

;	Controlsオブジェクト取得
	wmpcnt = wmp("controls")

	button "PLAY", *wmpplay

	stop

*wmpplay
	wmpcnt->"play"

;	その他・・・
//	wmpcnt->"pause"
//	wmpcnt->"stop"
//	wmpcnt->"next"
//	wmpcnt->"previous"

	stop

*exit
	wmp->"close"

	delcom wmpcnt
	delcom wmpset
	delcom wmp
	end

りんごのQuickTimeコントロール。

//	QuickTime テスト (by Kpan)

	onexit *exit

	axobj qt, "QTOControl.QTControl.1", 300, 300
	if stat = -1 : dialog "error" : end

	button "", *play
	stop

*play
	dialog "", 16
	if stat = 0 : stop

	wait 1
	qt("URL") = refstr

	stop

*exit
	delcom qt

	end

^

色選択ダイアログ

HSPのdialog命令(モード32、33)で利用できる色選択ダイアログ。ダイアログを開いた時点での選択色は、灰色固定です。また、ダイアログの右側にあるカラーマトリックス(色作成機能)で作成できるカスタムカラー一覧は、黒一色になっています。

HSPの色選択ダイアログは、内部でChooseColor関数を呼び出しているので、これを直で利用してみます。以下はモジュール形式でこしらえてあります。

/*-----------------------------------------------------------------------
	拡張 色選択ダイアログ モジュール
	by Kpan (Let's HSP!)

	dialog_color p1, p2, p3

	p1 = ダイアログタイプ
		$0 : カラーマトリックス非表示+「色の作成」ボタン有効
		$2 : カラーマトリックス表示
		$4 : カラーマトリックス非表示+「色の作成」ボタン無効
	p2 = 初期選択色 (0xRRGGBB形式、無指定の場合は黒)
	p3 = カスタムカラーの配列リスト (16個分、varptr関数で渡す)

	statに0=キャンセル、1=成功。ginfo(16)〜ginfo(18)、または
	ginfo_r/ginfo_g/ginfo_b に選択したRGB値が返ります。
-----------------------------------------------------------------------*/

#module

#uselib "comdlg32"
#cfunc ChooseColor "ChooseColorA" int

#deffunc dialog_color int p1, int p2, int p3
	dim sCHOOSECOLOR, 9
	if p3 : lpCustColor = p3 : else : lpCustColor = varptr (hoge)
	sCHOOSECOLOR = 36, hwnd, 0, p2, lpCustColor, $1 | p1

	if ChooseColor (varptr (sCHOOSECOLOR)) {
		mref BMSCR, 67
		BMSCR.40 = sCHOOSECOLOR.3
	}
	return stat

#global


//	<以下、サンプル>
//	エディタの[HSP]→[HSP拡張マクロを使用する]を要有効

;	RGBカラーコードを 0xRRGGBB形式 に変換するマクロ
#define ctype RGB(%1,%2,%3) (%1 | %2 << 8 | %3 << 16)


	button "赤デフォ", *samp1
	button "カラーリスト", *samp2
	stop

*samp1
	dialog_color 2, RGB($FF,0,0)

	mes ""+stat+" ["+ginfo (16)+", "+ginfo (17)+", "+ginfo (18)+"]
	stop

*samp2
	color_list = RGB($90,$EE,$90), RGB($AD,$D8,$55), RGB($BA,$55,$D3)
	dialog_color 4, , varptr (color_list)

	mes ""+stat+" ["+ginfo (16)+", "+ginfo (17)+", "+ginfo (18)+"]
	stop

^

画面の解像度/色数変化のチェック
;	WM_DISPLAYCHANGE (ディスプレイの解像度/色数が変化した時)
	oncmd *jump, $7E

	stop

*jump
	horizontal = lparam & $FFFF
	vertical = lparam >> 16 & $FFFF

	mes "解像度 ("+horizontal+" x "+vertical+" ピクセル)"
	mes "色数 ("+wparam+" ビット)"

	stop

^

システムアイコンの表示

Windowsのダイアログ表示によくあるシステム定義のアイコンを描画します。HSPでは、dialog命令で表示できる標準・警告のメッセージボックスで見ることができるものです。LoadIcon関数でアイコンハンドルを取得、DrawIconEx関数で描画します。

;	システムアイコンの描画 (by Kpan)

#uselib "user32"
#cfunc LoadIcon "LoadIconA" int, int
#func DrawIconEx "DrawIconEx" int,int,int,int,int,int,int,int,int

;	LoadIcon関数
;	32512(アプリアイコン)、32513(停止アイコン)、32514(?アイコン)、
;	32515(!アイコン)、32516(iアイコン)
	hIcon = LoadIcon(, 32513)

;	DrawIconEx関数
;	第2・3パラ(XY表示座標位置)、第5・6パラ(表示サイズ)
	DrawIconEx hdc, 10, 10, hIcon, 16, 16, , , 3

	hIcon = LoadIcon(, 32516)
	DrawIconEx hdc, 10, 50, hIcon, 32, 32, , , 3

;	実際に描画の反映
	redraw

^

クリップボードの監視

クリップボードにコピーされたテキストをリアルタイムで表示するサンプルスクリプト。クリップボードに変動があると、WM_DRAWCLIPBOARDメッセージがやってきます。ちなみに、テキスト取得はHSP拡張プラグイン「hspext.dll」に放り投げていますが、「クリップボード HSP」なんかで検索すれば、拡張プラグインを使わずWin32 API関数を使ったモジュールがヒットします。

;	クリップボードの監視 by Kpan

#include "user32.as"
#include "hspext.as"

	onexit gosub *exit
	oncmd gosub *drawclipboard, $308

	sdim buf, 256

;	自ウィンドウをクリップボード監視対象にする
	SetClipboardViewer hwnd
	hWndNewNext = stat

	stop

;	WM_DRAWCLIPBOARD
*drawclipboard
	clipget buf, 256
	mes buf

	return

*exit
;	自ウィンドウを監視対象から削除
	ChangeClipboardChain hwnd, hWndNewNext

	end

^

「スタート」ボタンの表示名変更

できるかな〜?、と思って試しにコーディングしてみたら実現できた実用性不明な代物です。動作保障なし。Windowsのタスクバーにある「スタート」ボタンの表示文字列を {表面上} 変更します。プログラムを終了しても元に戻らないので、一応自前で戻してください。タスクバーが再描画されたり、PCを再起動するなりすれば、元に戻りますが。

なお、ボタン自体の横幅サイズが変わらないので、実際に表示できる文字列は最大8バイト(全角4文字)ぐらいです。短っ。。。

;	Windowsのスタートボタン変更サンプル (by Kpan)
;	Windows Vistaでは利用不可

#uselib "user32"
#cfunc FindWindowEx "FindWindowExA" int, nullptr, str, nullptr

;	ボタンのハンドルを取得し、
	hStart = FindWindowEx (FindWindowEx( , "shell_traywnd"), "button")

;	文字列変更。(WM_SETTEXT)
	sendmsg hStart, $C, , "HSP!"

;	チェックボックス化・・・。(^^;
//	sendmsg hStart, $F4 , $3

ちなみに、表面上ではなく実際に文字列を変更する場合は、「Resource Hacker」などを利用してリソースを直接いじる必要があるみたいです。

^

Copyright © Kpan. All rights reserved.