HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0906
暇人hgimg3の直接描画を使った input,button,chkbox,listbox,combox を設置するモジュール13解決


暇人

リンク

2015/9/6(Sun) 23:50:08|NO.71423

hgimg3のフルスクリーンだと、ウィンドウオブジェクトが使えないので
直接描画で表示する命令を追加するモジュールです。
(ついでに色や透明度も簡単に設定出来るようにしてみた)

このモジュールは、ウィンドウオブジェクトを画面外に配置して
その情報を基に、画面内に直接描画を行います。(OSの仕様変更で使えなくなる可能性はある)
なので、ウィンドウオブジェクトを直接操作すると、ある程度反映されます。
hgButtonやhgChkboxのスタイル変更でラジオボタンにも出来ます。

このスレのアドレスをモジュールに書き込みたいので後でモジュールのURLをレスします。

////////主な命令/////// //<<<<<<<<<<<<<<<<<<< hgInput関係の命令 >>>>>>>>>>>>>>>// hgInput 入力のための変数, Xサイズ, Yサイズ, 最大文字数, フレームテクスチャID, 枠の幅, 枠画像のタイプ, 枠のコピーモード , アルファ値 //hgimg3用のinputを設置(描画はhgallwinobjdrawを実行)「枠画像のタイプ値 0=64*64のテクスチャを作る、1=指定サイズの枠を使いテクスチャを作る」 テクスチャid = hgMakeInputFrame(framecol, fs, frame_id, p_ft, p_sx, p_sy) //hginput枠の色と幅を指定してテクスチャを作ってID取得「framecol=外枠左と上,内枠左と上,内枠右と下,外枠右と下 の様に入れる 色指定は16進数で$RRGGBBの並び」 hgSetInputPos hginputID, 左上X座標, 左上Y, Xサイズ, Yサイズ5, 動作スイッチ //hginputを移動サイズ変更(動作スイッチが0なら設定値がそのまま使われ1なら増減地として使われる) hgSetInput hginputID, 設定項目, pa, pb, pc //hginput内表示設定 //------------hgSetInputで使用する設定項目---------------------// HGINPUT_INIT = -1 //(-1)初期化「pa,pb,pcは無視される」 HGINPUT_RGB_GMODE //(0)INPUT文字列の色とコピーモードアルファ値を指定「pa=色($RRGGBB),pb=コピーモード(gmodeのp1と同じ),pc=アルファ値(gmodeのp4と同じ)」 HGINPUT_BG_RGB_GMODE //(1)INPUT背景 同上 HGINPUT_CARET_RGB_GMODE//(2)INPUTキャレット 同上 HGINPUT_SEL_RGB_GMODE //(3)INPUT選択範囲文字列 同上 HGINPUT_SELBG_RGB_GMODE//(4)INPUT選択範囲背景 同上 HGINPUT_MODE //(5)INPUTの設定スイッチ「pa=hginput背景等の表示非表示切替(*A:別途説明),pb=hginput背景等の表示設定(*B:別途説明),pc=hginput内マウスカーソル関係の設定(*C:別途説明)」 HGINPUT_ENUMEND ////////////////////////////////////////////////////////////// hgSetIme 設定項目, pa, pb, pc //hginput使用時のIME入力窓内の色や変換候補リストの色と候補数サイズを設定 //------------hgSetImeで使用する設定項目---------------------// IMESETTING_INIT //(-1)初期化「pa,pb,pcは無視される」 IMECOLOR_INPUT //(0)IME入力中文字列の色とコピーモードアルファ値を指定「pa=色($RRGGBB),pb=コピーモード(gmodeのp1と同じ),pc=アルファ値(gmodeのp4と同じ)」 IMECOLOR_INPUTBG //(1)IME背景 同上 IMECOLOR_CARET //(2)IMEキャレット 同上 IMECOLOR_ATTR_INPUT //(3)IME入力中下線 同上 IMECOLOR_ATTR_TARGET_CONVERTED //(4)IME変換選択中下線 同上 IMECOLOR_ATTR_CONVERTED //(5)IME変換済下線 同上 IMECOLOR_ATTR_TARGET_NOTCONVERTED //(6)IME選択中矩形 同上 IMECOLOR_ATTR_INPUT_ERROR //(7)IME無効な文字 同上 IMECOLOR_CANDIDATE //(8)IME変換候補リスト文字列 同上 IMECOLOR_CANDIDATEBG //(9)IME変換候補リスト背景 同上 IMECOLOR_SELECT //(10)IME変換候補リスト選択中 同上 IMECANDIDATE_SIZE //(11)IME変換候補リストの表示数、文字サイズ、リスト表示最大Xサイズ「pa=表示数,pb=文字サイズ,pc=最大Xサイズ」 IMESTRING_LINE_BREAKS //(12)IME文字列を改行するかどうか 「pa=0なら改行 1なら改行しない」 IMECOLOR_CANDIDATE_END ////////////////////////////////////////////////////////////// hgSetImeStatus 設定項目, pa, pb, pc //hginput使用時のIME入力変換モード表示設定 //------------hgSetImeStatusで使用する設定項目---------------------// IMESTATUS_INIT = -1 //(-1)初期化「pa,pb,pcは無視される」 IMESTATUS_POS //(0)ステータス表示位置「pa=-1〜7(0=ウィンドウ左上基点、1=input左基点、2=TOPをinputと合わせる、4=input右基点、8=BOTTOMをinputと合わせる) 、ab=X座標調整、pc=縦座標調整」 IMESTATUS_SIZEADJUST //(1)通常input縦サイズと同じになるスータスの大きさを調整「pa=通常サイズから調整する数値」 IMESTATUS_MAXSIZE //(2)通常は最大表示サイズ64なのを変更「pa=最大表示サイズ」 IMESTATUS_VISIBLE //(3)ステータス表示非表示「pa=0〜3 (0=両方非表示、1=入力モード表示、2=変換モード表示、3=両方表示)」 IMESTATUS_WINSWAP //(4)両方表示する場合の表示順序入れ替え「pa=0〜1(0=入れ替えしない、1=入れ替えする)」 IMESTATUS_POSXADJUST //(5)二つ表示される場合に間を空ける「pa=空ける幅」 IMESTATUS_RGBGMODE //(6)ステータス文字色「pa=色($RRGGBB)、pb=標準命令のgmodeのp1と同じ(2〜6)、pc=gmodeのp4と同じ」 IMESTATUS_BGRGBGMODE //(7)ステータス背景色「pa=色($RRGGBB)、pb=標準命令のgmodeのp1と同じ、pc=gmodeのp4と同じ」 IMESTATUS_END ////////////////////////////////////////////////////////////// hgImeStatus 入力モード用インデックス, 変換モード用インデックス, パラメータを入力にするか出力にするか指定, IMEコンテキストハンドル //IMEの現在のモードを取得設定 hgOnkey_Gosub *label //コールバック用モジュールをインクルードしてない場合はonkeyが使われるので、メイン側でもonkeyを使いたい場合のマクロ hgClrInput //hginputを全て削除(個別に削除したいときは標準命令のclrobjにIDを指定してください) //<<<<<<<<<<<<<<<<<<< hgWinObj(hgbutton,hgchkbox,hglistbox,hgcombox)関係の命令 >>>>>>>>>>>>>>>// hgButton ボタンの名前, ラベル名, 動作設定, 文字色($AARRGGBB), 背景色, フェードインフレーム数 //hgimg3用のbuttonを設置(描画はhgallwinobjdrawを実行) hgChkbox 内容表示文字列, 状態を保持する変数, 動作設定, 文字色($AARRGGBB), 背景色, フェードインフレーム数 //hgimg3用のChkboxを設置(描画はhgallwinobjdrawを実行) hgListbox 状態を保持する数値型変数, 拡張Yサイズ, 内容を示す文字列, 動作設定, 文字色($AARRGGBB), 背景色, フレーム色, フェードインフレーム数 //hgimg3用のListboxを設置(描画はhgallwinobjdrawを実行) hgCombox 状態を保持する数値型変数, 拡張Yサイズ, 内容を示す文字列, 動作設定, 文字色($AARRGGBB), 背景色, フレーム色, フェードインフレーム数 //hgimg3用のComboxを設置(描画はhgallwinobjdrawを実行) hgObjImage テクスチャID, 通常時左上X座標, 通常時左上Y座標, 押し下げ時X, 押し下げ時Y, マウスオーバー時X, マウスオーバー時Y, ボタン名表示マージン, ボタン名を横移動させるドット数, ボタン名を縦移動させるドット数 //カスタムボタンを配置するための設定(hgbutton,hgchkboxに反映) hgWinObjArgb hgwinobjID, 設定項目, 透明度と色 //hgwinobjの透明度と色を$AARRGGBB形式で設定 透明度と色 = hgGetWinObjArgb( hgwinobjID, 取得項目) //hgwinobjの$AARRGGBB形式で色取得 hgSetWinObjOptTim hgwinobjID, 動作設定, フェードインフレーム数 //hgwinobjの動作設定とフェードインフレーム数設定 hgGetWinObjOptTim hgwinobjID, 動作設定, フェードインフレーム数 //hgwinobjの動作設定とフェードインフレーム数取得 hgWinObjValid hgwinobjID, 追加するスタイル, 削除するスタイル //hgwinobjを有効にし描画されるようにする hgWinObjInvalid hgwinobjID, 削除スイッチ //hgwinobjを無効にし描画処理から除外する(削除スイッチが0以外なら削除) hgSetWinObjPos hgwinobjID,左上X座標, 左上Y, Xサイズ, Yサイズ5, 動作スイッチ //hgSetInputPosと同じ IDにはhgbutton,hglistbox,hgcombox,hgchkboxのIDを指定 hgClrWinObj //hgwinobjを全て削除(個別に削除したいときは標準命令のclrobjにIDを指定してください) //<<<<<<<<<<<<<<<<<<< hgAllWinObj(hginput,hgbutton,hgchkbox,hglistbox,hgcombox)関係の命令 >>>>>>>>>>>>>>>// hgTexMakeMode 作成モード //メッセージテクスチャ(inputやime,button等の文字部分のテクスチャ)の作成モード設定 hgSetAllWinObjStyle hgallwinobjID, 追加するスタイル値, 削除するスタイル値 //hgallwinobjのスタイルを変更 hgGetAllWinObjPos hgallwinobjID, 左上X座標, Y座標, Xサイズ, Yサイズ //hgallwinobjdraw実行時の左上座標とサイズを取得 hgAllWinObjDraw //hginput&hgwinobj描画命令(直接描画なので通常hgdrawとhgsyncの間に配置) hgSetParent 子hgallwinobjID, 親hgallwinobjID //指定された子の親を変更します hgAllWinObj_reset //モジュール初期化「hgreset等のテクスチャがクリアされる命令を使用した時だけ実行してください」 //<<<<<<<<<<<<<<<<<<< その他の命令 >>>>>>>>>>>>>>>// InvertColor 元の色($RRGGBB)、反転赤、反転緑、反転青 //色を反転して取得(中間より64以上差が無ければ0か255にする) hgLineRect 左上X座標, 左上Y, Xサイズ, Yサイズ //ラインで四角を描く hgDotLineRect 左上X座標, 左上Y, Xサイズ, Yサイズ, ドット数, 点の描画位置をずらす数値 //ラインか点線で四角を描く---- hgGetMouse マウスX,マウスY //現在のマウス座標を取得(hginput等の上でマウスドラッグするとmousex等は動かないので) hgDotLineBox 左上X, 左上Y, 右下X,右下Y, ドット数, 点の描画位置をずらす数値 //四角形の左上隅、右下隅を指定してラインか点線で描画 hgLineBox 左上X, 左上Y, 右下X, 右下Y //四角形の左上隅、右下隅を指定してラインで描画 hgDotLine 開始X座標, 開始Y座標, 終了X座標, 終了Y座標, 点の長さ, 点の描画位置をずらす数値 //点線描画 //<<<<<<<<<<<<<<<<<<< hgAllWinObjDraw実行後に更新されるグローバル変数 >>>>>>>>>>>>>>>// HGALLWINOBJ_ACT //フォーカスが合っている種類が代入される「-1=合ってる物がない、0=HG系以外の物に合ってる、1=hginput、2=hgwinobj」 HGMOUSEX, HGMOUSEY //hgallwinobjdraw実行時のマウス座標(ウィンドウオブジェクト内でドラッグすると標準のmousex,yが使えない) HGMOUSE_POINT_ID //マウスカーソルの下にあるhginputかhgwinobjのIDが代入される「-2=ウィンドウ外、-1=ウィンドウ内だが何も無い、0以上=hginputかhgwinobjのID」 HGINPUT_MOUSE //hginput内で直接描画のマウスカーソルを使うためのフラグ「-2=ウィンドウ外、-1=hginput以外の標準オブジェクト、0=ウィンドウ内だがhginput外、1=hginput内」 HGMOUSE_POINT_COLOR //マウスカーソル下のhginputかhgbuttonの背景色「hginputなら$RRGGBB、hgwinobjなら$AARRGGBB」 HGMOUSE_LAST_POINT_DISABLED //最後にマウスカーソルの下にあったhginputかhgwinobjが有効だったかどうか「0=無効、1=有効」 HGMOUSE //標準マウスカーソルが表示中かどうか「0=表示中、-1=非表示中」(hgAllWinObjDraw内での表示切替を反映) HGMOUSE_MOVEX, HGMOUSE_MOVEY //マウスの移動量
・標準ウィンドウオブジェクトとの違い
hginputのキャレットがドット単位での色反転してない(背景色に対しての反転だけ)
hginputにフォーカスが合ってる時に[ESC]を押してもビープ音が鳴らない(これは意図的に鳴らないようにしてる)
hginputがパスワードスタイルの時に[Ctrl+C]してもビープ音が鳴らない(これも意図的に鳴らないようにしてる)
hginput上で右クリックしてもメニューは出ない

