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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0114
オレンジD&Dで画像を動かしたい14解決


オレンジ

リンク

2013/1/14(Mon) 10:46:44|NO.51863

いつもお世話になっております

ドラッグ&ドロップで画像を動かすにはどう書けばできますでしょうか?

やりたい事は

1)HSPでフォルダ内の画像をサムネイルで一覧表示する
■A001.JPG
▲A002.JPG
□A003.JPG

2)D&Dで画像を移動
□A003.JPG
▲A002.JPG
■A001.JPG

3)最後にはその順番でリネームする
※リネームすることはできます。

画像は約10〜15枚ぐらいです

サンプルを探しても見つかりませんでした。

アドバイス、サンプルを教えていただけないでしょうか?

どうぞよろしくお願いいたしますm(_ _)m



この記事に返信する


@key

リンク

2013/1/14(Mon) 11:07:01|NO.51864

普通にリストボックス作って下に「対象を下に移動」「対象を上に移動」ボタン、
右にプレビューを置くのが一番


サムネイルでエクスプローラーのように移動は出来ないこともないですが、
少し凝ったゲームのシステムを作るより難しいです
自分で作れず他人のソースを流用したいと思うなら上記の方法にしてください


D&Dのところを自分が作るとすれば
・順番等を記録する文字列配列
・配列の指定した範囲を上下に一つシフトさせる自作命令
・サムネイル一覧の表示部分 自動で縮小処理も行う
・サムネイル一覧のマウス当たり判定取得構文 縮小に沿った当たり判定の取得が必要
・ドラッグを検出し挿入する位置の目安として線分を描画、ドロップ時に配列シフト命令を呼び出す所
・サムネイル一覧が長くなる場合、スクロールバーを自作 マウス当たり判定、ドラッグ判定もそれによって変化
・ドラッグ中の画像を半透明表示
を作ります
WinAPIを使う方法もありますがそれは不具合の修正もめんどくさくて結果上の方法よりめんどくさくなります



オレンジ

リンク

2013/1/14(Mon) 19:41:09|NO.51881

@key様

こんばんは、いつもお世話になっております

詳しいアドバイスをどうもありがとうございます

D&D版はやはりいきなりは難しそうなので、
まずはリストボックス版から作ってみたいと思います。

今後ともどうぞよろしくお願いいたしますm(_ _)m



オレンジ

リンク

2013/1/14(Mon) 21:11:31|NO.51883

こんばんは、いつもお世話になっております

@key様のアドバイスのように
まずはサンプルでリストボックスの入れ替えを試しているのですが

入れ替えしたリストボックスの内容を出力するにはどうしたら良いでしょうか?

アドバイスの方どうぞよろしくお願いいたします。


; 項目文字列取得用に確保 sdim listbox_text pos 50, 50 objsize 150 filelist="1. A001.JPG\n2. A002.JPG\n3. A003.JPG\n4. A004.JPG\n5. A005.JPG" listbox a, 100, filelist hListbox = objinfo(stat, 2) pos 200, 65 button "上へ", *listup button "下へ", *listdown button "保存", *save stop ; 上方向に入れ替え *listup ; 選択項目のインデックス番号取得 (LB_GETCURSEL) sendmsg hListbox, $188 if stat = 0 : stop ; 選択項目が先頭だった場合 index = stat ; 選択項目の文字列取得 (LB_GETTEXT) sendmsg hListbox, $189, index, varptr(listbox_text) ; 選択項目の削除 (LB_DELETESTRING) sendmsg hListbox, $182, index ; 選択項目の1つ上に取得した文字列を挿入 (LB_INSERTSTRING) sendmsg hListbox, $181, index - 1, listbox_text ; 項目の選択 (LB_SETCURSEL) ; 第3パラのwparam値にインデックス番号を指定 sendmsg hListbox, $186, index - 1 // objprm 0, index - 1 mes listbox_text stop ; 下方向に入れ替え *listdown sendmsg hListbox, $188 if stat = 4 : stop ; 選択項目が最後部だった場合 index = stat sendmsg hListbox, $189, index, varptr(listbox_text) sendmsg hListbox, $182, index ; 選択項目の1つ下に取得した文字列を sendmsg hListbox, $181, index + 1, listbox_text sendmsg hListbox, $186, index + 1 // objprm 0, index + 1 mes listbox_text stop //保存 *save // notesel buf // notesave "hoge.txt" // mes buf stop



