Last Update : 2006/06/xx
スタティックテキスト(Win32プログラミングでは「スタティックコントロール」)は、単純に文字列を表示するオブジェクトです。文字の表示(正確には「描画」)を行うmes命令・print命令と違って、後で書き換える時にあらかじめ表示されている文字列を消去する処理がいりません。
HSP2(HSP 2.x)では、mesbox命令のスタイル2指定で利用できましたが、HSP3(HSP 3.x)ではこのスタイルだけ廃止になっています。ただ、「common\hsp3util.as」モジュールファイルに、代替としてスタティックテキストを表示設置する命令と、内容を変更する命令が用意されています(objprm命令は利用できない)。内部的には、winboj命令を利用してスタティックコントロールを表示設置する形になってます。
winboj命令で作成したスタティックテキストは、HSPのfont命令やsysfont命令の効果を適用できません。というわけで、それと同等の効果を適用してみるサンプルスクリプトです。このフォントの指定に関しては、ちょくとさんのページに詳しく書かれてあるのでチェック!
まずは、sysfont命令を利用している場合。この命令は、内部的にはWin32 API関数のGetStockObject関数に相当します。フォントハンドルを取得して、WM_SETFONTを送信します。フォントの種類のパラメータ値はsysfont命令と同じです。
// winobj命令のコントロールにシステムフォントを適用 (by Kpan) #include "gdi32.as" ; スタティックテキストの作成 ; 第2パラのウィンドウスタイルは、「WS_CHILD」+「WS_VISIBLE」($50000000) winobj "static", "こんにちはHSP!", , $50000000 hStatic = objinfo(stat, 2) ; デフォルトGUIフォントのフォントハンドルを取得 GetStockObject 17 ; フォントを反映 (WM_SETFONT) sendmsg hStatic, $30, stat
次に、font命令の場合。HSPのBMSCR構造体からfont命令で指定したフォントハンドルを取得し、WM_SETFONTを送信します。ちょくとさんのページでも指摘されているように、これ以降にfont命令を呼び出してしまうとデフォルトフォントがリセットされてしまいます。
// winobj命令のコントロールにfont命令のフォントを反映1 (by Kpan) font "MS ゴシック", 30, 2 ; HSPのBMSCR構造体からフォントハンドルを取得 mref BMSCR, 67 hFont = BMSCR.38 winobj "static", "かきくけこHSP", , $50000000, 200, 30 hStatic = objinfo(stat, 2) ; フォント反映 (WM_SETFONT) sendmsg hStatic, $30, hFont ; 表示文字列の変更 (WM_SETTEXT) // sendmsg hStatic ,$C , , "へんこー!"
もし、フォントのリセットを避けたい場合は、ちょくとさんページにも書かれてあるように、buffer命令で仮想画面を用意して、そこのフォント指定からフォントハンドルを取得する手段があります。
// winobj命令のコントロールにfont命令のフォントを反映2 (by Kpan) ; バッファ画面を用意 buffer 1 font "MS UI Gothic", 30, 16 | 1 mref BMSCR, 67 hFont = BMSCR.38 ; 描画先をメインウィンドウに戻す gsel winobj "static", "フォフォフォントー", , $50000000, 200, 30 hStatic = objinfo(stat, 2) sendmsg hStatic, $30, hFont font "MS UI Gothic", 50
[おまけネタ] スタティックコントロールのウィンドウスタイルを変更し、外観を変えるサンプル。ウィンドウスタイル一覧はちょくとさんのページ参照。winobj命令の第2パラに追加してやります。
syscolor 15 : boxf objsize 400 winobj "static", "境界線枠 (WS_BORDER)", , $50000000 | $800000 winobj "static", "無効 (WS_DISABLED)", , $50000000 | $8000000 winobj "static", "膨らみ (WS_DLGFRAME)", , $50000000 | $400000 winobj "static", "真ん中テキスト (SS_CENTER)", , $50000000 | $1 winobj "static", "右寄りテキスト (SS_RIGHT)", , $50000000 | $2 winobj "static", "浅い凹み (SS_SUNKEN)", , $50000000 | $1000 ; これは拡張ウィンドウスタイル(第1パラ)の変更 winobj "static", "深い凹み {WS_EX_WINDOWEDGE}", $200, $50000000
上のスタティックテキスト表示の発展です。スタティックテキストの上にカーソルを持っていくとハンドカーソルに変わり、クリックするとブラウザが立ち上がる、という感じの簡易的なハイパーリンク処理を持つコントロールの設置です。
流れとして、スタティックテキストを設置(上参照)、文字列の表示色を変更、フォントを変更(上参照)、ハンドカーソルに変更(マウスカーソルの変更参照)、マウスクリックした時の処理、という感じです。スタティックテキストの文字色を変更するのはイロイロと大変です。
// ハイパーリンクテキストサンプル1 (by Kpan) #include "gdi32.as" #include "user32.as" ; RGBマクロ #define ctype RGB(%1,%2,%3) (%1 | %2 << 8 | %3 << 16) ; マウスクリックした際のウィンドウメッセージ (WM_COMMAND) oncmd gosub *command, $111 ; スタティックテキストが描画されるときに送られてくるウィンドウ ; メッセージ (WM_CTLCOLORSTATIC) oncmd gosub *ctlcolorstatic, $138 ; スタティックテキストを設置 ; マウスクリックで反応するようウィンドウスタイルにSS_NOTIFY($100) pos 50, 50 winobj "static", "ホームページ", , $50000001 | $100, 100, 13 ; オブジェクトのハンドル取得 hStatic = objinfo(stat, 2) ; スタティックテキストのフォント変更 ; アンダーラインを引いた文字列に font "MS Pゴシック", 12, 4 mref BMSCR, 67 sendmsg hStatic, $30, BMSCR.38 ; スタティックテキスト上のカーソルをハンドカーソルに変更 LoadCursor 0, 32649 SetClassLong hStatic, -12, stat ; スタティックテキスト自体の背景色用ブラシのハンドルを取得 GetSysColorBrush 15 hBrush = stat stop *ctlcolorstatic ; lparamにオブジェクトのハンドルが返る if hStatic = lparam { ; テキスト色 (青) SetTextColor wparam, RGB($00, $00, $FF) ; テキスト背景色 (透過) SetBkMode wparam, 1 ; スタティックテキスト自体の背景色を反映 return hBrush } return *command ; lparamにオブジェクトのハンドルが返る if hStatic = lparam { ; クリック時の処理。メルアドなら「mailto: 〜」。 exec "http://lhsp.s206.xrea.com/", 16 return } return
次に、カーソルがスタティックコントロール上に来るとテキスト色も変わるサンプルです。 カーソルの動きをリアルタイムで監視(WM_SETCURSORメッセージ)し、スタティックコントロール内にカーソルが入ったことが確認(PtInRect関数)されたたら、色が変わるようスタティックコントロールを再描画(InvalidateRect関数)、という処理になってます。ハンドカーソルの変更処理は省略しています。
// ハイパーリンクテキストサンプル2 (by Kpan) #include "gdi32.as" #include "user32.as" #define ctype RGB(%1,%2,%3) (%1 | %2 << 8 | %3 << 16) oncmd gosub *ctlcolorstatic, $138 oncmd gosub *command, $111 ; WM_SETCURSOR oncmd gosub *wmsetcursor, $20 ; RECT構造体用 dim RECT, 4 pos 50, 50 winobj "static", "バージョン情報", , $50000001 | $100, 100, 13 hStatic = objinfo(stat, 2) ; 下線フォント font "MS Pゴシック", 12, 4 mref BMSCR, 67 sendmsg hStatic, $30, BMSCR.38 ; 下線なしで単なる色変化だけなら以下のように // GetStockObject 17 // sendmsg hStatic, $30, stat GetSysColorBrush 15 hBrush = stat stop *ctlcolorstatic if hStatic = lparam { if oncursor { crColor = RGB($FF, $00, $00) } else { crColor = RGB($00, $00, $FF) } SetTextColor wparam, crColor SetBkMode wparam, 1 return hBrush } return *command if hStatic = lparam { dialog "ハイパーリンクサンプル by Kpan", , "情報" } return *wmsetcursor if (lparam & $FFFF) != 1 : return ; オブジェクトの左上XY、右下XYの座標位置を取得 GetWindowRect hStatic, varptr(RECT) ; 取得したオブジェクトの座標位置とカーソルの座標位置を比較 PtInRect varptr(RECT) , ginfo(0), ginfo(1) if stat { if oncursor : return InvalidateRect hStatic, 0, 0 oncursor = 1 return } else { if oncursor = 0 : return InvalidateRect hStatic, 0, 0 oncursor = 0 return } return
上のスタティックテキスト表示、ハイパーリンクテキスト表示の発展になります。スタティックテキストを作成し、これをクリックすると色選択ダイアログが表示され、選択した色が表面色として反映される、といった感じのオブジェクトです。
上のハイパーリンクテキスト表示でも言えることですが、何もわざわざWindows APIを呼ばないで、マウスカーソルの動きを監視して、標準のboxf命令やらcolor命令やら駆使すれば実現できる代物ではありますが・・・。
// カラー表示オブジェクトサンプル by Kpan #include "gdi32.as" #include "user32.as" #define ctype RGB(%1,%2,%3) (%1 | %2 << 8 | %3 << 16) onexit *exit ; WM_COLORSTATIC ; スタティックコントロールの色を変更する処理 oncmd gosub *ctlcolorstatic, $138 ; WM_COMMAND ; スタティックコントロールをクリックした時の処理 oncmd gosub *command, $111 syscolor 15 : boxf ; スタティックコントロールを作成 ; ウィンドウスタイルを変更して見た目を変えています。 pos 50, 50 winobj "static", "", $1, $50000000 | $100, 35, 35 ; オブジェクトのハンドルを取得しておく hStatic.0 = objinfo(stat, 2) ; 初期の表示色を指定しておく場合はこんな感じ CreateSolidBrush RGB($FF, $FF, $00) hBrush.0 = stat ; 2つ目のスタティックコントロール pos 50, 100 winobj "static", "", $20000, $50000000 | $400000 | $100, 35, 35 hStatic.1 = objinfo(stat, 2) CreateSolidBrush RGB($FF, $00, $00) hBrush.1 = stat stop *ctlcolorstatic if hStatic.0 = lparam : return hBrush.0 if hStatic.1 = lparam : return hBrush.1 return *command if hStatic.0 = lparam | hStatic.1 = lparam { hControle = lparam ; 色選択ダイアログ dialog , 32 if stat = 1 { rgbclr = RGB(ginfo(16), ginfo(17), ginfo(18)) if hStatic.0 = hControle { ; 変更前のブラシの破棄 if hBrush.0 != 0 : DeleteObject hBrush.0 ; 選択した色のブラシを作成 CreateSolidBrush rgbclr hBrush.0 = stat } if hStatic.1 = hControle { if hBrush.1 != 0 : DeleteObject hBrush.1 CreateSolidBrush rgbclr hBrush.1 = stat } ; 色を反映させるためコントロールを再描画させる InvalidateRect hControle, 0, 0 return } return } return *exit ; 作成したブラシの破棄 DeleteObject hBrush.0 DeleteObject hBrush.1 end
自分自身の実行ファイルが持っているアイコンをオブジェクトとして表示してみます。
Windows APIのLoadImage関数で自分自身からアイコンを読み込み、sendmsg命令を使ってスタティックコントロールに貼り付ける、という流れです。スタティックコントロールには、文字列の表示以外にも画像(BMP/ICOファイル)を表示させる機能も持っています。
このサンプルを元に作成したアイコン表示オブジェクト設置モジュールをこのページの最下部から入手できます。ついでに、マウスでアイコンのクリックorダブルクリックすると反応するバージョンのモジュールも含めてあります。
// 自分自身のアイコン表示オブジェクト (by Kpan) #include "user32.as" pos 50, 50 ; スタティックコントロールを設置 ; ウィンドウスタイルにアイコンの表示を行うSS_ICON($3)を指定 winobj "static", "", , $50000000 | $3 hStatic = objinfo(stat, 2) ; 実行ファイルからアイコンのハンドルを取得 ; p1=インスタントハンドル ; p2=アイコン名 (HSP製実行ファイルは128) ; p3=画像タイプIMAGE_ICON(1) ; p4,p5=表示したいアイコンサイズ ; p5=LR_SHARED($8000) LoadImage hinstance, 128, 1, 32, 32, $8000 hIcon = stat ; スタティックコントロールにアイコンハンドルを適用 sendmsg hStatic, $170, hIcon
上のサンプルは、あくまでアイコンが表示されてたオブジェクトです。ついでのネタとして、DrawState関数を使ってウィンドウ上にアイコンを描画するサンプルソースです。gcopy命令もOK。(同関数を使った文字表示サンプルソースはこちら〜)
// 自分自身のアイコン描画 (by Kpan) #include "user32.as" syscolor 15 : boxf ; 自分自身のアイコンを読み込みハンドル取得 LoadImage hinstance, 128, 1, 32, 32, $8000 hIcon = stat ; パラメータがたいそう多いですが、p6/p7が表示するXY座標位置 ; p10はアイコン表示を意味するDST_ICON($3)を必ず指定 DrawState hdc, 0, 0, hIcon, 0, 50, 50, 0, 0, $3 ; DSS_DISABLED($20)を加えると無効状態風アイコン DrawState hdc, 0, 0, hIcon, 0, 100, 100, 0, 0, $3 | $20 ; 再描画で反映 redraw
HSP 2.x の時だと、color命令 + line命令 あたりを使って描画する感じだったでしょうか。winboj命令でサクっと表示できます。区切り線(セパレータライン)は実際のところスタティックコントロールの見た目を変えただけです。
syscolor 15 boxf ; 横線の場合。第3パラが長さ pos 50, 50 winobj "static", "", , $50000000 | $10, 200 ; 縦線の場合。第4パラが長さ pos 70, 100 winobj "static", "", , $50000000 | $11, , 100
上のサンプルを元に、縦方向と横方向の区切り線を表示するモジュールをこのページの最下部にて公開しています。わざわざモジュールにしなければならないほどの複雑なソーススクリプトではありませんが... (^^;
そして、上の「スタティックテキストの表示」とこの「区切り線の表示」を合体した自前コントロールを表示するモジュールも公開しています。区切り線(セパレータライン)上の任意の位置に、文字列表示のスタティックテキスト(スタティックコントロール)が表示されます。標準の mes命令 + line命令 で十分な代物でありますが...
ついでに、DrawEdge関数を利用したボーダー風囲い枠の描画サンプルソース。
#uselib "user32" #func DrawEdge "DrawEdge" int, int, int, int syscolor 15 : boxf ; DrawEdge関数 ; 第1パラはデバイスコンテキストのハンドル (hdcを指定) ; 第2パラは矩形サイズ (左上XY座標、右下XY座標を指定) ; 第3パラに境界線の形状スタイル ; 1列目 ; BDR_RAISEDOUTER (外側隆起) rect = 20, 20, 100, 100 DrawEdge hdc, varptr (rect), $1, $F ; BDR_SUNKENOUTER (外側陥没) rect = 120, 20, 200, 100 DrawEdge hdc, varptr (rect), $2, $F ; BDR_RAISEDINNER (内側隆起) rect = 220, 20, 300, 100 DrawEdge hdc, varptr (rect), $4, $F ; BDR_SUNKENINNER (内側陥没) rect = 320, 20, 400, 100 DrawEdge hdc, varptr (rect), $8, $F ; 2列目 (以下は境界線の形状スタイル組み合わせ) rect = 20, 120, 100, 200 DrawEdge hdc, varptr (rect), $1 | $4, $F rect = 120, 120, 200, 200 DrawEdge hdc, varptr (rect), $1 | $8, $F rect = 220, 120, 300, 200 DrawEdge hdc, varptr (rect), $2 | $4, $F rect = 320, 120, 400, 200 DrawEdge hdc, varptr (rect), $2 | $8, $F ; 実際に表示を反映させるには再描画が必要な場合あり ; (redraw命令やwidth命令あたりで redraw
このページで紹介しているサンプルスクリプトに基づいたモジュールです。自分自身のアイコン表示モジュール、区切り線描画モジュール、スタティックテキスト付き区切り線描画モジュールの3ファイルを含んでいます。(HSP 3.x用)
<< オブジェクト 2 | HSP3 オブジェクト | オブジェクト 4 >>
Copyright © 2005-2012 Kpan. All rights reserved.