IME入力文字がinput枠を超えた時に改行するのは一段だけ
IME入力ウィンドウはマウス判定してないのでクリックできない
変換候補ウィンドウはマウス判定してないのでクリックできない
変換候補を数字キーで選べない(ナンバーも付けていない)

hgbutton等がマウスオーバーする(白を加算コピーしてるだけだが)
hglistboxやhgcomboxの選択中項目文字が色反転しない(手抜き・・・)
hgcomboxのリストにスクロールバーは付かない(手抜き・・・)
hgcomboxはリストをクリックした時に決定する(標準のは離された時)

hgObjImageがhgchkboxにも反映される(hgchkboxの場合はマウスオーバーは無し)


簡単な使い方

#include "hgimg3.as" #include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude hgini setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode) texload dir_exe+"\\sample\\hgimg3\\fontchr.bmp" ; フォントテクスチャの登録 text="テスト" font "MS 明朝",28,16+1 //必ずフォントの設定が必要 pos 50,200 hginput text,200,32 //直接描画用のinputを設置 font "MS ゴシック",20,16 objsize 150,24 pos 50,240 hgbutton gosub "listに追加",*title_put //直接描画用のhgbuttonを設置 objsize 100,24 hgchkbox "テスト",c //直接描画用のhgchkboxを設置 objsize 150,24 list="あいうえお\nかきくけこ\nさしすせそ\nたちつてと\n" pos 300,150 hglistbox l,,list //直接描画用のhglistboxを設置 lbid=stat font "MS ゴシック",16,0 cmlist="あいうえお\nかきくけこ\nさしすせそ\nたちつてと\n" hgcombox cm,,cmlist //直接描画用のhgcomboxを設置 cmid=stat clscolor $4444 hgact_mes="NotObj","WinObj","hgInput","hgWinObj" repeat stick stk if stk=128 {end} hgdraw hgAllWinObjDraw //hgAllWinObjを描画 imebuf=refstr //ime入力中文字列 actid=stat //フォーカスが合ってるhgAllWinObjID fprt "HGALLWINOBJ_ACT ["+HGALLWINOBJ_ACT+"] "+hgact_mes(HGALLWINOBJ_ACT+1),8,20 fprt "HGMOUSE_POINT_ID ["+HGMOUSE_POINT_ID+"] ",8,40 fprt "HGINPUT_MOUSE ["+HGINPUT_MOUSE+"] ",8,60 color RGBtoCOLOR(HGMOUSE_POINT_COLOR) gmode 0 hgrect 250,88,0.0,20,20 fprt "HGMOUSE_POINT_COLOR ["+strf("$%08X",HGMOUSE_POINT_COLOR)+"] ",8,80 fprt "HGMOUSE ["+HGMOUSE+"] ",8,100 hgsync 16 title ""+text+" c="+c+" l="+l+" cm="+cm+" imebuf="+imebuf+" actid="+actid loop *title_put list+text+"\n" objprm lbid,list objprm lbid,l cmlist+text+"\n" objprm cmid,cmlist objprm cmid,cm return
全て標準ウィンドウオブジェクト使用時と同じように使えます。

注意としては直接描画命令が奇数サイズの描画が出来ないので
フォントも含めてサイズ設定は全て偶数にした方が良い
(フォントは描画サイズが変わってしまう事があるが・・・)
途中まで奇数サイズに対応したが、馬鹿らしくなった・・・
(hgrectはまだ許せるけどhgrotateは文字の場合致命的)



この記事に返信する


暇人

リンク

2015/9/7(Mon) 01:08:11|NO.71425

モジュールのURL
http://ux.getuploader.com/himajin130414/download/7/mod_hgAllWinObj.hsp

・標準ウィンドウオブジェクトとの違い(追加)
hglistbox,hgcomboxに変更があった場合は一度に全項目の描画は行わずに一行づつになる
hgbutton等の名前は \n で改行するスタイル変更では改行しない
文字用テクスチャは設置時に作成されるので、後からこれを超える文字列が入力されると描画されない
(対策としては大きめに作ってからhgSetInputPos,hgSetWinObjPosで必要サイズに小さくする)

少し設定を変更してみる

#include "hgimg3.as" #include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude hgini texload dir_exe+"\\sample\\hspcv\\bgsamp.jpg" clstex stat hgSetImeStatus IMESTATUS_VISIBLE,1 //入力モード表示 text="テスト" font "MS 明朝",28,16+1 //必ずフォントの設定が必要 pos 50,200 hginput text,200,32 //直接描画用のinputを設置 ipid=stat hgSetInput ipid,HGINPUT_BG_RGB_GMODE,$00ffff,3,100 //hginputの背景を青水色にして半透明 文字は水色の反転色になる font "MS ゴシック",20,16 objsize 150,24 pos 50,240 //押し下げ時にジャンプの場合必ずgosubにする必要がある hgbutton gosub "点線表示",*dotline,1+2+4+16+32,$ff00ff00,$88888888,100 //押し下げ時にジャンプ+点線枠非表示+スペースでボタンを押せなくする+押してる間常にジャンプ+押してる間以外フォーカスを合わせない //100フレーム使ってフェードイン repeat stick stk if stk=128 {end} hgdraw hgAllWinObjDraw //hgAllWinObjを描画 imebuf=refstr //ime入力中文字列 actid=stat //フォーカスが合ってるhgAllWinObjID hgsync 16 title ""+text+" c="+c+" l="+l+" cm="+cm+" imebuf="+imebuf+" actid="+actid loop *dotline gmode 0 color 255,0,0 hgDotLine 0,0,640,480,5,gettime(7)/20 //5ドット点線描画 return



暇人

リンク

2015/9/7(Mon) 22:40:37|NO.71461

ちょっとバグがあった
hginputより先にhgMakeInputFrame()を使うとデフォルト用のフレームテクスチャが作られなくなる

なので、修正してついでにhginputフレームの透明度を後から変更する設定も追加
http://ux.getuploader.com/himajin130414/download/8/mod_hgAllWinObj.hsp

hgSetImeで使用する設定項目に

HGINPUT_FRAME_GMODE //(5)INPUTフレームのコピーモードと透明度指「pa=未使用,pb=コピーモード(gmodeのp1と同じ),pc=アルファ値(gmodeのp4と同じ)」
を追加



暇人

リンク

2015/9/8(Tue) 21:57:03|NO.71506

hgObjImage にもバグがあった、押し下げ時に設定通りの座標が使われない

修正ついでにスタイルが変更されたら文字色を反映するように変更 mod_hgAllWinObj.hsp v1.11
http://ux.getuploader.com/himajin130414/download/10/mod_hgAllWinObj.hsp

・標準ウィンドウオブジェクトとの違い(追加)
描画順が作られた順(重なってボタンを押した場合後から作られたものが優先される)
hginputはフォーカスが合ってる物が最後に描画される
作成順に関係なくhgwinobjよりhginputが後で描画される(処理が完全に分かれてるので)
BS_MULTILINE、ES_MULTILINEの複数行を可能にするスタイルは反映されません。
BS_MULTILINEの場合設定しなくても文字列に改行を入れれば複数行になります。


後、仕様として
hgWinObjArgb id,0,色 //透明度は直ぐに反映される
hgSetInput id,HGINPUT_RGB_GMODE,色
の設定は文字列かスタイルの変更がなければ反映されません(無駄にtexmesしてしまう可能性があるので)
文字列を変更せずに色を反映させたい場合はhgWinObjならBS_MULTILINE
hginputならES_MULTILINEのスタイルを変更することで文字色の変化だけに出来ます。


パスワードキャラ設定のhginput
hgMakeInputFrame()を使ったhginput
hgObjImageを使ったhgchkboxとhgbutton
hgchkboxを文字表示だけに使うサンプル
hgSetWinObjPosもちょっと使用

