Last Update : 2007/10/xx
HSPの全般的なプログラミング情報のトピックスをイーロイーロ。(OwO)/
HSPでメッセージボックスオブジェクトを設置するmesbox命令。内部的には、エディトコントロールと呼ばれるコントロールですが、テキストエディタ(テキスト編集ソフト)として利用するには、少々貧弱すぎます。
HSPから利用できる外部エディットコントロールライブラリ(DLL)を拾ってみーる・・・
| コントロール | コメント |
| Rich Edit | Windows標準搭載のリッチエディットコントロール。 (→ 参照、MSDN Rich Edit、ちょくとさんのページ) |
| Footy | HSP3のスクリプトエディタでも採用されているコントロール。開発終了。 |
| Footy2 | 国産エディットコントロール。フリーウェア。HSP3からも利用可。 |
| Scintilla | 海外製エディットコンポーネント。かなりの高機能でフリーウェア。 英語ドキュメントを読む必要あり。 |
ZIGさんが製作されたHSP拡張プラグイン「ZGP」系。2003年始めあたりに活動休止となりファイルの入手が困難となっています。プラグインそのもの(*.hpi)の入手は、他の利用しているプログラムから拝借できなくはないですが、ヘッダー(*.as)などを含む純粋な配布アーカイブとなると・・・。(X_X)
ひとまず、いくつか転載(再配布)サイトをテキトーに拾ってみる。また、世界中のウェブページをアーカイブしているWebBack Machineに運良く保存されていたZIGさんのサイト内のHTMLファイルも一部閲覧できます(配布アーカイブは全滅?)。
HSP3で「オーナードローボタン」(オーナー描画ボタン)にチャレンジしてみーる。(^w^)/
HSPでおなじみのbutton命令。これは、フォーカスを得たり(点線枠)、押して凹んだり、というような状態表示をWindowsが内部で行ってくれています。「オーナードロー」というのは、プログラマー(「オーナー」)が描画(「ドロー」)する処理をすべて用意することで、独自の外観を持ったオブジェクトを表示させることができます。(→ オーナードロー 備忘録)
HSP2では、マウスを監視してボタン風に動くものを自前で作る以外で、これを実現するのは拡張プラグインなどを利用しないと困難でしたが、HSP3では標準命令とWin32 API関数を使って、それなりに実現できるようになっています。
ものすごいテキトーな処理の流れを書くと、(1)ボタンオブジェクトを設置し、ボタンのウィンドウスタイルに「BS_OWNERDRAW」を指定する。(2)ウィンドウメッセージ「WM_DRAWITEM」が通知されるようになるので、「DRAWITEMSTRUCT構造体」を元に、Win32 API関数を使ってオブジェクト内を描画する、という感じ。
以下サンプルスクリプトは、グラデーション描画の処理にGradientFill関数を利用しているので、Windows 98以降の環境が必要になります。
// [HSP3] オーナードローボタン サンプル
// by Let's HSP!
#include "user32.as"
#include "gdi32.as"
#uselib "msimg32"
#func GradientFill "GradientFill" int, int, int, int, int, int
#define BS_OWNERDRAW $0B
#define ctype MAKELONG(%1,%2) (%1 & $FFFF | %2 << 16)
; ウィンドウメッセージ
oncmd gosub *drawitem, $2B
sdim pszText
pos 50, 50
objsize 100, 70
button "ぼたーん", *jump
hButton = objinfo(stat, 2)
; ボタンのスタイル変更 (BM_SETSTYLE)
sendmsg hButton, $F4, BS_OWNERDRAW
stop
; WM_DRAWITEMメッセージ
*drawitem
; DRAWITEMSTRUCT構造体
dupptr DIS, lparam, 48
if DIS.5 = hButton {
; ボタン内の塗りつぶし色に白ブラシ
GetStockObject 0
SelectObject DIS.6, stat
; ボタン外枠に角の丸い長方形
RoundRect DIS.6, 0, 0, DIS.9, DIS.10, 6, 6
; アイテムの状態 ODS_SELECTED
if DIS.4 & $1 {
RedGreen = MAKELONG($CC00, $CC00), MAKELONG($F300, $F300)
BlueAlpha = MAKELONG($CC00, 0), MAKELONG($F300, 0)
} else {
RedGreen.0 = MAKELONG($F300, $F300), MAKELONG($DD00, $DD00)
BlueAlpha.0 = MAKELONG($F300, 0), MAKELONG($DD00, 0)
}
TRIVERTEX.0 = 2, 2, RedGreen.0, BlueAlpha.0
TRIVERTEX.4 = DIS.9 - 2, DIS.10 - 2, RedGreen.1, BlueAlpha.1
GRADIENT_RECT = 0, 1
GradientFill DIS.6, varptr(TRIVERTEX), 2, varptr(GRADIENT_RECT), 1, $1
RECT = 0, 0, DIS.9, DIS.10
; アイテムの状態 ODS_FOCUS
if DIS.4 & $10 {
InflateRect varptr(RECT), -2, -2
DrawFocusRect DIS.6, varptr(RECT)
}
; テキストカラー
SetTextColor DIS.6, $555555
SetBkMode DIS.6, 1
; テキスト取得 (WM_GETTEXT)
sendmsg DIS.5, $D, 64, varptr(pszText)
; テキスト描画
DrawText DIS.6, pszText, -1, varptr(RECT), $20 | $4 | $1
return 1
}
return
*jump
<< HSP Tips 9 || HSP Tips 11 >>
Copyright © 2005-2012 Kpan. All rights reserved.