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


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
1222
たると同じラベルで更新するリストビューは見えるのに、図形や画像が見えない6解決


たると

リンク

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



この記事に返信する


buhio

リンク

2023/12/22(Fri) 19:04:27|NO.100906

>>・1回画面をクリックしないと、画像と図形(□)が表示されない
 goto *clicknowで飛ばしているはずだけど表示されない。
 リストビューには表示されている為、画面上に表示されないだけ?


goto *clickwait;←146行目 これがダメな希ガス⇒削除

>>・頂いたソースコードを改変して積み上げていっているため、自分で新たに作った「#modfunc create」や、情報取得のためだけに作った「#modcfunc get_left」などが良いのかどうか分からないです。 あまり良くない作りだったりしますでしょうか?

 そこはいいのではないでしょうか。

>>追伸

 リストビューがチラつきますが、おそらく毎フレームで全削除して全追加しているためかなと思います。
図形を移動完了した時、サイズ変更完了した時など、フラグ管理でリストビューを更新したほうがいいのではと思いました🐷



usagi

リンク

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 ; ★ここで処理が止まってしまう。 }



usagi

リンク

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



buhio

リンク

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様の師匠……さすがです。
 どこで何をしているかが分かりやすいです。(理解できたとは言わない)
 
 選択時の点線枠表示とか、やりたかったものそのもので
 書いてないことまで察して入れて頂けて驚きました。

 コードの流れを追って参考にさせていただき、見やすいコードを心がけ
 良いものが作れるよう頑張ります!

お二方、ありがとうございました!!
また何かあれば相談させてください。本当にありがとうございます!



usagi

リンク

2023/12/25(Mon) 12:29:26|NO.100923

>buhioさん
ふふふ、将来有望な方を見るとつい気合が入ってしまって。。。汗
(たるとさんの文体的に目的意識と対応への柔軟性がある方だなぁと)
あと、書いてて面白くなってしまいました。


>たるとさん

>コードの流れを追って参考
そう、それ! 伝えたかったのは流れです。

全部理解する必要はないのですから全体感を見渡してみて、
自分にあった参考になりそうな所を、都合よく取り入れて頂けたら嬉しいです。
考え方は色々ですからね。

ツールなどは複雑になりやすいので、一気にまとめて書くより、
少し手間かかりますが入力と出力の状態を分けて考えると、
保守管理がしやすいと思いました。(何もしない処理も、処理ですし)

やはり察し力が高いですね。

>点線枠表示
HSPの標準描画の中身はGDIと言うのを使っているのですが、
簡単に使えるよう機能が"厳選"されてます。
今回拡張できるよう直接GDIを呼び出しました。
(スクリプト最初の余計な部分)

Artlet2DはGDI++というより多機能で高度なものを、
簡単に使えるようにしてくれている物ですから、
buhioさんがおすすめされたように、それを使うのが簡単だと思います。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.100905への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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