#include "hgimg3.as" #include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude hgini setcolor 255,255,255 addbox mdid,12,12 ; BOXモデルを作成 regobj mychr,mdid ; BOXモデルをオブジェクトとして登録 setpos HGOBJ_CAMERA, 0, 0, 20 ; カメラ位置設定 texload dir_exe+"\\sample\\hgimg3\\q.bmp" mest = stat texmake 256,32 ntexid=stat texcls ntexid,0 font "MS ゴシック",22,16+2 color 128,128,128 texmes "Name",ntexid,8,8 texmake 256,32 ptexid=stat texcls ptexid,0 font "MS ゴシック",22,16+2 color 128,128,128 texmes "Password ",ptexid,8,8 texmake 256,32 name_texid=stat texcls name_texid,$88888888 font "MS ゴシック",28,16 color 0,255,255 texmes "name:",name_texid,2,2 hgSetImeStatus IMESTATUS_VISIBLE,1 //IME入力モード表示 font "MS 明朝",30,16 pos 50,200 framecol=$4444ff,$222288,$222288,$4444ff //外枠左と上,内枠左と上,内枠右と下,外枠右と下 fid = hgMakeInputFrame(framecol,4) //4ドットのフレームをノーマルタイプで作成 name_str="" hginput name_str,250,40,,fid,,,3,200 //hgMakeInputFrameで作ったフレームテクスチャを指定 フレームを半透明設定 iid=stat objenable iid,0 //フォーカスを外すために一旦無効化して objenable iid,1 //有効に戻す hgSetInput iid,HGINPUT_RGB_GMODE,$ffffff //hginputの文字色を変更 hgSetInput iid,HGINPUT_BG_RGB_GMODE,$885500,3,255 //hginputの背景色を変更し半透明指定 hgSetInput iid,HGINPUT_MODE,,,3+4 //通常カーソル非表示にして直接描画カーソル表示+hginput外をクリックするとフォーカスが外れる pas_str="" hginput pas_str,250,40,,fid,,,3,128 //hgMakeInputFrameで作ったフレームテクスチャを指定 フレームを半透明設定 pid=stat sendmsg objinfo(pid, 2), $CC, '*' //パスワードキャラ設定 hgSetInput pid,HGINPUT_RGB_GMODE,$ffffff //hginputの文字色を変更 hgSetInput pid,HGINPUT_BG_RGB_GMODE,$885500,3,255 //hginputの背景色を変更し半透明指定 hgSetInput pid,HGINPUT_MODE,,,3+4 //通常カーソル非表示にして直接描画カーソル表示+hginput外をクリックするとフォーカスが外れる name_f=1 buffer 3,128,128 picload dir_exe+"\\sample\\new\\btn_normal.bmp",1 settex 128,128 btid=stat gsel 0 //必ずメインウィンドウを操作先に戻す必要がある hgobjimage btid, 0,0, 0,64, 0,32,2,2,2 ; ボタンテクスチャの指定 マージン2、押し下げ時文字移動右2、下2 font "MS ゴシック",12,1 pos 300,8 objsize 128,32 hgchkbox "hgObjImage\nhgChkbox",tempch ,2 //hgobjimageのテクスチャを使ったチェックボックス 点線枠非表示 //↑と↓では文字表示位置や離した時の動作が違います。 hgchkbox "hgObjImage\nhgChkbox",tempch ,2 //hgobjimageのテクスチャを使ったチェックボックス 点線枠非表示 chkid=stat hgSetAllWinObjStyle chkid,0x00001000 //プッシュボタンのような概観と機能を持つ、チェックボックス(BS_PUSHLIKE) font "MS ゴシック",26,0 pos 50,300 //hgobjimageのテクスチャを使ったhgbutton hgbutton gosub "[CANCEL]",*_cancel,2+32,$880000ff,,50 //点線枠非表示+押してる間以外フォーカスを合わせない //50フレーム使ってフェードイン cbid=stat pos 180,300 //hgobjimageのテクスチャを使ったhgbutton hgbutton gosub "[OK]",*_ok,2+32,$880000ff,,50 obid=stat buffer 3,512,128 gradf 0,-36,512,36*2,1,$0,$ffffff gradf 0,36,512,36,1,$ffffff,$0 gradf 4,4,512-8,36*2-8,1,$888888,$888888 settex 512,128 mftid=stat gsel 0 //必ずメインウィンドウを操作先に戻す必要がある hgObjImage mftid,0,0 font "MS P明朝",28,16+2+1 objsize 512,36*2 pos 50,350 //文字列表示用のウィンドウとしてhgchkboxを作成 hgchkbox "名前とパスワードを入力してください",temp_chk,2+4+8+32,$ff00ffff,$aa000000 //点線枠非表示+スペースでボタンを押せなくする+クリック出来なくする+押してる間以外フォーカスを合わせない mid=stat hgSetAllWinObjStyle mid,0x00001300 //プッシュボタンのような概観(BS_PUSHLIKE) 中央表示(BS_CENTER) objskip mid,3 //タブキーでフォーカスを合わせない hgObjImage -1 //カスタムボタンキャンセル rot = 0.0 clscolor $4444 *main hgdraw rot+0.05 hgAllWinObjDraw //hgAllWinObjを描画 imebuf=refstr //ime入力中文字列 actid=stat //フォーカスが合ってるhgAllWinObjID if name_f { if actid ! iid { //hginputにフォーカスが合ってないなら"名前を入力して下さい"のテクスチャを表示 if name_str="" { pos 50+256/2,200+40/2 gmode 3,256,32,255 hgrotate ntexid } if nbga ! 100 { //hginput背景の透明度が100じゃないなら nbga=100 //透明度を100に指定 hgSetInput iid,HGINPUT_BG_RGB_GMODE,,,nbga //hginputの背景色を半透明指定 } }else{ if nbga ! 255 { nbga=255 hgSetInput iid,HGINPUT_BG_RGB_GMODE,,,nbga //hginputの背景色を変更し半透明指定 } } if actid ! pid { //hgbuttonにフォーカスが合ってないなら"名前を入力して下さい"のテクスチャを表示 if pas_str="" { pos 50+256/2,200+40/2+40 gmode 3,256,32,255 hgrotate ptexid } if pbga ! 100 { pbga=100 hgSetInput pid,HGINPUT_BG_RGB_GMODE,,,pbga //hginputの背景色を変更し半透明指定 } }else{ if pbga ! 255 { pbga=255 hgSetInput pid,HGINPUT_BG_RGB_GMODE,,,pbga //hginputの背景色を変更し半透明指定 } } //カスタムボタンのサイズ変更テスト(hginputとは違い拡大縮小表示される) if k&$f {hgSetWinObjPos chkid,,, ((k=4)-(k=1))*2,((k=8)-(k=2))*2, 1}//加減算設定でサイズ変更 } pos 10+256/2,10+32/2 gmode 2,256,32,255 hgrotate name_texid hgsync 16 stick k,127 if k&128 : goto *owari ; [ESC]で終了 setang mychr, 0.0, rot,0.0 ; 箱の角度設定 goto *main *_cancel name_str="" objprm iid,"" pas_str="" objprm iid,"" return *_ok if name_str ! "テスト" {objprm mid,"名前が違います(テスト)":return} if pas_str ! "test" {objprm mid,"パスワードが違います(test)":return} font "MS ゴシック",28,16 color 0,255,255 texmes "name:"+name_str,name_texid,2,2 name_f=0 clrobj iid,mid-1 //文字列表示用のhgchkboxだけ残す objprm mid,"ログイン成功" return *owari end



暇人

リンク

2015/9/13(Sun) 01:06:58|NO.71630

mod_hgallwinobjのヘルプファイル
http://ux.getuploader.com/himajin130414/download/11/mod_hgallwinobj.hs

mod_hgallwinobj v1.114
主な修正
・フォーカスを外す設定の場合にキー入力でビープ音が鳴るのを修正
・チェックボックをクリック時確定してないのにチェックマークが付くのを修正
http://ux.getuploader.com/himajin130414/download/12/mod_hgAllWinObj.hsp



暇人

リンク

2015/9/13(Sun) 22:43:38|NO.71656

マウスクリックとキーボード両方で操作出来る設定画面テスト
見た目こんな感じ
http://ux.getuploader.com/himajin130414/download/13/設定画面テスト.PNG

決定、中止は方向キーでフォーカスを合わせてからエンターかスペースで操作