ppr

リンク

2013/1/14(Mon) 21:16:37|NO.51884

ドラックドロップでファイル名を取得するということでしょうか。
http://hspnext.com/hspkura/hspkura02.htm#contents14
画像の表示等は標準コードでも出来ると思います。



暇人

リンク

2013/1/14(Mon) 21:31:59|NO.51885

repeat使って

sendmsg hListbox, $189, cnt, varptr(listbox_text)
みたいに順に取得してやればいんじゃない?



@key

リンク

2013/1/14(Mon) 21:32:16|NO.51886

WinAPIを使ったリスト内のドラッグ&ドロップのサンプルがありました

http://lhsp.s206.xrea.com/hsp_object4.html#9

順番の取得に関してはわかりません・・・
すいませんが、他の人任せってことで・・・



オレンジ

リンク

2013/1/14(Mon) 23:03:39|NO.51888

ppr様
アドバイスありがとうございます、あとで試してみます。

暇人様
アドバイスありがとうございます。
下記のようにすると、リストボックスのデータを抜くことができました。
どうもありがとうございました。

//保存
*save

repeat 5
mes "GGGG"+cnt
sendmsg hListbox, $189, cnt, varptr(listbox_text)
mes listbox_text
loop
stop

@key様
アドバイスありがとうございます
D&Dリストボックスのサンプルありがとうございます。
理想の形ですね^^)/早速、改造してみますね。

上記と同じようにlistbox_textデータを抜こうとしても、一行分しか取り出せませんでした。
こちらはどうしたら良いでしょうか?

どうかアドバイスをお願いします。


; Win32API関数 #uselib "user32" #cfunc RegisterWindowMessage "RegisterWindowMessageA" str #uselib "comctl32" #func MakeDragList "MakeDragList" int #cfunc LBItemFromPt "LBItemFromPt" int, int, int, int #func DrawInsert "DrawInsert" int, int, int ; マクロ #define DRAGLISTMSGSTRING "commctrl_draglistmsg" #define DL_BEGINDRAG $485 #define DL_DRAGGING $486 #define DL_DROPPED $487 #define DL_CANCELDRAG $488 #define DL_CURSORSET 0 #define DL_STOPCURSOR 1 #define DL_COPYCURSOR 2 #define DL_MOVECURSOR 3 ; メイン oncmd gosub, *draglistmsg, RegisterWindowMessage (DRAGLISTMSGSTRING) ; 項目文字列取得用変数 sdim listbox_text objsize 100 pos 20, 20 listbox a, , "1. ナイル川\n2. アマゾン川\n3. 黄河\n4. セーヌ川\n5. 信濃川" ; ドラッグリストボックス化 MakeDragList objinfo (stat, 2) pos 200, 65 button "保存", *save stop ; DRAGLISTMSGSTRING *draglistmsg ; DRAGLISTINFO構造体 ; DRAGLISTINFO.0 = 通知メッセージ ; DRAGLISTINFO.1 = リストボックスのハンドル ; DRAGLISTINFO.2 & .3 = カーソル位置 dupptr DRAGLISTINFO, lparam, 16 ; ドラッグ開始時 if DRAGLISTINFO.0 = DL_BEGINDRAG { ; ドラッグする項目インデックス取得 dragindex = LBItemFromPt (DRAGLISTINFO.1, DRAGLISTINFO.2, DRAGLISTINFO.3, ) return 1 } ; ドラッグ中 if DRAGLISTINFO.0 = DL_DRAGGING { ; ドラッグ途中の項目インデックス取得 newindex = LBItemFromPt (DRAGLISTINFO.1, DRAGLISTINFO.2, DRAGLISTINFO.3, 1) if newindex = -1 : return DL_STOPCURSOR ; ドラッグ目印表示 DrawInsert hwnd, DRAGLISTINFO.1, newindex return DL_MOVECURSOR } ; ドロップ後 (ドラッグ終了) if DRAGLISTINFO.0 = DL_DROPPED { ; 新たな位置となる項目インデックス取得 newindex = LBItemFromPt (DRAGLISTINFO.1, DRAGLISTINFO.2, DRAGLISTINFO.3, ) if newindex != -1 { ; LB_GETTEXT sendmsg DRAGLISTINFO.1, $189, dragindex, varptr (listbox_text) ; LB_DELETESTRING sendmsg DRAGLISTINFO.1, $182, dragindex ; LB_INSERTSTRING sendmsg DRAGLISTINFO.1, $181, newindex, listbox_text ; LB_SETCURSEL sendmsg DRAGLISTINFO.1, $186, newindex } ; ドラッグ目印消去 DrawInsert hwnd, DRAGLISTINFO.1, -1 return } ; ドラッグキャンセル if DRAGLISTINFO.0 = DL_CANCELDRAG { ; ドラッグ目印消去 DrawInsert hwnd, DRAGLISTINFO.1, -1 return } return *save repeat 5 sendmsg DRAGLISTINFO, $189, dragindex, varptr (listbox_text) // sendmsg DRAGLISTINFO.1, $189, dragindex, varptr (listbox_text)にするとエラーになる mes listbox_text loop stop



