|
|
|
2023/12/22(Fri) 14:25:19|NO.100905
こんにちは、お世話になります。
先日はありがとうございました。だいぶ形が見えてきました。
最初から詳細を書いたほうが良いと思い、
思い当たるところを全て書きました。長くなります申し訳ありません。
【やりたい事】
1.背景に画像を表示させる
2.画像の上に図形(□)を動的に追加できる(新規作成、拡縮、移動が出来る)
3.固有のID(作成時の数値でOK)、図形の情報(サイズ、X,Yの位置、色、太さ)、
現在選択していた画像の情報を保持
4.上記内容はリストビューに表示させる(最終的には出力可能にする)
5.画像は現在選択している画像。ダイアログボックスで変更する【未実装】
6.画像を切り替えたら図形(□)は全て消え、同じ画像背景に設定しているものの
図形(□)が動的に表示される【未実装】
7.文字色、太さも動的に変更できる
・
→1つずつゆっくり段階的に作っていこうと思っています。
クリッカブルマップの枠作成支援ツールみたいなイメージです。
【現段階できていること】
1.とりあえず同じ場所にある「1.jpeg」の表示
2.図形(□)を動的に追加できる(新規作成、拡縮、移動が出来る)
3.リストにデータ表示(サイズ、XYの位置のみ)
※moveなどmousex等の値をdoubleにして頂いていたのですが、表示が気になりintに変更しました
【現段階で困っている事】
・1回画面をクリックしないと、画像と図形(□)が表示されない
goto *clicknowで飛ばしているはずだけど表示されない。
リストビューには表示されている為、画面上に表示されないだけ?
・頂いたソースコードを改変して積み上げていっているため、
自分で新たに作った「#modfunc create」や、
情報取得のためだけに作った「#modcfunc get_left」などが良いのかどうか分からないです。
あまり良くない作りだったりしますでしょうか?
#include "a2d.hsp";Artlet2D
#include "listview.as";リストビュー 「むしゃぺらり の HSP ページ」のものを利用
;=====================================
;図形管理モジュール mod_object
#module mod_object m_left,m_top,m_width,m_height,m_penwidth
#modinit
;モジュール変数初期化
m_left=0
m_top =0
m_width=100
m_height=100
m_penwidth=5
return
#modfunc local create int create_x,int create_y
m_left=create_x ;create時のleftをマウス位置に
m_top=create_y;create時のtopをマウス位置に
return
#modcfunc get_left
return m_left
#modcfunc get_top
return m_top
#modcfunc get_width
return m_width
#modcfunc get_height
return m_height
#modfunc local update
;描画処理
alPenWidth m_penwidth
alColor 255, 0, 0
alDrawRect m_left,m_top,m_width,m_height
return
#modfunc local move int _mousex,int _mousey
m_left=_mousex ;移動処理
m_top=_mousey
return
#modfunc local resize
m_width = mousex - m_left ;リサイズ処理
m_height = mousey - m_top
return
#modfunc local hitcheck int _mousex,int _mousey,array _hit
;ヒットチェック処理
;どこをクリックしたかも記憶
;_hit=0f,0f,0f
_hit=0,0,0
if _mousex>=m_left{
if _mousey>=m_top{
if _mousex<=(m_left+m_width) {
if _mousey<=(m_top+m_height){
_hit.0= 1
_hit.1 = _mousex - m_left
_hit.2 = _mousey - m_top
}
}
}
}
return _hit
#global
;==========================================================
;メインプログラム
screen 0,640,800;ウィンドウ自体のサイズ
;button gosub "new",*newobject ;ボタン作成
button gosub "create",*createobject ;ボタン作成[作成]
button gosub "move",*moveobject ;ボタン作成[移動]
button gosub "resize",*resizeobject ;ボタン作成[サイズ変更]
dimtype objects,vartype("struct"),0 ;モジュール型変数初期化(objects)
newmod objects,mod_object ;1個新規作成
current_obj=-1 ;選択用の変数初期化(-1)未選択
create_move_resize=0 ;create:1,move:2,resize:3
hit=0f,0f,0f
;==========================================================
pos 0,600
objsize 640 // 大きさ(横サイズ用)
; リストビューを設定
pos 0,600 : listview 640, 200, 1
; カラムの設定
listaddc "ID", 0, 100
listaddc "X" , 1, 100
listaddc "Y" , 2, 100
listaddc "W" , 3, 100
listaddc "H" , 4, 100
listaddc "TEST" , 5, 100
goto *clicknow
*clicknow
redraw 0 ;描画停止
alCreateImage 0, 640, 800 ;Artlet2Dのクリア
if stat = -1 : dialog "GDI+ を初期化できませんでした。" : end
color 255,255,255
boxf ;メイン画面クリア
alLoadFile "1.jpeg" ; 画像ファイルロード
stick keys,256
if (keys&256){ ;ドラッグ中
if current_obj=-1{ ;対象を未選択なら
//マウス位置でヒットチェック
foreach objects
hitcheck@mod_object objects(cnt),mousex,mousey,hit
if hit(0)=1f{//ヒットした
current_obj=cnt ;選択対象を保存
break
}
loop
}
if create_move_resize=1{;else if create_move_resize=1{;create状態だったら
newmod objects,mod_object
current_obj = length(objects)-1
create@mod_object objects(current_obj),mousex,mousey
create_move_resize=3
}
}else{ ;ドラッグしていないなら
current_obj=-1 ;未選択にする
//全オブジェクトの描画
listdel -1;リストを一旦クリアする
foreach objects
X=str(get_left(objects(cnt)))
Y=str(get_top(objects(cnt)))
W=str(get_width(objects(cnt)))
H=str(get_height(objects(cnt)))
listadd str(cnt),-1, 0
listadd X ,stat, 1
listadd Y,stat, 2
listadd W ,stat, 3
listadd H,stat, 4
listadd "TEST",stat,5
loop
goto *clickwait
}
if current_obj>-1{ ;対象が選択されているなら図形移動
if create_move_resize=2 {
;図形の移動
move@mod_object objects(current_obj),mousex-hit(1),mousey-hit(2)
}else{
if create_move_resize=3{
;図形のリサイズ
resize@mod_object objects(current_obj)
}
}
}
//全オブジェクトの描画
foreach objects
;図形の描画
update@mod_object objects(cnt)
loop
alCopyImageToScreen 0, 0 ; 仮想イメージから HSP screen に画像転送
;デバッグ確認用
pos 100,0
color 0,0,0
mes "current_obj:"+current_obj
mes "hit(0):"+hit(0);ヒットフラグ
mes "hit(1):"+hit(1);ヒットした相対x
mes "hit(2):"+hit(2);ヒットした相対y
redraw 1
await 60
goto *clicknow
*clickwait
onclick goto *clicknow
stop
;=============================================================
;ボタン押した処理(新規作成)
*newobject
newmod objects,mod_object
return
;=============================================================
;button gosub "create",*createobject ;ボタン作成[作成]
*createobject ;create:1,move:2,resize:3
create_move_resize=1
return
;=============================================================
;button gosub "move",*moveobject ;ボタン作成[移動];
*moveobject ;create:1,move:2,resize:3
create_move_resize=2
return
;=============================================================
;button gosub "resize",*resizeobject ;ボタン作成[サイズ変更]
*resizeobject ;create:1,move:2,resize:3
create_move_resize=3
return
| |
|
2023/12/22(Fri) 19:04:27|NO.100906
>>・1回画面をクリックしないと、画像と図形(□)が表示されない
goto *clicknowで飛ばしているはずだけど表示されない。
リストビューには表示されている為、画面上に表示されないだけ?
goto *clickwait;←146行目 これがダメな希ガス⇒削除
>>・頂いたソースコードを改変して積み上げていっているため、自分で新たに作った「#modfunc create」や、情報取得のためだけに作った「#modcfunc get_left」などが良いのかどうか分からないです。 あまり良くない作りだったりしますでしょうか?
そこはいいのではないでしょうか。
>>追伸
リストビューがチラつきますが、おそらく毎フレームで全削除して全追加しているためかなと思います。
図形を移動完了した時、サイズ変更完了した時など、フラグ管理でリストビューを更新したほうがいいのではと思いました🐷
|
|
2023/12/23(Sat) 00:35:35|NO.100911
こんにちわ。
>値をdoubleにして頂いていたのですが、表示が気になりintに変更しました
表示だけの問題ならキャストか書式付にすると良いですよ。
kazu = 12.345
mes kazu; そのまま
mes int(kazu); キャスト
mes strf("kazu=%d", kazu); 書式付き整数
mes strf("kazu=%.1f", kazu); 書式付き実数
モジュールは気にならないですが、
goto,gosubが色々ありサブルーチンが複雑なので、logmes "〇〇処理"などラベルの下にかいて、
"Debugウインドウ表示"で処理の流れを見てみると良いかと思いました。
メインループで動かすタイプっぽく見えるのですが、(*clicknowがループしている)
多岐に分岐しており複雑なのでlogmesを参考に紙にフローを書いてみるとわかるかと思います。
1)クリックしない限りは、描画せずに*clicknowに戻ってしまうので処理が進まない問題。
2)ボタンが表示されていないので、Windowsに処理が戻ってない(waitやstopを挟まず∞ループしている。1が原因)
3)常にArtlet2Dのスクリーンを初期化してる問題。
が見えてくると思います。
部分抜粋ですが、どうぞ。
logmes "初期化"
alCreateImage 0, 640, 800 ;★Artlet2Dの×クリア 〇初期化
alCreateImage 1, 640, 800 ;★Artlet2Dの×クリア 〇初期化
alColor 255,255,255:alFillRect 0,0,640,800; ★白でクリア
alLoadFile "1.jpeg" ; ★画像ファイルロードを別のバッファにする1
goto *clicknow
*clicknow
logmes "今クリック"
redraw 0 ;描画停止
;color 255,255,255
;boxf ;メイン画面クリア
alSelectImage 0 ; ★メイン画面は0とする
alCopyImageToImage 1, 0,0,0,640,480 ; ★画像でメイン画面をクリア
stick keys,256
;---------------------------------------------
if (keys&256){ ;ドラッグ中
if current_obj=-1{ ;対象を未選択なら
//マウス位置でヒットチェック
foreach objects
hitcheck@mod_object objects(cnt),mousex,mousey,hit
if hit(0)=1f{//ヒットした
current_obj=cnt ;選択対象を保存
break
}
loop
}
if create_move_resize=1{;else if create_move_resize=1{;create状態だったら
newmod objects,mod_object
current_obj = length(objects)-1
create@mod_object objects(current_obj),mousex,mousey
create_move_resize=3
}
}else{ ;ドラッグしていないなら
current_obj=-1 ;未選択にする
//全オブジェクトの描画
;goto *clicknow ; ★ここで処理が止まってしまう。
}
| |
|
2023/12/23(Sat) 16:46:45|NO.100915
>あまり良くない作りだったりしますでしょうか?
モジュールは問題感じなかったので、どちらかというと状態管理のフローが問題があるように思いました。
いろいろなデザインパターンはありますが、ツール類はステート(状態)で分岐するようにして、
goto,gosubが複雑に絡み合わないようにすると宜しいのではないでしょうか。
(buhioさんが仰られるフラグ管理と同じ意味合いかと思います)
と言うわけで、機能足りないですがフローが分かるものを用意しました。
あくまで参考程度で、一例ですがどうぞ。
※やりたい事の理想が明確なので(良い事ですね)少し長くなってしまいましたすみません。
; ↓ここから下は四角描画用のおまじない。今回重要では無いので無視。
#module __SHAPE__
#uselib "GDI32.DLL"
#cfunc global Stock "GetStockObject" sptr
#cfunc global Pen "CreatePen" sptr,sptr,sptr
#cfunc global Brush "CreateSolidBrush" sptr
#cfunc global Sel "SelectObject" sptr,sptr
#func global Del "DeleteObject" sptr
#func global DrawBox "Rectangle" sptr,sptr,sptr,sptr,sptr
#uselib "USER32.DLL"
#func global DrawText "DrawTextA" sptr,sptr,sptr,var,sptr
#define ctype RGB2BGR(%1) (((%1&0xFF)<<16)|((%1&0xFF00))|((%1&0xFF0000)>>16))
; ------------------------------------------------
; boxshape 右, 上, 左, 下, 太さ, 線色, 塗色, 文字, オプション
; 太さ-1で点線。 色は-1で透明。 文字色は通常のcolor か rgbcolorで指定。
; オプション 0:左 1:中 2:右 16:自動改行 32768: はみ出し時に省略記号
#define global boxshape(%1=0,%2=0,%3=ginfo_winx,%4=ginfo_winy,%5=1,%6=-1,%7=-1,%8="",%9=0) \
_boxshape %1,%2,%3,%4,%5,%6,%7,%8,%9
#deffunc _boxshape int _l, int _t, int _r, int _b, int w, int pc, int bc, str txt, int opt
l=_l:t=_t:r=_r:b=_b:if l>r { l^=r:r^=l:l^=r }:if t>b { t^=b:b^=t:t^=b }
rect = l+w, t+w, r-w, b-w
if pc<0 { hPen = Stock(8) } else { hPen = Pen((w<0)|((w>0)*6), w, RGB2BGR(pc)) }
if bc<0 { hBrush = Stock(5) } else { hBrush = Brush(RGB2BGR(bc)) }
hOldPen = Sel(hdc, hPen) : hOldBrush = Sel(hdc, hBrush)
DrawBox hdc, l, t, r, b
Del Sel(hdc, hOldPen) : Del Sel(hdc, hOldBrush)
if txt!="" { DrawText hdc, txt, strlen(txt), rect, opt}
return
#define global ctype RGB(%1,%2,%3) (%1<<16|%2<<8|%3)
#global
; ↑ここから上は四角描画用のおまじない。今回重要では無いので無視。
; ===============================================
; シェイプモジュール変数 ※モジュール変数はお分かりになると思うのでこちらは特に説明無し
#module mod_shape m_l,m_t,m_r,m_b,m_w,m_sc,m_fc,m_txt,m_tc,m_align
; 初期化
#modinit int _l, int _t, int _r, int _b, int _w, int _sc, int _fc, str _txt
m_l = _l : m_t = _t : m_r = _r : m_b = _b
if m_l > m_r { m_l ^= m_r : m_r ^= m_l : m_l ^= m_r }
if m_t > m_b { m_t ^= m_b : m_b ^= m_t : m_t ^= m_b }
m_w = _w : m_sc = _sc : m_fc = _fc
m_txt = _txt : m_tc = 0 : m_align = 0
return
; 追加
#deffunc addShape array _shape, int _l, int _t, int _r, int _b, int _w, int _sc, int _fc, str _txt
newmod _shape, mod_shape, _l, _t, _r, _b, _w, _sc, _fc, _txt : return
; 削除
#deffunc delShape var _shape
delmod _shape : return
; 移動
#modfunc moveShape int _x, int _y
m_l += _x : m_t += _y : m_r += _x : m_b += _y : return
#modfunc resizeShape int _x, int _y, int _c, int _s
if _c = 1 { m_l = limit(m_l+_x,,m_r-_s) : m_t = limit(m_t+_y,,m_b-_s) }
if _c = 2 { m_r = limit(m_r+_x,m_l+_s,) : m_t = limit(m_t+_y,,m_b-_s) }
if _c = 3 { m_r = limit(m_r+_x,m_l+_s,) : m_b = limit(m_b+_y,m_t+_s,) }
if _c = 4 { m_l = limit(m_l+_x,,m_r-_s) : m_b = limit(m_b+_y,m_t+_s,) }
return
; 太さ
#modfunc setStrokeWidthOfShape int _w
if _w <= 0 { m_w = 1 : m_sc = -1 } else { m_w = _w } return
; 線色
#modfunc setStrokeColorOfShape int _color
m_sc = _color : return
; 塗色
#modfunc setFillColorOfShape int _color
m_fc = _color : return
; 文字色
#modfunc setTextColorOfShape int _color
m_tc = _color : return
; 文字
#modfunc setTextOfShape str _txt, int _align
m_txt = _txt : m_align = _align : return
; 描画
#modfunc drawShape int _s
rgbcolor m_tc
boxshape m_l, m_t, m_r, m_b, m_w, m_sc, m_fc, m_txt, m_align|16
if _s { drawHighlightShape thismod, _s }
return
#modfunc drawHighlightShape int _s
boxshape m_l-2, m_t-2, m_r+2, m_b+2, -1, 0xFFFFFF, -1
boxshape m_l-1, m_t-1, m_r+1, m_b+1, -1, 0x000000, -1
boxshape m_l, m_b-_s, m_l+_s, m_b, 1, 0, 0xFFFFFF
boxshape m_r-_s, m_b-_s, m_r, m_b, 1, 0, 0xFFFFFF
boxshape m_r-_s, m_t, m_r, m_t+_s, 1, 0, 0xFFFFFF
boxshape m_l, m_t, m_l+_s, m_t+_s, 1, 0, 0xFFFFFF
return
; 情報
#modfunc drawInfoOfShape
color 255,255,255 : objcolor 0,0,0
mes strf("座標 :X %4d, Y %4d", m_l, m_t),4
mes strf("サイズ:W %4d, H %4d", m_r-m_l, m_b-m_t),4
mes strf("太さ :W %4d", m_w),4
mes strf("色 :S #%06X, F #%06X, T #%06X", m_sc, m_fc, m_tc),4
return
; 当り
#modcfunc isOnShape int _x, int _y
if (m_l<=_x) & (_x<=m_r) & (m_t<=_y) & (_y<=m_b) { return 1 } else { return 0 }
#modcfunc isOnCornerShape int _x, int _y, int _s
if (m_l<=_x) & (_x<=m_l+_s) & (m_t<=_y) & (_y<=m_t+_s) { return 1 } ; 左上
if (m_r-_s<=_x) & (_x<=m_r) & (m_t<=_y) & (_y<=m_t+_s) { return 2 } ; 右上
if (m_r-_s<=_x) & (_x<=m_r) & (m_b-_s<=_y) & (_y<=m_b) { return 3 } ; 右下
if (m_l<=_x) & (_x<=m_l+_s) & (m_b-_s<=_y) & (_y<=m_b) { return 4 } ; 左下
return 0
#global
; 定数 ※本当はdefine,const,enumで定義すると良い
; -----------------------------------------------
; スクリーン
ID_SCREEN_MAIN = 0 ; メインスクリーン
ID_SCREEN_TOOL = 1 ; ツールスクリーン
ID_BUFFER_IMAGE= 2 ; 画像用バッファ
; 編集状態 ※本当はもっと状態を分ける必要があるが今回は簡易(待機開始、待機中、待機終了など)
EDIT_STATE_STRINGS = "待機","追加","移動","変更","削除","取消","スクロール"
EDIT_STATE_WAIT = 0 ; 待機
EDIT_STATE_ADD = 1 ; 追加
EDIT_STATE_MOVE = 2 ; 移動
EDIT_STATE_SIZE = 3 ; 変更
EDIT_STATE_DEL = 4 ; 削除
EDIT_STATE_CANSEL = 5 ; 取消
EDIT_STATE_SCROLL = 6 ; スクロール
EDIT_CORNER_SIZE= 16; 角の判定サイズ
; アプリ初期化 ※画面の準備をしておく
; -----------------------------------------------
*L_APP_INIT
; ウインドウ
_ = ginfo_dispx, ginfo_dispy
screen ID_SCREEN_MAIN, _.0, _.1, screen_normal,,, 640, 480 : title "アプリ"
screen ID_SCREEN_TOOL, 160, 480, screen_tool : title "ツ−ル"
buffer ID_BUFFER_IMAGE, 640, 480, screen_normal
; 新しいファイルを用意 ※ここら辺はツールに合わせてデータをどのタイミングで作るか考える
gosub *L_NEW_FILE
; ボタン ※ツール用のウインドウにボタン配置した方が更新管理楽かもしれません
gsel ID_SCREEN_TOOL
objsize 160,24,24
mes "ファイル"
button gosub "新規", *L_NEW_FILE
button gosub "保存", *L_SAVE_FILE: objenable stat, 0
mes "背景"
button gosub "画像", *L_LOAD_IMAGE
mes "図形"
input stroke_width
obj_stroke_width = stat
button gosub "太さ", *L_STROKE_WIDTH
button gosub "線色", *L_STROKE_COLOR
button gosub "塗色", *L_FILL_COLOR
mes "文字"
mesbox text_input, 160,120, 5,0
obj_text_input = stat
combox text_align, 150, "左寄せ\n中寄せ\n右寄せ"
obj_text_algin = stat
button gosub "入力", *L_TEXT_INPUT
button gosub "色", *L_TEXT_COLOR
; アプリメインループ ※操作と描画を分けて考える。
; -----------------------------------------------
*L_APP_MAIN
gosub *L_APP_CONTROL
gosub *L_APP_DRAW
await 16
goto *L_APP_MAIN
; アプリ操作
; -----------------------------------------------
*L_APP_CONTROL
if ginfo_act!=ID_SCREEN_MAIN : return
mouseabsx = ginfo_vx+mousex : mouseabsy = ginfo_vy+mousey
; 当たり判定
current_shape = -1
foreach shape
if isOnShape(shape(cnt), mouseabsx, mouseabsy) { current_shape = cnt }
loop
; マウス処理 ※クリックを段階的に考えて処理
getkey key, 1 : click_l = click_l<<1|key&3
getkey key, 2 : click_r = click_r<<1|key&3
if click_l = 1 : gosub *L_CLICK_LEFT_ON
if click_l = 2 : gosub *L_CLICK_LEFT_OFF
if click_l = 3 : gosub *L_CLICK_LEFT_DRAG
if click_r = 1 : gosub *L_CLICK_RIGHT_ON
if click_r = 2 : gosub *L_CLICK_RIGHT_OFF
if click_r = 3 : gosub *L_CLICK_RIGHT_DRAG
return
; マウスクリック ※状態に合わせて処理をする(本当は状態管理はifよりswitchで分岐した方が見通しが良い)
; -----------------------------------------------
*L_CLICK_LEFT_ON
stt_px = mouseabsx : stt_py = mouseabsy
end_px = mouseabsx : end_py = mouseabsy
if edit_state = EDIT_STATE_WAIT & current_shape < 0 {
edit_state = EDIT_STATE_ADD
edit_current = -1
}
if edit_state = EDIT_STATE_WAIT & current_shape >= 0 {
edit_current = current_shape
current_corner = -1
current_corner = isOnCornerShape(shape(edit_current), mouseabsx, mouseabsy, EDIT_CORNER_SIZE)
if current_corner > 0 {
edit_state = EDIT_STATE_SIZE
edit_corner = current_corner
} else {
edit_state = EDIT_STATE_MOVE
}
}
return
*L_CLICK_LEFT_DRAG
mov_px = mouseabsx-end_px : mov_py = mouseabsy-end_py
end_px = mouseabsx : end_py = mouseabsy
if edit_state = EDIT_STATE_MOVE {
moveShape shape(edit_current), mov_px, mov_py
}
if edit_state = EDIT_STATE_SIZE {
resizeShape shape(edit_current), mov_px, mov_py, edit_corner, EDIT_CORNER_SIZE
}
return
*L_CLICK_LEFT_OFF
if edit_state = EDIT_STATE_ADD {
if abs(end_px-stt_px) > EDIT_CORNER_SIZE & abs(end_py-stt_py) > EDIT_CORNER_SIZE {
addShape shape, stt_px, stt_py, end_px, end_py, stroke_width, stroke_color, fill_color, ""
}
}
edit_state = EDIT_STATE_WAIT
return
*L_CLICK_RIGHT_ON
if edit_state = EDIT_STATE_WAIT & current_shape >= 0 {
edit_state = EDIT_STATE_DEL
edit_current = current_shape
}
if edit_state = EDIT_STATE_WAIT & current_shape < 0 {
edit_state = EDIT_STATE_SCROLL
scroll_px = ginfo_vx : scroll_py = ginfo_vy
mx = ginfo_mx : my = ginfo_my
}
return
*L_CLICK_RIGHT_DRAG
if edit_state = EDIT_STATE_DEL & edit_current != current_shape {
edit_state = EDIT_STATE_CANSEL
}
if edit_state = EDIT_STATE_CANSEL & edit_current = current_shape {
edit_state = EDIT_STATE_DEL
}
if edit_state = EDIT_STATE_SCROLL {
groll scroll_px+(mx-ginfo_mx), scroll_py+(my-ginfo_my)
}
return
*L_CLICK_RIGHT_OFF
if edit_state = EDIT_STATE_DEL & edit_current = current_shape {
delShape shape(edit_current)
edit_current = -1
current_shape = -1
}
edit_state = EDIT_STATE_WAIT
return
; アプリ描画
; -----------------------------------------------
*L_APP_DRAW
gsel ID_SCREEN_MAIN : title ""+EDIT_STATE_STRINGS(edit_state)
redraw 0 : rgbcolor 0xFFFFFF : boxf
; 背景
pos 0, 0 : celput ID_BUFFER_IMAGE
; シェイプ
foreach shape : drawShape shape(cnt), (edit_current=cnt)*EDIT_CORNER_SIZE : loop
; 追加中の線
if edit_state=EDIT_STATE_ADD {
boxshape stt_px+1, stt_py+1, end_px-1, end_py-1, -1, 0
boxshape stt_px, stt_py, end_px, end_py, -1, 0xFFFFFF
}
; インフォ
pos ginfo_vx+8, ginfo_vy+8 : color 255,255,255 : objcolor 0,0,0
if edit_state=EDIT_STATE_ADD {
mes strf("座標 :X %4d, Y %4d", stt_px, stt_py),4
mes strf("サイズ:W %4d, H %4d", end_px-stt_px, end_py-stt_py),4
}
if edit_state = EDIT_STATE_SCROLL {
mes strf("スクロール :X %4d, Y %4d", ginfo_vx, ginfo_vy),4
} else {
if edit_current >= 0 { drawInfoOfShape shape(edit_current)}
}
redraw 1
return
; 新しいファイル ※これもモジュールで管理しておくと楽だが今回は行わない
; -----------------------------------------------
*L_NEW_FILE
buffer ID_BUFFER_IMAGE, 640, 480, screen_normal
image_path = ""
edit_state = 0
edit_current = -1
stroke_width = 4
stroke_color = 0x4f79ee
fill_color = 0xcbd9f8
text_color = 0x4f79ee
text_color = 0
text_input = "文字を入力"
text_align = 1
dimtype shape, vartype("struct")
; オブジェクトリセット
gsel ID_SCREEN_TOOL
if obj_stroke_width > 0 { objprm obj_stroke_width, stroke_width }
if obj_text_input > 0 { objprm obj_text_input, text_input }
if obj_text_algin > 0 { objprm obj_text_algin, text_align }
return
; 保存
; -----------------------------------------------
*L_SAVE_FILE ; TODO:
return
; 画像読み込み
; -----------------------------------------------
*L_LOAD_IMAGE
dialog "bmp;*.gif;*.jpg;*.png;*.psd",16,"画像ファイル" : if stat {
image_path = refstr
celload image_path, ID_BUFFER_IMAGE : gsel ID_BUFFER_IMAGE
_ = limit(ginfo_sx,ginfo_dispx), limit(ginfo_sy,ginfo_dispy)
screen ID_SCREEN_MAIN, _.0, _.1, screen_normal,,, 640, 480 : title "アプリ"
}
return
; 線太さ
; -----------------------------------------------
*L_STROKE_WIDTH
if edit_current < 0 : return
setStrokeWidthOfShape shape(edit_current), stroke_width
return
; 線色
; -----------------------------------------------
*L_STROKE_COLOR
dialog "",33 : if stat {
stroke_color = RGB(ginfo_r, ginfo_g, ginfo_b)
if edit_current >= 0 { setStrokeColorOfShape shape(edit_current), stroke_color }
}
return
; 塗色
; -----------------------------------------------
*L_FILL_COLOR
dialog "",33 : if stat {
fill_color = RGB(ginfo_r, ginfo_g, ginfo_b)
if edit_current >= 0 { setFillColorOfShape shape(edit_current), fill_color }
}
return
; 文字色
; -----------------------------------------------
*L_TEXT_COLOR
dialog "",33 : if stat {
text_color = RGB(ginfo_r, ginfo_g, ginfo_b)
if edit_current >= 0 { setTextColorOfShape shape(edit_current), text_color }
}
return
; 文字入力
; -----------------------------------------------
*L_TEXT_INPUT
if edit_current < 0 : return
setTextOfShape shape(edit_current), text_input, text_align
setTextColorOfShape shape(edit_current), text_color
return
| |
|
2023/12/23(Sat) 20:20:33|NO.100918
あわわわ usagi師匠。。。
本気出しすぎです(*´Д`*)
たるとさん逃げて〜笑
|
|
2023/12/25(Mon) 10:02:05|NO.100922
返答遅くなり申し訳ありません!
回答ありがとうございます!!
>buhio様
前回に引き続きありがとうございます。
146行目!? 本当ですね!消したら見えました!
>フラグ管理でリストビューを更新したほうがいいのではと思いました
やってみます、ありがとうございます!
>usagi様
回答ありがとうございます。
>表示だけの問題ならキャストか書式付にすると良いですよ
表示だけの問題なので修正します!
>1)クリックしない限りは、描画せずに*clicknowに戻ってしまうので処理が進まない問題。
>2)ボタンが表示されていないので、Windowsに処理が戻ってない(waitやstopを挟まず∞ループしている。1が原因)
>3)常にArtlet2Dのスクリーンを初期化してる問題。
最近はじめたばかりなのもあり、色々と思い当たらず指摘いただけて嬉しいです。
私が組み込んだ部分、色々と無駄な感じがしておりました。
>機能足りないですがフローが分かるものを用意しました。
>あくまで参考程度で、一例ですがどうぞ。
えっ……!?こんなに作れるんですね、凄いです!!!
buhio様の師匠……さすがです。
どこで何をしているかが分かりやすいです。(理解できたとは言わない)
選択時の点線枠表示とか、やりたかったものそのもので
書いてないことまで察して入れて頂けて驚きました。
コードの流れを追って参考にさせていただき、見やすいコードを心がけ
良いものが作れるよう頑張ります!
お二方、ありがとうございました!!
また何かあれば相談させてください。本当にありがとうございます!
|
|
2023/12/25(Mon) 12:29:26|NO.100923
>buhioさん
ふふふ、将来有望な方を見るとつい気合が入ってしまって。。。汗
(たるとさんの文体的に目的意識と対応への柔軟性がある方だなぁと)
あと、書いてて面白くなってしまいました。
>たるとさん
>コードの流れを追って参考
そう、それ! 伝えたかったのは流れです。
全部理解する必要はないのですから全体感を見渡してみて、
自分にあった参考になりそうな所を、都合よく取り入れて頂けたら嬉しいです。
考え方は色々ですからね。
ツールなどは複雑になりやすいので、一気にまとめて書くより、
少し手間かかりますが入力と出力の状態を分けて考えると、
保守管理がしやすいと思いました。(何もしない処理も、処理ですし)
やはり察し力が高いですね。
>点線枠表示
HSPの標準描画の中身はGDIと言うのを使っているのですが、
簡単に使えるよう機能が"厳選"されてます。
今回拡張できるよう直接GDIを呼び出しました。
(スクリプト最初の余計な部分)
Artlet2DはGDI++というより多機能で高度なものを、
簡単に使えるようにしてくれている物ですから、
buhioさんがおすすめされたように、それを使うのが簡単だと思います。
|
|