#include "hgimg3.as" #include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude //ウィンドウオブジェクトをグループ化するモジュール #module ////----ウィンドウオブジェクトをグループ化する最初のオブジェクトを設定----- // newRadioGroup p_id, p_sty, p_f // p_id :グループの最初に指定するウィンドウオブジェクトのID // p_sty :追加スタイル // p_f :自動ラジオボタンにするか「0なら自動ラジオボタン」 //戻り値:statにグループIDが返る #deffunc newRadioGroup int p_id,int p_sty,int p_f rg(rgid)=str(p_id) butf_list(p_id)=0 if p_f=0{ hgSetAllWinObjStyle p_id, p_sty | 0x00020009,$f //WS_GROUP 0x00020000 }else{ hgSetAllWinObjStyle p_id, p_sty } rgid++ return rgid-1 ////----newRadioGroup以降のウィンドウオブジェクトをグループ化----- // newRadioGroup p_id, p_sty, p_f // p_id :グループに追加するウィンドウオブジェクトのID // p_sty :追加スタイル // p_f :自動ラジオボタンにするか「0なら自動ラジオボタン」 //戻り値:statにグループ内のオブジェクト数が返る #deffunc nextRadioGroup int p_id,int p_sty,int p_f butf_list(p_id)=0 rg(rgid-1)+","+str(p_id) if p_f=0{ hgSetAllWinObjStyle p_id, p_sty | 9,$f }else{ hgSetAllWinObjStyle p_id, p_sty } split rg(rgid-1),",",rgid_str return stat ////----グループ内のオブジェクトのチェック状態を設定取得----- // setRadioGroupCheck p_rgid, p_i, p_opt, p_clk // p_id :グループID // p_i :チェックONにするインデックス「p_optによりインデックスとして使われるか増減値として使われるか決まる」 // p_opt :p_iの扱いを指定「0=インデックス、1=増減値、2=通常ループするのを0〜上限までになる、8=現在のチェック状態を取得 マイナス値の時はチェックされずにフォーカスを移動させる」 // p_clk :フォーカスが合っていたら押す「p_optがマイナス値かグループ内にチェックONが無い場合」 //戻り値:statにチェックON状態かフォーカスが合っているインデックスが返る #deffunc setRadioGroupCheck int p_rgid,int p_i,int p_opt,int p_clk if p_rgid<0 {return -1} split rg(p_rgid),",",rgid_str if rgid_str=""{return -1} max=stat grp_index=-1 abs_opt=abs(p_opt) repeat max sendmsg objinfo_hwnd(0+rgid_str(cnt)), $F0, 0,0 //BM_GETCHECK if stat{ if abs_opt&8 {grp_index=cnt:break} if abs_opt&2 { if cnt=0 {if p_i<0 {grp_index=cnt:break}} if cnt=(max-1) {if p_i>=((abs_opt&1)=0)*(max-1) {grp_index=cnt:break}} } grp_index=(cnt*((abs_opt&1))+p_i+max)\max if p_opt<0 {break} h=objinfo_hwnd(0+rgid_str(grp_index)) sendmsg h, $f5, 0,0 //BM_CLICK break } loop if (abs_opt&8) ! 8 { if grp_index<0 or p_opt<0{ if p_i { objsel -1 id=stat repeat max if id=(0+rgid_str(cnt)) { if abs_opt&2 { if cnt=0 {if p_i<0 {grp_index=cnt:break}} if cnt=(max-1) {if p_i>=((abs_opt&1)=0)*(max-1) {grp_index=cnt:break}} } grp_index=(cnt+p_i+max)\max break } loop if grp_index<0 { if p_i<=0{grp_index=0} if p_i>0{grp_index=1} }else{ } objsel (0+rgid_str(grp_index)) }else{ objsel -1 id=stat repeat max if id=(0+rgid_str(cnt)) { if p_clk { sendmsg objinfo_hwnd(id), $f3, 1,0 //BM_SETSTATE butf_list(id)=1 }else{ if butf_list(id)=1 { butf_list(id)=0 sendmsg objinfo_hwnd(id), $f5, 0,0 //BM_CLICK } } break } loop } } } return grp_index ////----グループの表示非表示を変更する-----(hgWinObjInvalidを使った非表示の場合は完全に描画処理(hgAllWinObjDraw)から除外される) // RadioGroupON p_rgid, p_f // p_rgid :表示状態を変更するグループID // p_f :表示状態スイッチ「0=表示、1=非表示」 //戻り値:statが0以外の場合グループ内にオブジェクトが無かった #deffunc RadioGroupON int p_rgid,int p_f split rg(p_rgid),",",rgid_str if rgid_str=""{return 1} if p_f {//非表示 repeat stat hgWinObjInvalid 0+rgid_str(cnt) loop }else{//表示 repeat stat hgWinObjValid 0+rgid_str(cnt) loop } return 0 ////----グループ内のオブジェクトID取得----- // 変数 = getRadioGroupObjSel( p_rgid, p_index) // p_rgid :オブジェクトIDを取得したいグループID「0〜」 // p_index :グループ内インデックス「0〜」 //戻り値:0以上ならオブジェクトID、マイナス値の場合グループ内に指定オブジェクトが無かった #defcfunc getRadioGroupObjSel int p_rgid,int p_index if p_rgid<0 or p_index<0{return -1} split rg(p_rgid),",",rgid_str if p_index>=stat or rgid_str="" {return -1} return 0+rgid_str(p_index) ////----グループ内のオブジェクトを削除してグループ情報もクリア----- // clrRadioGroup p_rgid // p_rgid :削除するオブジェクトID「0〜」 //戻り値:statが0以外の場合グループ内にオブジェクトが無かった #deffunc clrRadioGroup int p_rgid if p_rgid<0 {return 1} split rg(p_rgid),",",rgid_str if rgid_str=""{return 1} repeat stat clrobj int(rgid_str(cnt)),int(rgid_str(cnt)) loop rg(p_rgid)="" return 0 #global hgini setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode) texload dir_exe+"\\sample\\hgimg3\\fontchr.bmp" ; フォントテクスチャの登録 #enum テストA = 0 #enum テストB #enum テストC #enum テストD #enum テストE #enum 設定更新 confname="テストA","テストB","テストC","テストD","テストE","設定更新"//メイングループ名 font "MS ゴシック",32,16 objsize 400,40 pos 50,200 c(設定更新)=1 //設定更新のラジオボタンON repeat length(confname) hgchkbox confname(cnt),c(cnt),2+4+32+256,$ff00ffff,$884444ff,10 //フォーカス点線枠非表示+スペースで決定出来なくする+押してる間以外フォーカスを合わせない+非表示無効状態 if cnt=0 {//一つ目はnewRadioGroup newRadioGroup stat,$1100 //BS_PUSHLIKE(0x00001000) + BS_LEFT(0x00000100) mgrpid=stat //メインループID保持 }else{//二つ目からはnextRadioGroup nextRadioGroup stat, $1100 } loop confbcnt=2,2,2,3,5,2 //サブグループのボタンの数 confbn="0","1", "0","1", "0","1", "0","1","2", "0","1","2","3","4", "決定","中止" //サブグループのボタン名 //295=押し下げ時に決定+フォーカス点線枠非表示+スペースで決定出来なくする+押してる間以外フォーカスを合わせない+非表示無効状態 confopt=295,295, 295,295, 295,295, 295,295,295, 295,295,295,295,295, 256+2,256+2 //ボタンオプション conf_list=0, 0, 1, 2, 3,-1 //サブグループの何番目のラジオボタンをONにするか(-1は通常ボタンを作る) font "MS ゴシック",20,16 ch_cnt=0 //コンフィング用オブジェクトの数カウント用 repeat length(confname) if conf_list(cnt)>=0 { chf_list(ch_cnt+conf_list(cnt))=1 //指定されてる場所をON chkaut_f=0 //チェックボックスからラジオボタンフラグ }else{ chkaut_f=1 //通常ボタン用フラグ } sizex=250/confbcnt(cnt) objsize sizex-4,28 grp_index=cnt //サブグループとして使う配列grp_id用のグループインデックス repeat confbcnt(cnt) pos 200+sizex*cnt,200+grp_index*40+6 if chkaut_f {//通常ボタン hgbutton gosub confbn(ch_cnt),*fonf,confopt(ch_cnt),$ff55ff55,$88885544,10 }else{//チェックボックス hgchkbox confbn(ch_cnt),chf_list(ch_cnt),confopt(ch_cnt),$ffffffff,$885566aa,10 } if cnt=0 {//一つ目はnewRadioGroup newRadioGroup stat,$1000,chkaut_f//BS_PUSHLIKE(0x00001000) grp_id(grp_index)=stat ///サブとして使うグループID保持 }else{//二つ目からはnextRadioGroup nextRadioGroup stat, $1000,chkaut_f } ch_cnt++ loop loop ok_id=getRadioGroupObjSel(grp_id(設定更新),0) //決定ボタンID can_id=getRadioGroupObjSel(grp_id(設定更新),1) //中止ボタンID font "MS ゴシック",18,16 pos 0,0 objsize 100,28 hgbutton gosub "設定開始",*fonf fonf_id=stat clscolor $4444 repeat stk_b=stk stick stk,$ff if stk=128 {end} hgdraw if conf_f {//設定画面表示中 setRadioGroupCheck mgrpid,,8 //操作中のグループインデックスを取得 grp_index=stat if (stk&32)>0 { setRadioGroupCheck grp_id(grp_index),0,-1,1 //押されてる }else{ if stk_b&32 {setRadioGroupCheck grp_id(grp_index),0,-1,0}//離された } if stk=2 and stk_b=0{ setRadioGroupCheck mgrpid,-1,1 grp_index=stat } if stk=8 and stk_b=0{ setRadioGroupCheck mgrpid,1,1 grp_index=stat } if stk=1 and stk_b=0 { setRadioGroupCheck grp_id(grp_index),-1,3} if stk=4 and stk_b=0 { setRadioGroupCheck grp_id(grp_index),1,3} hgAllWinObjDraw //hgAllWinObjを描画 actid=stat //フォーカスが合ってるhgAllWinObjID if 設定更新=grp_index{ if actid=ok_id or actid=can_id{// "決定","中止"選択中枠表示() hgGetAllWinObjPos actid, p_px, p_py, p_sx, p_sy color 255,255 gmode 0 hgDotLineRect p_px, p_py, p_sx, p_sy,4,f f++ } } }else{ hgAllWinObjDraw //hgAllWinObjを描画 actid=stat //フォーカスが合ってるhgAllWinObjID } repeat 6 setRadioGroupCheck grp_id(cnt),0,8 fprt ""+stat,450,200+cnt*40 loop hgsync 16 loop stop *fonf if stat=fonf_id {hgWinObjInvalid fonf_id} if stat=ok_id { hgWinObjValid fonf_id repeat 6 setRadioGroupCheck grp_id(cnt),0,8 conf_list(cnt)=stat //設定更新 loop } if stat=can_id { hgWinObjValid fonf_id repeat 6 setRadioGroupCheck grp_id(cnt),conf_list(cnt),0 //変更前に戻す loop } RadioGroupON mgrpid,conf_f //conf_fが0なら表示 1なら非表示 repeat length(grp_id) RadioGroupON grp_id(cnt),conf_f loop conf_f^1 return
設定画面を出すのはボタンクリックで・・・



スペース

リンク

2015/9/13(Sun) 23:05:39|NO.71657

これは凄い。hgimg3を使ったゲームを作るときに使用させて頂きます。



暇人

リンク

2015/9/14(Mon) 21:25:38|NO.71679

ありがとうございます。
お役に立てれば幸いです。

>NO.71656
のボタンのジャンプ先の処理がバグってもおかしくないので修正