暇人

リンク

2013/1/15(Tue) 00:31:24|NO.51894


repeat 5 sendmsg objinfo (0, 2), $189, cnt, varptr (listbox_text) mes listbox_text loop
objinfo(0, 2)の0は最初に配置したlistboxのID

DRAGLISTINFOは*draglistmsg(割り込み)内で有効
割り込み中なら

sendmsg DRAGLISTINFO.1, $189,cnt, varptr (listbox_text)
でも良い



いひ

リンク

2013/1/15(Tue) 09:27:38|NO.51896

こんなのでどうでしょうか


////////////////////////////////////////////////////////// // // 左クリック D&D で 移動 // 右クリック D&D で 入れ替え // キーボードの 方向キーでスクロール // ////////////////////////////////////////////////////////// #const THUMBNAIL_SIZE 64 // サムネイルのサイズ #const NOTRIGGERKEY 256|512|2|8 // イメージデータ構造体の代わり TotalShowImg=10 repeat TotalShowImg FileName.cnt=strf("img(%d).bmp",cnt) // ファイル名 Order.cnt = cnt // 表示順序 loop // 重要変数 Before = -1 // 現在選択されているか否かを兼ねた、選択されている位置 After =0 // 移動先の値が代入される // サイズ変更を確認するため WindowID 1 以降を使用 screen 1,ginfo_dispx,limit(TotalShowImg*THUMBNAIL_SIZE,ginfo_dispy,0x7FFFFFFF),0,,,640,480 // メインルーチン font msGothic,32,2 *@ stick key,NOTRIGGERKEY // アイテムデータ並び替え処理 if((key&256/*左クリック*/)!=0 or (key&512/*右クリック*/)!=0){ // move if(Before==-1){ // クリックした際に、その下に有る順序番号をロックする。 if((mousey+ginfo_vy)<=(TotalShowImg*THUMBNAIL_SIZE)) { Before = CalcImgOrder() kInput = key }else{ Before=-2 // 表示範囲外をKeyDownした場合 KeyUp 動作を無効化するためのフラグ } } }else{ if(Before>=0){ After = Limit_ShowImageTotal(CalcImgOrder()) if(kInput==256){ // move 処理 stock=Order.Before memcpy Order.Before,Order.Limit_ShowImageTotal(Before+1),((TotalShowImg-Before-1)*4) memcpy Order.Limit_ShowImageTotal(After+1),Order.After,((TotalShowImg-After-1)*4) Order.After = stock }else:if(kInput==512){ // swap 処理 stock=Order.Before Order.Before=Order.After Order.After=stock } } Before=-1 } // アイテムリストスクロール処理 wl=mousew if(wl!=0 or (key&0b1010)!=0){ if(wl&0x80000000)!=0 or (key&8)!=0 { wl=THUMBNAIL_SIZE }else:if(wl&0x80000000)==0 or (key&2)!=0{ wl=-THUMBNAIL_SIZE } groll 0,limit(ginfo_vy+wl*2,0,TotalShowImg*THUMBNAIL_SIZE-ginfo_winy) } redraw 0 color 255,255,255:boxf repeat TotalShowImg pt = cnt*THUMBNAIL_SIZE // アイテム背景塗りつぶし hsvcolor Order(cnt)*20,255,255 boxf 0,pt,ginfo_winx,pt+THUMBNAIL_SIZE // カーソルを描画 if(Before>=0){ // ロックされたアイテムを強調 ptm = (Before*THUMBNAIL_SIZE) if(ptm==pt){ hsvcolor i,255,180 DrawFrame 5,0,ptm,ginfo_winx,ptm+THUMBNAIL_SIZE } // 移動先を示すカーソルを強調 ptm=Limit_ShowImageTotal(CalcImgOrder())*THUMBNAIL_SIZE if(ptm==pt){ hsvcolor i,255,255 DrawFrame 2,0,ptm,ginfo_winx,ptm+THUMBNAIL_SIZE } i+=20 } // アイテム情報を描画 pos 0,pt:color:mes FileName(Order.cnt) // サムネイルを描画するルーチンを挟む loop redraw await 30 goto*@b // 現在のマウス座標から、順序ID を取得 #defcfunc CalcImgOrder return ((mousey+ginfo_vy)/THUMBNAIL_SIZE) // 選択されている色で、枠を描画する。 #deffunc DrawFrame int l_ , int px_ , int py_ , int px2_ , int py2_ repeat l_ line px_,py_+cnt,px2_,py_+cnt line px2_-cnt,py_,px2_-cnt,py2_ line px2_,py2_-cnt,px_,py2_-cnt line px_+cnt,py2_,px_+cnt,py_ loop return // 表示されているイメージを適切な範囲に丸める。 #defcfunc Limit_ShowImageTotal int val_ return limit(val_,0,TotalShowImg-1)