*fonf id=stat if id=fonf_id {hgWinObjInvalid fonf_id} if id=ok_id { hgWinObjValid fonf_id repeat 6 setRadioGroupCheck grp_id(cnt),0,8 conf_list(cnt)=stat //設定更新 loop } if id=can_id { hgWinObjValid fonf_id repeat 6 setRadioGroupCheck grp_id(cnt),conf_list(cnt),0 //変更前に戻す loop } RadioGroupON mgrpid,conf_f //conf_fが0なら表示 1なら非表示 repeat length(grp_id) RadioGroupON grp_id(cnt),conf_f loop conf_f^1 return



暇人

リンク

2015/9/14(Mon) 22:28:31|NO.71685

バグ等修正
・hgInputを一度でも作ってからじゃないとhgListbox、hgComboxにマウスカーソルをあわせるとエラーになるのを修正
・hgButtonより後にhgListbox、hgComboxが配置されるとhgButtonをクリックできなくなるのを修正
・SetWindowLongを使った無効化ではスペースで反応してしまうのでフォーカスを外すように修正
・プッシュ概観チェックボックスをクリック時に確定してなくても網目が描画されるのを修正
・hgObjImageを使ったチェックボックスを押した時にhgrectで減算コピーして少し暗くしてたのをチェックボックスのテクスチャをコピーするように変更(四角以外でも良いように)
・hgButton、hgChkboxのp_optに 64=マウスオーバー無し を追加(hgObjImageを使用してる場合は無効)

ヘルプファイル v1.12
http://ux.getuploader.com/himajin130414/download/18/mod_hgallwinobj.hs

mod_hgAllWinObj.hsp v1.12
http://ux.getuploader.com/himajin130414/download/19/mod_hgAllWinObj.hsp




楕円形のリージョンテストの見た目(見た目だけじゃ意味無いが・・・)
http://ux.getuploader.com/himajin130414/download/14/EllipticRgnTes.PNG

裏でウィンドウオブジェクトが動いてるので
リージョンを差し替えれば、そのまま判定に反映されると言うテスト

#include "hgimg3.as" #include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude if HGALLWINOBJ_VER < 1.12 {dialog "バージョン1.12以上を使用して下さい":end} #uselib "gdi32" #cfunc CreateEllipticRgn "CreateEllipticRgn" int, int, int, int #uselib "user32" #func SetWindowRgn "SetWindowRgn" int, int, int hgini setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode) texload dir_exe+"\\sample\\hgimg3\\fontchr.bmp" ; フォントテクスチャの登録 osx=250 osy=40 p_x1=0 p_y1=0 p_x2=0 p_y2=osy p_x3=0 p_y3=osy*2 buffer 3,256,128 boxf color 1,1,1 circle p_x1, p_y1, p_x1+osx, p_y1+osy color 100,150,250 circle p_x1, p_y1, p_x1+osx-4, p_y1+osy-4 color 150,150,250 circle p_x2+4, p_y2+4, p_x2+osx, p_y2+osy color 1,1,1 circle p_x3, p_y3, p_x3+osx,p_y3+osy color 150,150,255 circle p_x3, p_y3, p_x3+osx-4, p_y3+osy-4 settex 256,128 p_tid=stat color boxf color 200,150,50 circle p_x1, p_y1, p_x1+osx, p_y1+osy color 255,255,255 boxf 3,osy/2-4,3+8,osy/2+4 pos p_x2, p_y2 gcopy 3,p_x1, p_y1, p_x1+osx, p_y1+osy color 1,1,1 line p_x2+2,p_y2+osy/2-5,p_x2+3+8,p_y2+osy/2+4 line p_x2+2,p_y2+osy/2+5,p_x2+3+8,p_y2+osy/2-4 gmode 3,,,128 pos p_x3, p_y3 gcopy 3,p_x2, p_y2, p_x2+osx, p_y2+osy settex 256,128 p_tid2=stat gsel 0 //必ずメインウィンドウに戻す hgObjImage p_tid, p_x1, p_y1, p_x2, p_y2, p_x3, p_y3, 2, 4, 4//マージン2ドット、文字移動縦横4ドット font msmincho,18,1+16 objsize osx,osy pos 100,100 hgbutton gosub "楕円リージョンテスト",*tes,,$ddffffff,AlpCOLORtoARGB(255,100,150,250) //背景はhgObjImageのテクスチャが使われますが、描画時の透明度と背景色取得にはこの設定が使われます bid=stat hRegion = CreateEllipticRgn(p_x1-2, p_y1-2, p_x1+osx+2, p_y1+osy+2) //楕円形のリージョンを作成 SetWindowRgn objinfo_hwnd(bid), hRegion, 1 //楕円形のリージョンをオブジェクトに設定 hgchkbox "楕円リージョンテスト",c_tes,,$ddffffff,AlpCOLORtoARGB(255,255,0,0) //フォーカス枠が背景色の反転色になる cid=stat hgSetAllWinObjStyle cid, 0x00001000 //チェックボックスをプッシュボタン概観にすると押し下げてクリックを離すと文字位置が元に戻る(これは標準chkboxと同じ動作) hRegion = CreateEllipticRgn(p_x1-2, p_y1-2, p_x1+osx+2, p_y1+osy+2) SetWindowRgn objinfo_hwnd(cid), hRegion, 1 hgObjImage p_tid2, p_x1, p_y1, p_x2, p_y2, p_x3, p_y3, 0, 0, 0//マージン0ドット、文字移動縦横0ドット hgchkbox "楕円リージョンテスト",c_tes2,,$ffffffff,AlpCOLORtoARGB(255,0,0,0) //フォーカス枠が背景色の反転色になる cid2=stat hgSetAllWinObjStyle cid2, 6,3 // (6)BS_AUTO3STATE つの状態を持つチェックボックス,(3)BS_AUTOCHECKBOX hRegion = CreateEllipticRgn(p_x1, p_y1, p_x1+osx, p_y1+osy) SetWindowRgn objinfo_hwnd(cid2), hRegion, 1 hgObjImage -1 clscolor $4444 repeat stk_b=stk stick stk,$ff if stk=128 {end} hgdraw hgAllWinObjDraw //hgAllWinObjを描画 actid=stat //フォーカスが合ってるhgAllWinObjID fprt "actid="+actid,0,0 fprt "c_tes="+c_tes,350,100+40 fprt "c_tes2="+c_tes2,350,100+40*2 hgsync 16 loop *tes b++ title ""+b return




暇人

リンク

2015/9/14(Mon) 22:37:16|NO.71686

楕円形のリージョンテストの見た目
http://ux.getuploader.com/himajin130414/download/20/EllipticRgnTes.PNG

NO.71685のは間違えてデスクトップ全体を写してた・・・



暇人

リンク

2015/9/21(Mon) 03:52:24|NO.71808

アイテムウィンドウテストの画像
http://ux.getuploader.com/himajin130414/download/21/itemwin.PNG

マウスクリックで操作するアイテムウィンドウを作って見るテスト

#include "hgimg3.as" #include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude #uselib "gdi32" #cfunc CreateEllipticRgn "CreateEllipticRgn" int, int, int, int #cfunc CreateRectRgn "CreateRectRgn" int, int, int, int #uselib "user32" #func SetWindowRgn "SetWindowRgn" int, int, int #cfunc GetWindow "GetWindow" int, int #func GetCaretPos "GetCaretPos" var #cfunc GetCaretBlinkTime "GetCaretBlinkTime" #func SetCaretPos "SetCaretPos" int,int #cfunc GetDC "GetDC" int #func ReleaseDC "ReleaseDC" int #func DestroyWindow "DestroyWindow" int #cfunc WindowFromPoint "WindowFromPoint" int,int #cfunc ChildWindowFromPoint "ChildWindowFromPoint" int,int,int //hgobjimageで設定されてるテクスチャID取得 //「変数 = hggetobjimagetex(hgwinobjID)」 #define ctype global hggetobjimagetex(%1) hgbt_tex_id_list@mod_hgallwinobj((%1)*9) //hgobjimageで設定されてるテクスチャ参照座標を取得 //「hggetobjimageindex hgwinobjID,参照座標の種類,X座標,Y座標」 //参照座標の種類:0=常時 1=押し下げ時 2=マウスオーバー時 #define global hggetobjimageindex(%1,%2,%3,%4) %3=hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9+(%2)*2):%3=hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9+(%2)*2+1) //hgobjimageで設定されてるテクスチャIDを変更 //「hgsetobjimagetex hgwinobjID,テクスチャID」 #define global hgsetobjimagetex(%1,%2) hgbt_tex_id_list@mod_hgallwinobj(%1)=%2 //hgobjimageで設定されてるテクスチャ参照座標を変更 //hgsetobjimageindex hgwinobjID,カスタムボタンの参照座標1〜3が入ってる配列(2*3要素必要)」 #define global hgsetobjimageindex3(%1,%2) memcpy hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9),%2,24 //hgobjimageで設定されてるテクスチャ参照座標を変更 //hgsetobjimageindex hgwinobjID,参照座標の種類,X座標,Y座標」 //参照座標の種類:0=常時 1=押し下げ時 2=マウスオーバー時 #define global hgsetobjimageindex(%1,%2,%3,%4) hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9+(%2)*2)=%3,%4 screen 0,800,600,0,100,100 hgini setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode) texload dir_exe+"\\sample\\hgimg3\\fontchr.bmp" ; フォントテクスチャの登録 // 0 1 , 2 ,3 , 4 , 5 , 6, 7 , 8 itemtype_name="未定","回復", "攻撃", "無", "装備", "無", "無", "無", "特殊" //アイテムIDに各種データセット repeat 64 igpx=(cnt\8)*64 igpy=(cnt/8)*64 item_tixy(cnt*6)= igpx, igpy, igpx-2, igpy-2,igpx, igpy //アイテム画像座標(objimageの x1,y1,x2,y2,x3,y3 と同じ) item_type(cnt)=1<<(cnt/16) //今回はID16個毎にタイプを1,2,4,8に設定("回復","攻撃","装備","特殊") item_name(cnt)="アイテムID:"+strf("%03d",cnt) item_effect(cnt)="ID"+cnt+"の説明" loop ITEM_SIZE=64 ITEM_HMAX=4 //アイテム欄横数 ITEM_VMAX=4 //アイテム欄縦数 ITEM_TOTAL=ITEM_HMAX*ITEM_VMAX TITLE_SIZEY=20 TAB_SIZEY=20 //-----アイテムウィンドウ背景(64*64がループされて使用される) buffer 3,ITEM_SIZE,ITEM_SIZE //2の累乗意外だとうまくいかない gbcolor=$885522,$558822,$552288,$885588 gbcolor2=$664422,$446622,$442266,$664466 repeat 4 gradf 0,0,ITEM_SIZE,ITEM_SIZE,1,gbcolor(cnt),gbcolor(cnt) gradf 2,2,ITEM_SIZE-4,ITEM_SIZE-4,1,gbcolor2(cnt),0 settex ginfo_sx,ginfo_sy itemwin_bgtex_id(cnt)=stat loop //-----メニュー表示時のマスクテクスチャ buffer 3,ITEM_SIZE*ITEM_HMAX,ITEM_SIZE*ITEM_VMAX //2の累乗意外だとうまくいかない color 10,10,10 boxf gradf 0,0,ITEM_SIZE,ITEM_SIZE,0,0,0 //左上に穴を開ける settex ginfo_sx,ginfo_sy itewin_mskid=stat gsel 0 //必ずメインウィンドウに戻す texload2 dir_exe+"\\sample\\hgimg4\\res\\ball64.png" gbtexid=stat texload dir_exe+"\\hsptv\\bg03.jpg" bgid=stat dim itemwin_bttype,256 //ボタンやチェックボックスの使用タイプ保存参照用配列 //-----アイテムウィンドウ用タイトルバー作成 pos 100,100 objsize ITEM_SIZE*ITEM_HMAX,TITLE_SIZEY font "MS ゴシック",TITLE_SIZEY-2,1 hgbutton gosub "",*_itemwin_move,2+4+16+32,$ffffffff,AlpCOLORtoARGB(80,50,70,60) itemwin_titlebar_id=stat //-----アイテムウィンドウタイトル名用チェックボックス作成(タイトルバーのサイズを変更するので) pos 0,0 //タイトルバーの子ウィンドウとして使うので左上なら0,0 objsize 64,TITLE_SIZEY hgchkbox "ITEM",itemwin_open,2+4+8+32+64,$ffffffff,0 itemwin_titlename_id=stat hgSetAllWinObjStyle itemwin_titlename_id, $1000,0 hgSetParent itemwin_titlename_id,itemwin_titlebar_id SetWindowRgn objinfo_hwnd(itemwin_titlename_id),CreateRectRgn(0,0,0,0),0 hgObjImage -1 //-----種類タブ作成 bitmsk_list=%1111,%11,%100,%1000 itemwin_tabname="全品","消耗品","装備品","特殊品" tab_sty=$21009,$1009,$1009,$1009 //WS_GROUP(0x00020000) BS_PUSHLIKE(0x00001000) BS_AUTORADIOBUTTON(0x00000009) font "MS 明朝",TITLE_SIZEY-2,16+1 //文字表示は使ってないけどhgbuttonの仕様上設定は必要 typetab_cf=1,0,0,0 tabsize=(ITEM_SIZE*ITEM_HMAX/4) objsize tabsize,TAB_SIZEY repeat length(itemwin_tabname) pos tabsize*cnt,20 //タイトルバーの下にしたいのでタイトルバーの高さ分下に配置 InvertColor gbcolor(cnt),tab_ir,tab_ig,tab_ib hgchkbox itemwin_tabname(cnt),typetab_cf(cnt),1+2,AlpCOLORtoARGB(255,tab_ir,tab_ig,tab_ib),$ff000000+gbcolor(cnt),5 //背景はhgObjImageのテクスチャが使われますが、描画時の透明度と背景色取得にはこの設定が使われます typetab_id(cnt)=stat objid_index_list(stat)=cnt itemwin_bttype(stat)=-2 //このIDがアイテムタブ用ボタンに使用してるフラグ hgSetAllWinObjStyle typetab_id(cnt), tab_sty(cnt),$f hgSetParent typetab_id(cnt),itemwin_titlebar_id //タイトルバーの子にする loop InvertColor gbcolor,tab_ir,tab_ig,tab_ib //-----アイテムウィンドウ背景 hgObjImage itemwin_bgtex_id, 0, 0, 0, 0, 0, 0, 0, 0, 0//マージン2ドット、文字移動縦横4ドット objsize ITEM_SIZE*ITEM_HMAX,ITEM_SIZE*ITEM_VMAX pos 0,TITLE_SIZEY+TAB_SIZEY hgbutton gosub "",*_temp,2+4+8+32,$dd5,AlpCOLORtoARGB(255,100,150,250) //背景はhgObjImageのテクスチャが使われますが、描画時の透明度と背景色取得にはこの設定が使われます itemwin_bg_id=stat hgSetParent itemwin_bg_id,itemwin_titlebar_id //タイトルバーの子にする //-----ページタブ作成 hgObjImage -1 pagetab_cf=1,0,0,0 tabsize=ITEM_SIZE*ITEM_HMAX/4 objsize tabsize,TAB_SIZEY repeat 4 pos tabsize*cnt,ITEM_SIZE*ITEM_VMAX //タイトルバーの下にしたいのでタイトルバーの高さ分下に配置 hgchkbox str(1+cnt),pagetab_cf(cnt),1+2+32,$88010101,$ff000000+gbcolor,5 //背景はhgObjImageのテクスチャが使われますが、描画時の透明度と背景色取得にはこの設定が使われます+cnt pagetab_id(cnt)=stat objid_index_list(stat)=cnt itemwin_bttype(stat)=-3 //このIDがページタブ用ボタンに使用してるフラグ hgSetAllWinObjStyle pagetab_id(cnt), tab_sty(cnt),$f hgSetParent pagetab_id(cnt),itemwin_bg_id //タイトルバーの子にする loop //-----アイテム画像をカスタムボタンテクスチャに設定 hgObjImage gbtexid, 0, 0, 0, 0, 0, 0, 0, 2, 2//マージン2ドット、文字移動縦横4ドット font "MS 明朝",20,16+1+2 //-----アイテムボタン作成 objsize ITEM_SIZE,ITEM_SIZE repeat ITEM_TOTAL pos (cnt\ITEM_HMAX)*ITEM_SIZE,(cnt/ITEM_HMAX)*ITEM_SIZE hgbutton gosub " ",*_temp,4+16,$ff00ffff,$885522,5 ibid_list(cnt)=stat //インベントリ用ボタンIDを表示インデックス順に代入「表示順はibid_list(0)が左上で右隣がibid_list(1)」 objid_index_list(stat)=cnt //ID指定逆引き用リスト(IDを要素にすれば表示インデックスが分かる) itemwin_bttype(stat)=-1 //このIDがアイテム用ボタンに使用してるフラグ(-1はアイテム設定前) hgSetAllWinObjStyle ibid_list(cnt),0x0000A00 hgSetParent ibid_list(cnt), itemwin_bg_id loop //-----アイムメニュー表示時に使用するアイテム以外を半透明マスクするボタン作成 hgObjImage itewin_mskid, 0, 0, 0, 0, 0, 0, 0, 0, 0 objsize ITEM_SIZE*ITEM_HMAX,ITEM_SIZE*ITEM_VMAX pos 0,0 hgbutton gosub "",*_temp,2+4+32+256,0,$88000000 itemwin_msk_id=stat hgSetParent itemwin_msk_id, itemwin_bg_id SetWindowRgn objinfo_hwnd(itemwin_msk_id),CreateRectRgn(0,0,0,0),0 hgObjImage -1 //-----アイテム所持リスト dim itemid_list,100 dim itemstock_list,100 item_max=50 //アイテム所持数 repeat item_max itemid=rnd(64) //アイテムIDとして0〜64をランダムで代入 itemid_list(cnt)=itemid //アイテムIDを所持リストに登録 itemstock_list(cnt)=rnd(99)+1 //アイテム別所持数 loop dim itemwin_index_list,ITEM_TOTAL //-----所持アイテムをアイテムボタンに割り当て repeat ITEM_TOTAL ibid=ibid_list(cnt) //アイテムボタン用ID if itemstock_list(cnt) {//一つ以上もってる itemid=itemid_list(cnt) itemwin_index_list(ibid)=cnt itemwin_bttype(ibid)=1 //アイテムボタンにアイテムIDが割り当てられたフラグ hgWinObjArgb ibid, 1,$ff885522 if item_type(itemid)&%11 {objprm ibid,itemstock_list(cnt)}else{objprm ibid,""} //消耗品以外は個数表示無し //カスタムボタン参照座標をアイテムテクスチャ座標に変更 hgsetobjimageindex3 ibid,item_tixy(itemid*6) }else{//もってない itemwin_bttype(ibid)=-1 //アイテムボタンにアイテムIDが割り当てられたフラグ hgWinObjArgb ibid, 1,$885522 } loop //-----アイテムコメントウィンドウ作成 font "MS 明朝",18,16+1 objsize 200,100 hgchkbox "名前:\n効果:\n種類:",temp_chk,256+2+4+8+32+64,$ffffffff,AlpCOLORtoARGB(170,100,150,250),10 //背景はhgObjImageのテクスチャが使われますが、描画時の透明度と背景色取得にはこの設定が使われます itemcom_id=stat hgSetAllWinObjStyle itemcom_id,0x00009500 // BS_FLAT(0x00008000) | BS_PUSHLIKE(0x00001000) | BS_TOP(0x00000400) | BS_LEFT(0x00000100) //----アイテムウィンドウ用メニュー作成 font "MS 明朝",18,16+1 item_men="使う\n詳細\n捨てる\nキャンセル" objsize 100,18 pos 0,0 im_i=-1 hglistbox im_i,18*4,item_men,16+256,$ffff44ff,$88005555 //リストボックスをメニューとして使う itemwin_menu_id=stat hgWinObjArgb itemwin_menu_id, 3,$88000000 objsize 100,18*4 pos 0,0 hgbutton gosub "",*_itemwin_menu,2+4+16+64+256,0,$11881111 //メニューの上にボタンを被せてメニュー操作を補助 itemwin_menu_button_id=stat clstex bgid repeat stk_b=stk stick stk,$fff if stk=128 {end} hgdraw if (stk&256)>0 { if itemwin_move_f {//アイテムウィンドウ移動(ボタンでジャンプしたルーチン内だとうまく行かなかったので) hggetmouse mx,my hgSetWinObjPos itemwin_titlebar_id,mx+inv_difx,my+inv_dify }else{ if HGMOUSE_POINT_ID>=0 { if itemwin_bttype(HGMOUSE_POINT_ID)>0 { if (frame_cnt-L_click_time)<15 and sel_ibid=HGMOUSE_POINT_ID and mlc_f=0 { //左ダブルクリック mlc_f=2 //左ダブルクリックフラグ itemindex=itemwin_index_list(sel_ibid) //アイテムボタンIDを要素にインデックスリストからインデックスを取得 itemid=itemid_list(itemindex) //インデックスを要素にアイテムIDリストからアイテムIDを取得 if item_type(itemid) & %11 { title "使用 名前:"+item_name(itemid)+" 効果:"+item_effect(itemid) itemstock_list(itemindex)-- if itemstock_list(itemindex) { objprm sel_ibid,itemstock_list(itemindex) }else{ hgWinObjArgb sel_ibid, 0,$0000ffff hgWinObjArgb sel_ibid, 1,$0885522 itemwin_bttype(sel_ibid)=-1 //アイテムボタンからアイテムIDが解除されたフラグ } }else{ if item_type(itemid) & %100 { title "装備 名前:"+item_name(itemid)+" 効果:"+item_effect(itemid) if itemstock_list(itemindex)=1 {objprm sel_ibid,"":itemstock_list(itemindex)=2}else{objprm sel_ibid,"装備中":itemstock_list(itemindex)=1} }else{ title "特殊 名前:"+item_name(itemid)+" 効果:"+item_effect(itemid) } } }else{//左クリック sel_ibid=HGMOUSE_POINT_ID //選択中アイテムボタンID mlc_f=1 //左クリックフラグ } L_click_time=frame_cnt } } } }else{ mlc_f=0 //左クリックフラグクリア } if itemwin_off=0 {//アイテムウィンドウ表示中 if menu_on {//メニュー表示中 if ((menu_tag_id ! HGMOUSE_POINT_ID) and (HGMOUSE_POINT_ID ! itemwin_menu_button_id)) {//マウスがメニュー外か違うアイテムに移動した menu_on=2 //クリック関係なくメニューを消すフラグ gosub *_itemwin_menu } }else{ if HGMOUSE_POINT_ID>=0{ if (stk&512)>0 {//右クリック if itemwin_bttype(HGMOUSE_POINT_ID)>0{//マウスがアイテムボタンを指してる menu_tag_id=HGMOUSE_POINT_ID //メーニューを開くアイテムボタンID objsel menu_tag_id gosub *_itemwin_menu //menu_on=0なのでメーニューを開く } } } } hgAllWinObjDraw //hgAllWinObjを描画 actid=stat //フォーカスが合ってるhgAllWinObjID if itemwin_move_f=0 { gosub *_itemwin_open//アイテムウィンドウ内に変更があった時の処理 } }else{ hgAllWinObjDraw //hgAllWinObjを描画 actid=stat //フォーカスが合ってるhgAllWinObjID } hgsync 16 frame_cnt++ loop *_temp //ボタンとして使用しないhgbuttonのラベル return //アイテムウィンドウ内に変更があった時の処理 *_itemwin_open if HGMOUSE_POINT_ID>=0 { if itemwin_bttype(HGMOUSE_POINT_ID)>0 {//マウスがアイテムボタンを指してる if itemcom_f=0 or HGMOUSE_POINT_ID_bak!HGMOUSE_POINT_ID {//コメントウィンドウが非表示か違うアイテムが指された itemcom_f=1//アイテムコメントウィンドウ表示中フラグ HGMOUSE_POINT_ID_bak=HGMOUSE_POINT_ID //現在のアイテムボタンID保持 hgGetAllWinObjPos HGMOUSE_POINT_ID, mc_px, mc_py, sx, sy //現在のアイテムボタン座標取得 hgWinObjValid itemcom_id //アイテムコメントウィンドウ表示 ispx=mc_px+1.2*ITEM_SIZE //アイテムボタン座標より右上にずらす ispy=mc_py-1.2*ITEM_SIZE hgSetWinObjPos itemcom_id, ispx,ispy //アイテムボタン座標設定 itemindex=itemwin_index_list(HGMOUSE_POINT_ID) //アイテムボタンIDを要素にインデックスリストからインデックスを取得 itemid=itemid_list(itemindex) //インデックスを要素にアイテムIDリストからアイテムIDを取得 //解説をボタンに設定 objprm itemcom_id,"名前:"+item_name(itemid)+"\n種類:"+itemtype_name(item_type(itemid))+"\n効果:"+item_effect(itemid) } color tab_ir,tab_ig,tab_ib gmode 0 f++ hgDotLineRect mc_px, mc_py, ITEM_SIZE-1, ITEM_SIZE-1,4,f/4 hgline HGMOUSEX, HGMOUSEY,ispx, ispy }else{ if itemcom_f=1 {//アイテムコメントウィンドウ非表示処理 itemcom_f=0 hgWinObjInvalid itemcom_id } } }else{ if itemcom_f=1 {//アイテムコメントウィンドウ非表示処理 itemcom_f=0 hgWinObjInvalid itemcom_id } } if actid>=0 { if actid_bak!actid { actid_bak=actid if itemwin_bttype(actid)<=-2 {//タブがアクティブ sendmsg objinfo_hwnd(actid), 0x00F0 , 0,0 //BM_GETCHECK 0x00F0 //タブに使用してるグループラジオボタンのチェック状況を取得 if itemwin_bttype(actid)=-2 {//タイプタブがアクティブ tab_index=objid_index_list(actid) //タブのインデックス chk_on=stat and (tab_index_bak!tab_index) //チェックONで更にタブの変更があれば1 if chk_on {//ページタブを最初に戻す objprm pagetab_id(pagetab_index),0 objprm pagetab_id,1 pagetab_index=0 } tab_index_bak=tab_index }else{ if stat and itemwin_bttype(actid)=-3 {//ページタブがアクティブ chk_on=1 pagetab_index=objid_index_list(actid) //ページタブインデックス } } if chk_on { chk_on=0 tab_argb=hgGetWinObjArgb(actid,1) InvertColor tab_argb,tab_ir,tab_ig,tab_ib bitmsk=bitmsk_list(tab_index) pagetab_nextindex=pagetab_index*ITEM_TOTAL //ページタブインデックスを次ページまでのアイテム数にする itemid_cnt=0 ibid_cnt=0 repeat -1 if ibid_cnt=ITEM_TOTAL {break}//アイテムボタンを使い切った if cnt<item_max { itemid=itemid_list(cnt) if (item_type(itemid) & bitmsk)>0 and itemstock_list(cnt)>0{//タイプタブに一致していて1個以上もってる if itemid_cnt<pagetab_nextindex {itemid_cnt++:continue} //現在のページになるまでitemid_cntを加算 ibid=ibid_list(ibid_cnt) //アイテムボタンID itemwin_bttype(ibid)=1 //アイテムボタンにアイテムIDが割り当てられたフラグ hgWinObjArgb ibid, 0,$ff00ffff hgWinObjArgb ibid, 1,tab_argb if item_type(itemid)&%11 {objprm ibid,itemstock_list(cnt)}else{objprm ibid,""} //消耗品以外は個数表示無し //カスタムボタン参照座標をアイテムテクスチャ座標に変更 hgsetobjimageindex3 ibid,item_tixy(itemid*6) itemwin_index_list(ibid)=cnt//ボタンIDを要素にアイテムIDリストのインデックスを代入 }else{ continue } }else{//所持アイテム数を超えた //使用したいアイテムボタンを透明に ibid=ibid_list(ibid_cnt) hgWinObjArgb ibid, 0,$0000ffff hgWinObjArgb ibid, 1,$0885522 itemwin_bttype(ibid)=-1 //アイテムボタンからアイテムIDが解除されたフラグ } ibid_cnt++ loop //カスタムボタン用テクスチャIDを変更 hgsetobjimagetex itemwin_bg_id,itemwin_bgtex_id(tab_index) repeat 4 hgWinObjArgb pagetab_id(cnt), 1,tab_argb loop } } } } return //アイテムメニュー処理 *_itemwin_menu if menu_on {//メニュー表示中 getkey bt_clk,1 if bt_clk=0 or menu_on=2 {//メニューを非表示にする処理 menu_on=0 hgWinObjInvalid itemwin_msk_id hgWinObjInvalid itemwin_menu_button_id hgWinObjInvalid itemwin_menu_id objsel -1 if im_i<0 or (HGMOUSE_POINT_ID ! itemwin_menu_button_id) {//マウスが別のアイテム等に移動したかキャンセルされた title "[機能は作って無いので表示だけ]" }else{//メニューが選択決定された //機能は作って無いので表示だけ notesel item_men noteget itemmen,im_i noteunsel title itemmen+" 名前:"+item_name(menu_tag_id)+" 種類:"+itemtype_name(item_type(menu_tag_id))+" [機能は作って無いので表示だけ]" } objsel menu_tag_id } }else{ //メニュー表示開始 hgGetAllWinObjPos itemwin_bg_id, mskpx, mskpy, sx,sy //アイテムメニューの背景座標を取得 hgGetAllWinObjPos menu_tag_id, px, py, sx,sy //メニュー元のアイテムボタン座標を取得 hgsetobjimageindex itemwin_msk_id,0,mskpx-px,mskpy-py //背景座標からボタン座標を引いてマスクテクスチャ参照座標にする hgWinObjValid itemwin_msk_id //メニュー表示中のマスクボタン表示 objprm itemwin_menu_id,-1 //メニューを非選択に hgWinObjValid itemwin_menu_id //メニュー用リストボックスを表示 hgWinObjValid itemwin_menu_button_id //メニュー補助ボタン表示 hgSetWinObjPos itemwin_menu_id,HGMOUSEX-1,HGMOUSEY-8,,20 //メニュー座標設定 hgSetWinObjPos itemwin_menu_button_id,HGMOUSEX-1,HGMOUSEY-8,,20 menu_on=1//メニュー表示中フラグ } return 0 //アイテムウィンドウタイトルバークリック *_itemwin_move if menu_on {//メニューが表示中なら閉じる menu_on=0 hgWinObjInvalid itemwin_msk_id hgWinObjInvalid itemwin_menu_button_id hgWinObjInvalid itemwin_menu_id } if HGMOUSE_MOVEX!0 or HGMOUSE_MOVEY!0 or itemwin_move_f{//ドラッグ開始 if itemwin_move_f=0 {//移動前だった itemwin_move_f=1 //有働開始フラグ hgGetAllWinObjPos itemwin_titlebar_id, px, py, sx,sy //現在のウィンドウ座標 inv_difx=px-HGMOUSEX //マウス座標との差分 inv_dify=py-HGMOUSEY }else{ getkey itemwin_move_f,1 //クリックが離されたらitemwin_move_fがクリアされる } }else{ if itemwin_move_f=0{//移動前だった getkey bt_clk,1 if bt_clk=0 {//ボタンが離された itemwin_off^1 //ウィンドウ表示非表示切替(0なら非表示) if itemwin_off {//ウィンドウ非表示 hgSetWinObjPos itemwin_titlebar_id,,,64,20 //タイトルバーを小さくする hgWinObjInvalid itemwin_bg_id //アイテムウィンドウ背景表示 repeat 4 hgWinObjInvalid typetab_id(cnt)//タイプタブ表示 hgWinObjInvalid pagetab_id(cnt) //ページタブ表示 loop repeat ITEM_TOTAL //アイテムボタン表示 hgWinObjInvalid ibid_list(cnt) loop }else{//ウィンドウ表示 hgSetWinObjPos itemwin_titlebar_id,,,ITEM_SIZE*ITEM_HMAX,20 //タイトルバーを元に戻す hgWinObjValid itemwin_bg_id //アイテムウィンドウ背景非表示 repeat 4 //タブ非表示 hgWinObjValid typetab_id(cnt) hgWinObjValid pagetab_id(cnt) loop repeat ITEM_TOTAL //アイテムボタン非表示 hgWinObjValid ibid_list(cnt) loop } } } } return
ウィンドウオブジェクトの子ウィンドウにして使用してるのでクリック時のジャンプや
チェックボックスに設定した変数が無反応になるので色々面倒かな・・・



暇人

リンク

2015/9/22(Tue) 22:23:14|NO.71857

リストボックスの項目毎に画像を付けてアイテム一覧にした画像
http://ux.getuploader.com/himajin130414/download/22/aitemlistbox.PNG


リストボックスを画像付きアイテム一覧にしてみるテスト
テンキーの + で所持アイテム追加
エンターで決定(タイトルにアイテムデータ表示するだけ)

#include "hgimg3.as" #include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude //hgobjimageで設定されてるテクスチャID取得 //「変数 = hggetobjimagetex(hgwinobjID)」 #define ctype global hggetobjimagetex(%1) hgbt_tex_id_list@mod_hgallwinobj((%1)*9) //hgobjimageで設定されてるテクスチャ参照座標を取得 //「hggetobjimageindex hgwinobjID,参照座標の種類,X座標,Y座標」 //参照座標の種類:0=常時 1=押し下げ時 2=マウスオーバー時 #define global hggetobjimageindex(%1,%2,%3,%4) %3=hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9+(%2)*2):%3=hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9+(%2)*2+1) //hgobjimageで設定されてるテクスチャIDを変更 //「hgsetobjimagetex hgwinobjID,テクスチャID」 #define global hgsetobjimagetex(%1,%2) hgbt_tex_id_list@mod_hgallwinobj(%1)=%2 //hgobjimageで設定されてるテクスチャ参照座標を変更 //hgsetobjimageindex hgwinobjID,カスタムボタンの参照座標1〜3が入ってる配列(2*3要素必要)」 #define global hgsetobjimageindex3(%1,%2) memcpy hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9),%2,24 //hgobjimageで設定されてるテクスチャ参照座標を変更 //hgsetobjimageindex hgwinobjID,参照座標の種類,X座標,Y座標」 //参照座標の種類:0=常時 1=押し下げ時 2=マウスオーバー時 #define global hgsetobjimageindex(%1,%2,%3,%4) hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9+(%2)*2)=%3,%4 #uselib "gdi32" #cfunc CreateRectRgn "CreateRectRgn" int, int, int, int #uselib "user32.dll" #func SetWindowRgn "SetWindowRgn" int, int, int screen 0,800,600 hgini buffer 3,16,16 color boxf settex ginfo_sx,ginfo_sy namebg_texid=stat gsel 0 setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode) texload dir_exe+"\\sample\\hgimg3\\fontchr.bmp" ; フォントテクスチャの登録 texload2 dir_exe+"\\hsptv\\hsptv_img.png" etctexid=stat texload2 dir_exe+"\\sample\\hgimg4\\res\\ball64.png" itemtexid=stat //アイテムデータ設定 repeat 64 igpx=(cnt\8)*64 igpy=(cnt/8)*64 item_tixy(cnt*6)= igpx, igpy, igpx-2, igpy-2,igpx, igpy //アイテム画像座標(objimageの x1,y1,x2,y2,x3,y3 と同じ) item_name(cnt)="アイテムID:"+strf("%03d",cnt) item_effect(cnt)="ID"+cnt+"の説明" loop //所持アイテム設定 dim item_list,100 dim itemstock_list,100 item_max=5 repeat item_max itemid=rnd(64) itemid_list(cnt)=itemid itemstock_list(cnt)=rnd(100)+1 loop ITEM_SIZE=64 ITEM_VMAX=8 //アイテム欄縦数 //アイテム選択用リストボックス作成(文字表示無しで機能だけを利用) font "MS ゴシック",ITEM_SIZE,16 //listboxの縦サイズはホントサイズが基準になるので設定しとく(今回はリストボックスには文字表示はしないけど) objsize 2,2 //適当なサイズ(後で必要なサイズに変更) list_txt="" //hgkistbox,hgcomboxのメッセージテクスチャは文字列指定が無くてもフォントサイズとobjsizeの横幅を基準に作られる pos 150,50 hglistbox list_index,,list_txt,2+4+256,0,$ff225599,$ff995599 listbox_id=stat hgSetWinObjPos listbox_id,,,400,ITEM_SIZE*ITEM_VMAX+ITEM_SIZE //必要サイズにする(フォントサイズと実際のサイズは違うことがあるので一つ分大きめに指定) //アイテム画像用ボタン作成 hgObjImage itemtexid, 0, 0, 0, 0, 0, 0, 0, 0, 0 pos 0,0 objsize 64,64,64 font "MS ゴシック",24,16 repeat ITEM_VMAX hgbutton gosub "",*_temp,2+4+8+64+256,,$ff000000 picibid_list(cnt)=stat hgSetParent picibid_list(cnt), listbox_id //リストボックスの子に設定 SetWindowRgn objinfo_hwnd(picibid_list(cnt)),CreateRectRgn(0,0,0,0),0 //マウス判定無し loop //アイテム名用ボタン作成 objsize 180,32,64 hgObjImage namebg_texid, 0, 0, 0, 0, 0, 0, 0, 0, 0 //カスタムボタンの方がモジュール内の処理が少ないので背景透明で利用 font "MS ゴシック",24,16+1 repeat ITEM_VMAX pos 64,0 hgbutton gosub " ",*_temp,2+4+8+64+256,$ffffffff,0 nameibid_list(cnt)=stat hgSetParent nameibid_list(cnt), picibid_list(cnt) //アイテム画像用ボタンの子に設定 SetWindowRgn objinfo_hwnd(nameibid_list(cnt)),CreateRectRgn(0,0,0,0),0 loop //アイテム説明用ボタン作成 pos 64,32 font "MS ゴシック",20,16 repeat ITEM_VMAX pos 64,32 hgbutton gosub " ",*_temp,2+4+8+64+256,$ffffffff,0 effibid_list(cnt)=stat hgSetAllWinObjStyle effibid_list(cnt),0x0000100 hgSetParent effibid_list(cnt), picibid_list(cnt) //アイテム画像用ボタンの子に設定 SetWindowRgn objinfo_hwnd(effibid_list(cnt)),CreateRectRgn(0,0,0,0),0 loop //アイテム個数用ボタン作成 objsize 64,64 font "MS ゴシック",20,16+1 repeat ITEM_VMAX pos 64+200+32,0 hgbutton gosub " ",*_temp,2+4+8+64+256,$ffffffff,0 stcibid_list(cnt)=stat hgSetParent stcibid_list(cnt), picibid_list(cnt) //アイテム画像用ボタンの子に設定 SetWindowRgn objinfo_hwnd(stcibid_list(cnt)),CreateRectRgn(0,0,0,0),0 loop //アウテム一覧を開くボタン作成 objsize 80,24 font "MS ゴシック",14,16+1 hgObjImage -1 pos 32,32 hgbutton gosub "アイテム",*_itemlist_open,2+64,$ff0000ff itemlistopen_id=stat objsel itemlistopen_id //開くボタン用カーソル作成 pos -20,0 objsize 32,32 hgObjImage etctexid, 32*15, 64, 32*15, 64, 32*15, 64, 0, 0, 0 hgbutton gosub "",*_temp,2+4+8+64 cursor_id=stat hgSetParent cursor_id, itemlistopen_id//開くボタンの子に設定 //リストボック用カーソル作成 hgbutton gosub "",*_temp,2+4+8+64+256 cursor_id2=stat hgSetParent cursor_id2, listbox_id //リストボックスの子に設定 clscolor $4444 repeat stk_b=stk stick stk,$ff if stk=128 and stk_b=0{ if itemlist_on {gosub *_itemlist_open}else{end} } hgdraw p_bak=p getkey p,107 if p=1 and p_bak=0 {//テンキーの + で所持アイテム追加 list_topindex_bak=list_topindex+ITEM_VMAX list_txt+"\n" //リストボックスに殻の改行を追加 objprm listbox_id,list_txt //リストボックsに反映 objprm listbox_id,list_index //リストックすの背選択中を反映 itemid=rnd(64) //適当なアイテムID itemid_list(item_max)=itemid //リストに追加 itemstock_list(item_max)=rnd(100)+1 //個数をリストに追加 item_max++ //所持数追加 if itemlist_on {itemlist_on=2:hgWinObjInvalid cursor_id2} //アイテム一覧が表示中なら追加したフラグセット } if itemlist_on {gosub *_itemlist} objsel -1 if stat>=0 { id=stat if id=listbox_id {//リストボックスにフォーカスが合ってる if stk&32 {//エンターが押された SetWinObjPos cursor_id2,-16+2,(list_index-list_topindex)*64+16+2 itemid=itemid_list(list_index) title ""+strf("名前:%s 効果:%s",item_name(itemid),item_effect(itemid)) }else{ SetWinObjPos cursor_id2,-16+(cnt/10)\2,(list_index-list_topindex)*64+16+(cnt/10)\2 } } if id=itemlistopen_id {//アイテム一覧を開くボタンにフォーカスが合ってる if itemlist_on=0 {//一覧が閉じてる if stk&32 {//エンターが押された SetWinObjPos cursor_id,-20+2,-16+2 //離されたときにジャンプするのでカーソルだけ処理 }else{ if stk_b&32 {//エンターが離された hgWinObjArgb cursor_id, 1,$88000000 //カーソル半透明 gosub *_itemlist_open //一覧オープン処理にジャンプ }else{ SetWinObjPos cursor_id,-20+(cnt/10)\2,-16+(cnt/10)\2 //カーソルアニメーション(位置をずらしてるだけ) } } } } }else{ if ginfo_act>=0 { if itemlist_on=0 { objsel itemlistopen_id }else{ objsel listbox_id } } } hgAllWinObjDraw //hgAllWinObjを描画 actid=stat //フォーカスが合ってるhgAllWinObjID hgsync 16 loop stop *_itemlist sendmsg objinfo_hwnd(listbox_id), $018E,0,0 // LB_GETTOPINDEX($018E) list_topindex=stat if list_topindex_bak ! list_topindex { if list_index<list_topindex or list_index>=(list_topindex+ITEM_VMAX) { if cursor2_off=0 { cursor2_off=1 hgWinObjInvalid cursor_id2 } }else{ if cursor2_off=1 { cursor2_off=0 hgWinObjValid cursor_id2 } } if list_topindex>list_topindex_bak { loop_max=limit(list_topindex-list_topindex_bak,0,ITEM_VMAX)//表示トップインデックスの変化分をループ回数にする(但し表示最大数以内) topindex=list_topindex+ITEM_VMAX-loop_max //現在のトップインデックスに表示最大数を足してループ回数を引いて更新するアイテムリストインデックにする index=ITEM_VMAX-loop_max //表示最大数からループ回数絵を引いて表示インデックスにする repeat loop_max,topindex _cnt=cnt\ITEM_VMAX SetWinObjPos picibid_list(_cnt), 0,index*64 //アイテムボタン座標設定 itemid=itemid_list(cnt) hgsetobjimageindex3 picibid_list(_cnt),item_tixy(itemid*6) objprm nameibid_list(_cnt), item_name(itemid) objprm effibid_list(_cnt), item_effect(itemid) objprm stcibid_list(_cnt), itemstock_list(cnt) index++ loop }else{ index=0 loop_max=limit(list_topindex_bak-list_topindex,0,ITEM_VMAX) loop_max=limit(loop_max,0,item_max-list_topindex) repeat loop_max,list_topindex _cnt=cnt\ITEM_VMAX SetWinObjPos picibid_list(_cnt), 0,index*64 //アイテムボタン座標設定 itemid=itemid_list(cnt) hgsetobjimageindex3 picibid_list(_cnt),item_tixy(itemid*6) objprm nameibid_list(_cnt), item_name(itemid) objprm effibid_list(_cnt), item_effect(itemid) objprm stcibid_list(_cnt), itemstock_list(cnt) index++ loop if itemlist_on ! 1 {//1以外ならアイテム表示中更新 itemlist_on=1 //アイテム表示中更新したフラグ repeat loop_max,list_topindex _cnt=cnt\ITEM_VMAX hgWinObjValid picibid_list(_cnt) hgWinObjValid nameibid_list(_cnt) hgWinObjValid effibid_list(_cnt) hgWinObjValid stcibid_list(_cnt) loop hgWinObjValid cursor_id2 } } list_topindex_bak=list_topindex } return *_itemlist_open if itemlist_on=0 {//アイテム一覧が閉じられてる list_topindex_bak=list_topindex+ITEM_VMAX hgWinObjValid listbox_id notesel list_txt if item_max ! notemax { if item_max > notemax { repeat item_max - notemax list_txt+"\n" loop }else{ list_txt=strmid(list_txt,0,item_max*2) } objprm listbox_id,list_txt } noteunsel gosub *_itemlist objsel listbox_id if list_index<0 {objprm listbox_id,0}else{objprm listbox_id,list_index} }else{//アイテム一覧が開いている itemlist_on=0 hgWinObjInvalid cursor_id2 hgWinObjInvalid listbox_id repeat ITEM_VMAX hgWinObjInvalid picibid_list(cnt) hgWinObjInvalid nameibid_list(cnt) hgWinObjInvalid effibid_list(cnt) hgWinObjInvalid stcibid_list(cnt) loop objsel itemlistopen_id hgWinObjArgb cursor_id, 1,$ff000000 } return *_temp return



暇人

リンク

2015/9/23(Wed) 12:28:34|NO.71867

編集可能なコンボボックスの画像
http://ux.getuploader.com/himajin130414/download/23/combinput.PNG

hgcomboxの子にhginputを設定して
編集追加可能なコンボボックスにしてみるテスト

インプット内クリックで編集開始
エンターで編集内容をリストに反映
コントロール+エンターでインプット内容をリストに追加

#include "hgimg3.as" #include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude #uselib "user32" #func GetWindowText "GetWindowTextA" int, var, int hgini font "MS ゴシック",24,16 objsize 256,24 //表示Yサイズはフォントサイズが基準になる pos 100,100 comblist="HSP\nHGIMG3\nあいうえお\nアイウエオ" hgcombox combindex,500,comblist,,$ffffffff,$ffbb88bb,$ffdd88dd //想定される項目追加に応じて拡張Yサイズを設定(objsizeのYサイズでも可) cbid=stat hgGetAllWinObjPos cbid, p_px, p_py, p_sx, p_sy //hgcomboxの表示サイズを取得 sdim input_buf,1024 notesel comblist noteget input_buf,combindex noteunsel pos 2,2 //hgcomboxのの子にするので相対座標を設定 hginput input_buf,p_sx-18, p_sy-4 //hgcomboxサイズから枠とドロップダウンボタンのサイズを引いて指定 枠を半透明設定の透明度0 ipid=stat hgsetinput ipid,HGINPUT_MODE,4 //枠非表示 hgSetParent ipid, cbid ///hginputをhgcomboxの子に設定 //hginputの色変更 hgsetinput ipid,HGINPUT_RGB_GMODE,$dd88dd //インプットの文字色 hgsetinput ipid,HGINPUT_SEL_RGB_GMODE ,$ff8888 //インプット内選択中文字色 hgsetinput ipid,HGINPUT_SELBG_RGB_GMODE,$8888 //インプット内選択中背景色 title ""+combindex+" "+input_buf clscolor $3333 repeat stick stk,$fff-32-128 //EnterとEscは押した時だけ if stk&128 :end // [ESC]で終了 hgdraw //選択中項目をインプットに反映 if combindex ! combindex_bak {//コンボボックスの選択項目が変わった combindex_bak=combindex notesel comblist noteget comstr,combindex noteunsel objprm ipid,comstr objsel ipid title ""+combindex+" "+comstr } //インプット内容を選択中項目に反映 if (stk&32)>0 and ime="" {//エンターが押されてIME内に文字列が無いなら notesel comblist GetWindowText objinfo(ipid,2),input_buf,63 noteadd input_buf,combindex,(stk&64)=0 noteunsel objprm cbid,comblist objprm cbid,combindex title ""+combindex+" "+input_buf } hgAllWinObjDraw //hgAllWinObjを描画 actid=stat //フォーカスが合ってるhgAllWinObjID ime=refstr //IME内に文字列 hgsync 16 loop



暇人

リンク

2015/9/27(Sun) 13:05:03|NO.71987

NO.71808とNO.71857に書いたマクロに間違いがありました
>#define ctype global hggetobjimagetex(%1) hgbt_tex_id_list@mod_hgallwinobj((%1)*9)


#define global ctype hgGetObjImageTex(%1) hgbt_tex_id_list@mod_hgallwinobj(%1)
にして下さい



ONION software Copyright 1997-2023(c) All rights reserved.