オレンジ

リンク

2013/1/15(Tue) 20:55:17|NO.51901

暇人様

アドバイスどうもありがとうございます。
ちゃんと出力できるようになりましたm(_ _)m

いひ様
アドバイスどうもありがとうございます。
また、すばらしいサンプルをありがとうございますm(_ _)m
まだ使ったことのない命令が多くて、戸惑っておりますが勉強したいと思います。

質問ですが、
画像フォルダを指定するのと、並び替えた画像ファイル名を出力するにはどうしたらよいでしょうか?

最終的には並び替えた順番に、001.JPG 002.JPGとリネームしたいと思います。

どうぞよろしくお願いします



暇人

リンク

2013/1/15(Tue) 21:14:53|NO.51902

>画像フォルダを指定するのと
ディレクトリ移動

chdir "dirname"

"dirname" : 移動先ディレクトリ名

>並び替えた画像ファイル名を出力するにはどうしたらよいでしょうか?
出力って?



いひ

リンク

2013/1/16(Wed) 02:02:14|NO.51906

フォルダ選択ダイアログ hsp で wab 検索してみてください。
目的の情報に行きつくはずです。

こちらのリンクがお勧め。
http://hspnext.com/hspkura/hspkura06.htm



いひ

リンク

2013/1/16(Wed) 02:05:57|NO.51907

ファイル名変更 hsp 等で検索すると、ファイルのリネームの方法が見つかります。

http://lhsp.s206.xrea.com/hsp_file.html#8
こちらのリンクはファイル名を変更するサンプルが有ります。

どちらも参考になる素晴らしいサイトだと思います。



オレンジ

リンク

2013/1/16(Wed) 04:53:17|NO.51908

暇人様

無事できるようになりました。
出力はリネーム用でしたが、そちらもOKでした。
ありがとうございました。

いひ様
いろいろとアドバイスをありがとうございます
ご紹介頂いたHPを見て色々と触ってみます。

今後ともどうぞよろしくお願いいたします。
今後ともどうぞよろしくお願いいたします。



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